调试环境:万利STM32-E板 4G卡,使用 um0427文档的参考代码: sdcard.c V2.0.3 09/22/2008 MCD Application Team SDIO 模式是 4bits DMA模式;
1. 连续多扇区写的时候遇到下列问题:
如果使用SD_WriteMultiBlocks 会发生死机 如果使用SD_ReadMultiBlocks 后在使用如果使用SD_WriteMultiBlocks 就会Ok 我是利用 um0427文档的 Sample 试验的
... ...
/*------------------- Block Erase -------------------------------*/ if (Status == SD_OK) { /* Erase NumberOfBlocks Blocks of WRITE_BL_LEN(512 Bytes) */ Status = SD_Erase(0x00, (BlockSize0 * NumberOfBlocks)); }
/* Set Device Transfer Mode to DMA */ if (Status == SD_OK) { Status = SD_SetDeviceMode(SD_DMA_MODE); }
if (Status == SD_OK) { Status = SD_ReadMultiBlocks (8000*512, Buffer_MultiBlock_Rx, BlockSize0, NumberOfBlocks); // A Status = SD_WriteMultiBlocks(8000*512, Buffer_MultiBlock_Rx, BlockSize0, NumberOfBlocks); // B } // BlockSize0=512; NumberOfBlocks=2; ... ...
注意:如果去掉A语句,则B语句死机。AB同在运行不死;
死机发生在DMA传送过程:
DMA_TxConfiguration(writebuff, (NumberOfBlocks * BlockSize)); while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) {} // 死循环
2. 该sdcard.c 对大容量SD卡的支持不够; 看其中的函数调用 SD_Error SD_ReadBlock(u32 addr, u32 *readbuff, u16 BlockSize); 其中的addr是在字节访问SD卡中的数据地址,显然当SD卡的容量大于4G的时候,addr是越界的。 我将对此修改为SectAddr(扇区地址)。sdcard.c 中有很多类似的问题。
3. 在SD操作的时候CPU只能查询等待操作完成,效率有些低。 比如全片的擦除需要8秒,如何在此期间让CPU干点别的?如何修改代吗呢?
|