SDIO最主要是驱动TF卡,当然也可以驱动一些网卡,但是最常用的还是驱动TF卡了,而且TF卡协议比较统一,说起来也有参照,SD卡的驱动,可以有点拿来主义,从ST的官网就可以下载.但是,这个驱动有个BUG,虽然他有SDHC的判断部分,但是容量计算,还是出了点问题.首先需要修改头文件的结构体:
typedef struct { SD_CSD SD_csd; SD_CID SD_cid; uint32_t CardCapacity; /* Card Capacity */ uint32_t CardBlockSize; /* Card Block Size */ uint16_t RCA; uint8_t CardType; } SD_CardInfo;
如果大于4G的卡,CardCapacity就会溢出,所以改类型为uint64_t.
NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
另外要如上打开SDIO的事务中断,这样才好调用SD_ProcessIRQSrc处理数据,无论是DMA还是INT都需要.DMA是否还能获得更好的速度了.另外列举一下SDCard的函数:
SD_Error SD_Init(void); SD_Error SD_PowerON(void); SD_Error SD_PowerOFF(void); SD_Error SD_InitializeCards(void); SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo); SD_Error SD_EnableWideBusOperation(uint32_t WideMode); SD_Error SD_SetDeviceMode(uint32_t Mode); SD_Error SD_SelectDeselect(uint32_t addr); SD_Error SD_ReadBlock(uint32_t addr, uint32_t *readbuff, uint16_t BlockSize); SD_Error SD_ReadMultiBlocks(uint32_t addr, uint32_t *readbuff, uint16_t BlockSize, uint32_t NumberOfBlocks); SD_Error SD_WriteBlock(uint32_t addr, uint32_t *writebuff, uint16_t BlockSize); SD_Error SD_WriteMultiBlocks(uint32_t addr, uint32_t *writebuff, uint16_t BlockSize, uint32_t NumberOfBlocks); SDTransferState SD_GetTransferState(void); SD_Error SD_StopTransfer(void); SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr); SD_Error SD_SendStatus(uint32_t *pcardstatus); SD_Error SD_SendSDStatus(uint32_t *psdstatus); SD_Error SD_ProcessIRQSrc(void);
测试流程也很简单,无非是读读写写,把重点测试片选拿出来,代码下载:SDIO无文件系统测试
如果把8G的TF卡随便写写块,管理起来是非常费劲的,所以有了文件系统,有了文件系统各种事情就好办了,于是需要移植FATFS呢.这样就可以管理文件.其中需要修改的有diskio.c而已,所以一点都不复杂的.其中里面也就6个函数,包括disk_initialize用于填SD卡初始化,以及检查卡的情况.而disk_status检查磁盘状态,一般对于我们TF卡可以直接返回0,disk_read和disk_write就是读写了,其实就是转换函数为SD_WriteBlock,SD_WriteMultiBlocks,SD_ReadBlock,SD_ReadMultiBlocks即可.get_fattime要获得一个文件的时间,当然对于有RTC来说,这是非常方便的,但是如果没有RTC,就只能return 0或者...其他什么呢.最复杂的函数disk_ioctl,里面需要,其中CTRL_SYNC就是获取是否有数据在做,可以通过SD_GetTransferState获取,而GET_BLOCK_SIZE和GET_SECTOR_COUNT也并非难事.移植参考源码[基于FAT 0.11A]:SDIO_FATFS测试
我你们新建了文件,写了一些东西,一些长文件名和短文件名.各截取部分,用来显示.运行测试截图: