|
谢谢香版,我初始化应该是没问题的
我依次执行 Status = SD_Init(); Status = SD_GetCardInfo(&SDCardInfo); Status = SD_SelectDeselect((u32) (SDCardInfo.RCA << 16)); Status = SD_EnableWideBusOperation(SDIO_BusWide_4b); Status = SD_SetDeviceMode(SD_POLLING_MODE); 以上各步骤状态返回都是SD_OK,并且读出的SDCardInfo中的CSD, CID, 容量等信息都是正常的的,SDIO->CLKCR中也是4BIT设置,然后执行 Status = SD_ReadBlock(0X00, Buffer_Block_Rx, BlockSize); 就是返回SD_RX_OVERRUN, readblock函数中有这样的一段 /* Polling mode */ while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))) { if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET) { for (count = 0; count < 8; count++) { *(tempbuff + count) = SDIO_ReadData(); } tempbuff += 8; } } 感觉似乎是4BIT方式下FIFO涌入的数据太快,来不及及时从FIFO中读出,因此导致溢出,而1BIT方式下速度就没问题了。晚上又仔细翻阅了参考手册,发现SDIO中还有个硬件流控的功能,当即将溢出的时候,控制器会停止SDIO_CK,并冻结状态机,试验了一下果然SDIO_FLAG_RXOVERR的标志果然不再置位,流控起作用了,能够读出128个32BIT数据。然而新的问题又出现了,这次是SDIO_FLAG_DCRCFAIL又置位了,数据CRC错误。 又继续试验,把加的流控去掉并把之前的修改还原,由于是怀疑4BIT方式下速度太快导致FIFO来不及读出,所以我把SDIO时钟从原先默认的24MHZ降到了12MHZ甚至更低,果然这下FIFO读取不再溢出了,不过函数返回的都是SD_DATA_CRC_FAIL数据CRC错误! 经过晚上的试验,看来在SDIO时钟较高的情况下FIFO溢出的问题可以通过降低时钟频率或者是开启硬件流控来解决。但现在情况是这个数据CRC错误是怎么回事呢?继续抓狂中。。。 |
|