STM32F4-DISCO 学习之 SDIO

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测试

我你们新建了文件,写了一些东西,一些长文件名和短文件名.各截取部分,用来显示.运行测试截图:

QQ截图20150917154839

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注