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. | |
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. | |
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. | |
uint64_t | sdcard_spi_get_capacity (sdcard_spi_t *card) |
Gets the capacity of the card. | |
#define SD_HC_BLOCK_SIZE (512) |
size of a single block on SDHC cards
Definition at line 33 of file sdcard_spi.h.
#define SD_SIZE_OF_OID 2 |
OID (OEM/application ID field in CID reg)
Definition at line 37 of file sdcard_spi.h.
#define SD_SIZE_OF_PNM 5 |
PNM (product name field in CID reg)
Definition at line 38 of file sdcard_spi.h.
#define SDCARD_SPI_INIT_ERROR (-1) |
returned on failed init
Definition at line 34 of file sdcard_spi.h.
#define SDCARD_SPI_OK (0) |
returned on successful init
Definition at line 35 of file sdcard_spi.h.
enum sd_rw_response_t |
sdcard_spi r/w-operation return values
Definition at line 162 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 152 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). |