SDIO卡stm32CubeMX设置
要设置流控制,才可用。
//判断SD卡是否可以传输(读写)数据
//返回值:SD_TRANSFER_OK 传输完成,可以继续下一次传输
// SD_TRANSFER_BUSY SD卡正忙,不可以进行下一次传输
uint8_t SD_GetCardState(void)
{
return((HAL_SD_GetCardState(&hsd)==HAL_SD_CARD_TRANSFER )?SD_TRANSFER_OK:SD_TRANSFER_BUSY);
}
//读SD卡
//buf:读数据缓存区
//sector:扇区地址
//cnt:扇区个数
//返回值:错误状态;0,正常;其他,错误代码;
uint8_t SD_ReadDisk(uint8_t* buf,uint32_t sector,uint32_t cnt)
{
uint8_t sta=HAL_OK;
uint32_t timeout=SD_TIMEOUT;
long long lsector=sector;
//INTX_DISABLE();//关闭总中断(POLLING模式,严禁中断打断SDIO读写操作!!!)
__ASM volatile(“cpsid i”);
sta=HAL_SD_ReadBlocks(&hsd, (uint8_t*)buf,lsector,cnt,SD_TIMEOUT);//多个sector的读操作
//等待SD卡读完
while(SD_GetCardState()!=SD_TRANSFER_OK)
{
if(timeout-- == 0)
{
sta=SD_TRANSFER_BUSY;
}
}
//INTX_ENABLE();//开启总中断
__ASM volatile("cpsie i");
return sta;
}
//写SD卡
//buf:写数据缓存区
//sector:扇区地址
//cnt:扇区个数
//返回值:错误状态;0,正常;其他,错误代码;
uint8_t SD_WriteDisk(uint8_t buf,uint32_t sector,uint32_t cnt)
{
uint8_t sta=HAL_OK;
uint32_t timeout=SD_TIMEOUT;
long long lsector=sector;
//INTX_DISABLE();//关闭总中断(POLLING模式,严禁中断打断SDIO读写操作!!!)
__ASM volatile(“cpsid i”);
sta=HAL_SD_WriteBlocks(&hsd,(uint8_t)buf,lsector,cnt,SD_TIMEOUT);//多个sector的写操作
//等待SD卡写完
while(SD_GetCardState()!=SD_TRANSFER_OK)
{
if(timeout-- == 0)
{
sta=SD_TRANSFER_BUSY;
}
}
//INTX_ENABLE();//开启总中断
__ASM volatile("cpsie i");
return sta;
}