代码分享,stm32f407的sdio驱动。

发布于 2014-11-27 20:06:38    浏览:3323
做文件系统的时候下载了ST的SDIO驱动,感觉不是很好用,后来又在网上找了一份注释非常全的,并且对卡的兼容性也很好,然后又在这个基础上做了些修改,现在分享给各位。
几点说明:
1,官方的程序读写SD全是以字节寻址,既然用了SD卡就要用文件系统,用文件系统都是以扇区寻址,所以官方的程序这点不太合理,以字节寻址32位地址也只能支持4G以下的卡。所以在原来的程序中增加了两个函数:
SD_Error SD_LBA_ReadBlocks(uint8_t *readbuff, uint32_t BlockAddr, uint32_t NumberOfBlocks);
SD_Error SD_LBA_WriteBlocks(uint8_t *writebuff, uint32_t BlockAddr, uint32_t NumberOfBlocks);

实际应用中,直接使用这两个函数即可,可以不必去区分是SingleBlock还是MultiBlocks。
2,上面两个函数向SD发送命令没用用官方的命令函数,这个问题处理的比较直接,所以上面的函数效率很不错,assert_param也是没有的,所以尽量保证你的程序其它地方没有问题了再使用这两个函数比较好。
3,对于从SD卡中读到的数据,不可能总是以32位的方式来处理,以字节方式处理的情况恐怕还多一些,可官方和程序却不理会这个实际应用中的问题,全部以WORD方来对齐,所于DMA读写处又做了如下修改:
/*DMA_InitStructure.DMA_BufferSize = BufferSize / 4;*/
DMA_InitStructure.DMA_BufferSize = BufferSize;
/*DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

注释掉的是原官方的,下面是修改后的。这样修改后,在处理数据时,就不用再考虑必须以WORD对齐的问题。
同样对于DMATX也是要按照上面的方式修改。
完整版的程序在这里

查看更多

5 个回答
HVVJ_8045
HVVJ_8045 2020-07-22
This guy hasn't written anything yet

您好,程序在哪里呢。

aozima
aozima 2014-11-27
拒绝白嫖,拒绝键盘侠!
外设是32位的,改成字节真的不会有问题?很神奇!
dzahz
dzahz 2014-11-27
This guy hasn't written anything yet
这个是测试过的,确实没有问题,自己也做了音频播放的实验,mp3,flac播放都很正常,如果是WORD对齐方式,那么播放FLAC就必须另外处理非WORD对齐的问题。
这个程序对卡的兼容性表现也不错,我手上有各种容量品牌的卡总共6种都能正常初始化,读0扇区的测试也能通过。就是一个张不知名口品牌的2G卡,挂载文件系统不成功,还没去研究为什么。其它的都正常。
Mr.Ray
Mr.Ray 2016-01-13
This guy hasn't written anything yet
成功挂载2G 内存卡 谢谢!
Tianqf
Tianqf 2018-01-18
This guy hasn't written anything yet
大神求指教,这个怎么用啊。。。

撰写答案

请登录后再发布答案,点击登录
关注者
1
被浏览
3.3k

发布
问题

分享
好友

手机
浏览

扫码手机浏览