Driver for reading and writing SD Cards using the SPI. More...
Driver for reading and writing SD Cards using the SPI.
Files | |
| file | sdcard_spi.h | 
| Public interface for the sdcard_spi driver.  | |
| file | sdcard_spi_internal.h | 
| Interface for issuing commands on sd-cards via SPI.  | |
| file | sdcard_spi_params.h | 
| Default parameters for sdcard_spi driver.  | |
Data Structures | |
| struct | cid_t | 
| CID register see section 5.2 in SD-Spec v5.00.  More... | |
| struct | csd_v1_t | 
| CSD register with csd structure version 1.0 see section 5.3.2 in SD-Spec v5.00.  More... | |
| struct | csd_v2_t | 
| CSD register with csd structure version 2.0 see section 5.3.3 in SD-Spec v5.00.  More... | |
| union | csd_t | 
| CSD register (see section 5.3 in SD-Spec v5.00)  More... | |
| struct | sd_status_t | 
| SD status register (see section 4.10.2 in SD-Spec v5.00)  More... | |
| struct | sdcard_spi_params_t | 
| sdcard_spi device params  More... | |
| struct | sdcard_spi_t | 
| Device descriptor for sdcard_spi.  More... | |
Macros | |
| #define | SD_HC_BLOCK_SIZE (512) | 
| size of a single block on SDHC cards  | |
| #define | SDCARD_SPI_INIT_ERROR (-1) | 
| returned on failed init  | |
| #define | SDCARD_SPI_OK (0) | 
| returned on successful init  | |
| #define | SD_SIZE_OF_OID 2 | 
| OID (OEM/application ID field in CID reg)  | |
| #define | SD_SIZE_OF_PNM 5 | 
| PNM (product name field in CID reg)  | |
Enumerations | |
| enum | sd_version_t { SD_V2 , SD_V1 , MMC_V3 , SD_UNKNOWN } | 
| version type of SD-card  More... | |
| enum | sd_rw_response_t {  SD_RW_OK = 0 , SD_RW_NO_TOKEN , SD_RW_TIMEOUT , SD_RW_RX_TX_ERROR , SD_RW_WRITE_ERROR , SD_RW_CRC_MISMATCH , SD_RW_NOT_SUPPORTED }  | 
| sdcard_spi r/w-operation return values  More... | |
Functions | |
| int | sdcard_spi_init (sdcard_spi_t *card, const sdcard_spi_params_t *params) | 
| Initializes the sd-card with the given parameters in sdcard_spi_t structure.  More... | |
| int | sdcard_spi_read_blocks (sdcard_spi_t *card, uint32_t blockaddr, void *data, uint16_t blocksize, uint16_t nblocks, sd_rw_response_t *state) | 
| Reads data blocks (usually multiples of 512 Bytes) from card to buffer.  More... | |
| int | sdcard_spi_write_blocks (sdcard_spi_t *card, uint32_t blockaddr, const void *data, uint16_t blocksize, uint16_t nblocks, sd_rw_response_t *state) | 
| Writes data blocks (usually multiples of 512 Bytes) from buffer to card.  More... | |
| uint64_t | sdcard_spi_get_capacity (sdcard_spi_t *card) | 
| Gets the capacity of the card.  More... | |
| enum sd_rw_response_t | 
sdcard_spi r/w-operation return values
Definition at line 161 of file sdcard_spi.h.
| enum sd_version_t | 
version type of SD-card
| Enumerator | |
|---|---|
| SD_V2 | SD version 2   | 
| SD_V1 | SD version 1   | 
| MMC_V3 | MMC version 3.  | 
| SD_UNKNOWN | SD-version unknown.  | 
Definition at line 151 of file sdcard_spi.h.
| uint64_t sdcard_spi_get_capacity | ( | sdcard_spi_t * | card | ) | 
Gets the capacity of the card.
| [in] | card | Initialized sd-card struct | 
| int sdcard_spi_init | ( | sdcard_spi_t * | card, | 
| const sdcard_spi_params_t * | params | ||
| ) | 
Initializes the sd-card with the given parameters in sdcard_spi_t structure.
The init procedure also takes care of initializing the spi peripheral to master mode and performing all necessary steps to set the sd-card to spi-mode. Reading the CID and CSD registers is also done within this routine and their values are copied to the given sdcard_spi_t struct.
| [out] | card | the device descriptor | 
| [in] | params | parameters for this device (pins and spi device are initialized by this driver) | 
| int sdcard_spi_read_blocks | ( | sdcard_spi_t * | card, | 
| uint32_t | blockaddr, | ||
| void * | data, | ||
| uint16_t | blocksize, | ||
| uint16_t | nblocks, | ||
| sd_rw_response_t * | state | ||
| ) | 
Reads data blocks (usually multiples of 512 Bytes) from card to buffer.
| [in] | card | Initialized sd-card struct | 
| [in] | blockaddr | Start address to read from. Independent of the actual addressing scheme of the used card the address needs to be given as block address (e.g. 0, 1, 2... NOT: 0, 512... ). The driver takes care of mapping to byte addressing if needed. | 
| [out] | data | Buffer to store the read data in. The user is responsible for providing a suitable buffer size. | 
| [in] | blocksize | Size of data blocks. For now only 512 byte blocks are supported because only older (SDSC) cards support variable blocksizes anyway. With SDHC/SDXC-cards this is always fixed to 512 bytes. SDSC cards are automatically forced to use 512 byte as blocksize by the init procedure. | 
| [in] | nblocks | Number of blocks to read | 
| [out] | state | Contains information about the error state if something went wrong (if return value is lower than nblocks). | 
| int sdcard_spi_write_blocks | ( | sdcard_spi_t * | card, | 
| uint32_t | blockaddr, | ||
| const void * | data, | ||
| uint16_t | blocksize, | ||
| uint16_t | nblocks, | ||
| sd_rw_response_t * | state | ||
| ) | 
Writes data blocks (usually multiples of 512 Bytes) from buffer to card.
| [in] | card | Initialized sd-card struct | 
| [in] | blockaddr | Start address to read from. Independent of the actual addressing scheme of the used card the address needs to be given as block address (e.g. 0, 1, 2... NOT: 0, 512... ). The driver takes care of mapping to byte addressing if needed. | 
| [out] | data | Buffer that contains the data to be sent. | 
| [in] | blocksize | Size of data blocks. For now only 512 byte blocks are supported because only older (SDSC) cards support variable blocksizes anyway. With SDHC/SDXC-cards this is always fixed to 512 bytes. SDSC cards are automatically forced to use 512 byte as blocksize by the init procedure. | 
| [in] | nblocks | Number of blocks to write | 
| [out] | state | Contains information about the error state if something went wrong (if return value is lower than nblocks). |