#define SD_CS_PIN GPIO_Pin_4 /* */ #define SD_CS_LOW GPIOA->BRR = (uint16_t)SD_CS_PIN; #define SD_CS_HIGH GPIOA->BSRR = (uint16_t)SD_CS_PIN; inline __attribute__((__always_inline__)) uint16_t spi_xfer (uint16_t val) { SPI1->DR = val; while ((SPI1->SR & SPI_I2S_FLAG_TXE ) == 0) { /* wait */ }; while ((SPI1->SR & SPI_I2S_FLAG_BSY) != 0) { /* wait */ }; return SPI1->DR; } /* --- spi_transfer --- */ /* ---------------------------- */ /* Receive multiple byte */ /* ---------------------------- */ static void rcvr_spi_multi ( uint8_t *buff, /* Pointer to data buffer */ uint16_t numbytes /* Number of bytes to receive (even number) */ ) { uint16_t ii, dummy; SD_CS_LOW; dummy = 0; ii = 0; do /* Receive data block into buffer */ { *(buff+ii) = spi_xfer(dummy); ii++; } while (numbytes > 0); SD_CS_HIGH; } /* --- rcvr_spi_multi --- */ /* ---------------------------- */ /* Send multiple byte */ /* ---------------------------- */ static void xmit_spi_multi ( uint8_t *buff, /* Pointer to data buffer */ uint16_t numbytes /* Number of bytes to receive (even number) */ ) { uint16_t ii; SD_CS_LOW; ii = 0; do /* send data block into buffer */ { spi_xfer(*(buff+ii)); ii++; } while (numbytes > 0); SD_CS_HIGH; } /* --- xmit_spi_multi --- */