The SDCARD driver provide card initialization/read/write/erase interface.
SD CARD Operation
error log support
Lots of error log has been added to sd relate functions, if error occurs during initial/read/write, please enable the error log print functionality with #define
SDMMC_ENABLE_LOG_PRINT 1 And rerun the project then user can check what kind of error happened.
User configurable
typedef struct _sd_card
{
bool isHostReady;
bool noInteralAlign;
uint32_t busClock_Hz;
uint32_t relativeAddress;
uint32_t version;
uint32_t flags;
uint32_t ocr;
uint32_t blockCount;
uint32_t blockSize;
Part of The variables above is user configurable,
host
Application need to provide host controller base address and the host's source clock frequency, etc. For example:
s_host.dmaDesBuffer = s_sdmmcHostDmaBuffer;
s_host.dmaDesBufferWordsNum = xxx;
((
sd_card_t *)card)->host->hostController.base = BOARD_SDMMC_SD_HOST_BASEADDR;
((
sd_card_t *)card)->host->hostController.sourceClock_Hz = BOARD_USDHC1ClockConfiguration();
((
sd_card_t *)card)->host->hostEvent = &s_event;
- sdcard_usr_param_t usrParam
((
sd_card_t *)card)->usrParam.pwr = BOARD_SDCardPowerControl;
((
sd_card_t *)card)->usrParam.ioStrength = BOARD_SD_Pin_Config;
((
sd_card_t *)card)->usrParam.ioVoltage = &s_ioVoltage;
((
sd_card_t *)card)->usrParam.maxFreq = BOARD_SDMMC_SD_HOST_SUPPORT_SDR104_FREQ;
a. cd-which allow application define the card insert/remove callback function, redefine the card detect timeout ms and also allow application determine how to detect card.
b. pwr-which allow application redefine the card power on/off function.
c. ioStrength-which is used to switch the signal pin configurations include driver strength/speed mode dynamiclly for different timing(SDR/HS timing) mode, reference the function defined sdmmc_config.c
d. ioVoltage-which allow application register io voltage switch function instead of using the function host driver provided for SDR/HS200/HS400 timing.
e. maxFreq-which allow application set the maximum bus clock that the board support.
bool noInteralAlign
Sdmmc include an address align internal buffer(to use host controller internal DMA), to improve read/write performance while application cannot make sure the data address used to read/write is align, set it to true will achieve a better performance.
sd_timing_mode_t currentTiming
It is used to indicate the currentTiming the card is working on, however sdmmc also support preset timing mode, then sdmmc will try to switch to this timing first, if failed, a valid timing will switch to automatically. Generally, user may not set this variable if you don't know what kind of timing the card support, sdmmc will switch to the highest timing which the card support.
sd_driver_strength_t driverStrength
Choose a valid card driver strength if application required and call SD_SetDriverStrength in application.
sd_max_current_t maxCurrent
Choose a valid card current if application required and call SD_SetMaxCurrent in application.
Mutual exclusive access support for RTOS
SDCARD driver has added mutual exclusive access support for init/deinit/write/read/erase function. Please note that the card init function will create the mutex lock dynamically by default, so to avoid the mutex create redundantly, application must follow bellow sequence for card re-initialization
Typical use case
Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/sdmmc_examples/
|
status_t | SD_Init (sd_card_t *card) |
| Initializes the card on a specific host controller. More...
|
|
void | SD_Deinit (sd_card_t *card) |
| Deinitializes the card. More...
|
|
status_t | SD_CardInit (sd_card_t *card) |
| Initializes the card. More...
|
|
void | SD_CardDeinit (sd_card_t *card) |
| Deinitializes the card. More...
|
|
status_t | SD_HostInit (sd_card_t *card) |
| initialize the host. More...
|
|
void | SD_HostDeinit (sd_card_t *card) |
| Deinitializes the host. More...
|
|
void | SD_HostDoReset (sd_card_t *card) |
| reset the host. More...
|
|
void | SD_SetCardPower (sd_card_t *card, bool enable) |
| set card power. More...
|
|
status_t | SD_PollingCardInsert (sd_card_t *card, uint32_t status) |
| sd wait card detect function. More...
|
|
bool | SD_IsCardPresent (sd_card_t *card) |
| sd card present check function. More...
|
|
bool | SD_CheckReadOnly (sd_card_t *card) |
| Checks whether the card is write-protected. More...
|
|
status_t | SD_SelectCard (sd_card_t *card, bool isSelected) |
| Send SELECT_CARD command to set the card to be transfer state or not. More...
|
|
status_t | SD_ReadStatus (sd_card_t *card) |
| Send ACMD13 to get the card current status. More...
|
|
status_t | SD_ReadBlocks (sd_card_t *card, uint8_t *buffer, uint32_t startBlock, uint32_t blockCount) |
| Reads blocks from the specific card. More...
|
|
status_t | SD_WriteBlocks (sd_card_t *card, const uint8_t *buffer, uint32_t startBlock, uint32_t blockCount) |
| Writes blocks of data to the specific card. More...
|
|
status_t | SD_EraseBlocks (sd_card_t *card, uint32_t startBlock, uint32_t blockCount) |
| Erases blocks of the specific card. More...
|
|
status_t | SD_SetDriverStrength (sd_card_t *card, sd_driver_strength_t driverStrength) |
| select card driver strength select card driver strength More...
|
|
status_t | SD_SetMaxCurrent (sd_card_t *card, sd_max_current_t maxCurrent) |
| select max current select max operation current More...
|
|
status_t | SD_PollingCardStatusBusy (sd_card_t *card, uint32_t timeoutMs) |
| Polling card idle status. More...
|
|
Define the card structure including the necessary fields to identify and describe the card.
#define FSL_SD_DRIVER_VERSION (MAKE_VERSION(2U, 4U, 0U)) /*2.4.0*/ |
Enumerator |
---|
kSD_SupportHighCapacityFlag |
Support high capacity.
|
kSD_Support4BitWidthFlag |
Support 4-bit data width.
|
kSD_SupportSdhcFlag |
Card is SDHC.
|
kSD_SupportSdxcFlag |
Card is SDXC.
|
kSD_SupportVoltage180v |
card support 1.8v voltage
|
kSD_SupportSetBlockCountCmd |
card support cmd23 flag
|
kSD_SupportSpeedClassControlCmd |
card support speed class control flag
|
This function initializes the card on a specific host controller, it is consist of host init, card detect, card init function, however user can ignore this high level function, instead of use the low level function, such as SD_CardInit, SD_HostInit, SD_CardDetect.
Thread safe function, please note that the function will create the mutex lock dynamically by default, so to avoid the mutex create redundantly, application must follow bellow sequence for card re-initialization
- Parameters
-
- Return values
-
This function deinitializes the specific card and host. Please note it is a thread safe function.
- Parameters
-
This function initializes the card only, make sure the host is ready when call this function, otherwise it will return kStatus_SDMMC_HostNotReady.
Thread safe function, please note that the function will create the mutex lock dynamically by default, so to avoid the mutex create redundantly, application must follow bellow sequence for card re-initialization
- Parameters
-
- Return values
-
This function deinitializes the specific card. Please note it is a thread safe function.
- Parameters
-
This function deinitializes the specific host.
- Parameters
-
This function deinitializes the host.
- Parameters
-
This function reset the specific host.
- Parameters
-
void SD_SetCardPower |
( |
sd_card_t * |
card, |
|
|
bool |
enable |
|
) |
| |
The power off operation depend on host or the user define power on function.
- Parameters
-
card | card descriptor. |
enable | true is power on, false is power off. |
Detect card through GPIO, CD, DATA3.
- Parameters
-
card | card descriptor. |
status | detect status, kSD_Inserted or kSD_Removed. |
This function checks if the card is write-protected via the CSD register.
- Parameters
-
- Return values
-
true | Card is read only. |
false | Card isn't read only. |
- Parameters
-
card | Card descriptor. |
isSelected | True to set the card into transfer state, false to disselect. |
- Return values
-
status_t SD_ReadBlocks |
( |
sd_card_t * |
card, |
|
|
uint8_t * |
buffer, |
|
|
uint32_t |
startBlock, |
|
|
uint32_t |
blockCount |
|
) |
| |
This function reads blocks from the specific card with default block size defined by the SDHC_CARD_DEFAULT_BLOCK_SIZE.
Please note it is a thread safe function.
- Parameters
-
card | Card descriptor. |
buffer | The buffer to save the data read from card. |
startBlock | The start block index. |
blockCount | The number of blocks to read. |
- Return values
-
status_t SD_WriteBlocks |
( |
sd_card_t * |
card, |
|
|
const uint8_t * |
buffer, |
|
|
uint32_t |
startBlock, |
|
|
uint32_t |
blockCount |
|
) |
| |
This function writes blocks to the specific card with default block size 512 bytes.
Please note,
- It is a thread safe function.
- It is a async write function which means that the card status may still busy after the function return. Application can call function SD_PollingCardStatusBusy to wait card status idle after the write operation.
- Parameters
-
card | Card descriptor. |
buffer | The buffer holding the data to be written to the card. |
startBlock | The start block index. |
blockCount | The number of blocks to write. |
- Return values
-
status_t SD_EraseBlocks |
( |
sd_card_t * |
card, |
|
|
uint32_t |
startBlock, |
|
|
uint32_t |
blockCount |
|
) |
| |
This function erases blocks of the specific card with default block size 512 bytes.
Please note,
- It is a thread safe function.
- It is a async erase function which means that the card status may still busy after the function return. Application can call function SD_PollingCardStatusBusy to wait card status idle after the erase operation.
- Parameters
-
card | Card descriptor. |
startBlock | The start block index. |
blockCount | The number of blocks to erase. |
- Return values
-
- Parameters
-
card | Card descriptor. |
driverStrength | Driver strength |
- Parameters
-
card | Card descriptor. |
maxCurrent | Max current |
This function can be used to polling the status from busy to Idle, the function will return if the card status idle or timeout.
- Parameters
-
card | Card descriptor. |
timeoutMs | polling card status timeout value. |
- Return values
-
kStatus_Success | Operate successfully. |
kStatus_SDMMC_WaitWriteCompleteFailed | CMD13 transfer failed. |
kStatus_SDMMC_PollingCardIdleFailed,polling | card DAT0 idle failed. |