STM32F103xxx的官方SDIO驱动移植,终于搞定了

2019-10-15 20:42发布

最近闲了就玩玩STM32的SDIO驱动去了,小有收获

之前移植的是http://www.openedv.com/posts/list/25845.htm这个版本的,发现bug特多,很不正常的那个,头大

后面移植了官方的V4.5.0这个版本,搞定了,建议大伙们想玩这个的话移植这个靠谱一点,呵呵,不过还是有个bug的,对照SD卡的相关资料也很容易找出来,主要就是在读写block函数里面要设置block大小命令CMD16,要不然很容易死在DMA检测上面(如果用DMA控制传输的话)

呵呵,发此帖庆祝一下,嘿嘿

附件是源代码,学习原子的做法,增加
SD_Error SD_ReadDisk(uint8_t *readbuff, uint32_t sector, uint16_t cnt);    //读取磁盘SD_Error SD_WriteDisk(uint8_t *writebuff, uint32_t sector, uint16_t cnt);    //写入磁盘

这两个函数,方便操作,呵呵


卡结构体中SDCardInfo.CardCapacity(卡的容量单位修改为MB)要想得到字节为单位的请将SDCardInfo.CardCapacity<<20即可















友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
八度空间
1楼-- · 2019-10-17 19:09
回复【10楼】正点原子:
---------------------------------
1、原子哥,战舰测试工程已经整理好上传了,谢谢!
2、不过我发现一个小小的不知道算不算bug的bug,就是在卡上电函数里面发送74个时钟CMD0里面CmdError()这个函数返回SD_CMD_RSP_TIMEOUT超时应答,不过运行多几次即可
3、刚开始的时候出现第2点错误,我在以下这段函数后面加了一句printf打印就可以过了,去掉又不行

        //发送至少74个时钟
for(count = 0;count < 74;count++)
{
/*!< CMD0: GO_IDLE_STATE ---------------------------------------------------*/
/*!< No CMD response required */
SDIO_Send_CMDIndex(SD_CMD_GO_IDLE_STATE, 0, SD_Response_No); //发送CMD0 + 无响应
errorstatus = CmdError();
if(errorstatus != SD_OK) return errorstatus; //操作失败
else break; //操作成功了退出
}
count = 0;
        printf("the res is:%d ", errorstatus);//新加上这句即可完全通过,去掉不行
4、至于原因还没找到在哪里,以原子哥的经验,估计可能出现的问题在哪里或者还有什么不完善的地方呢?
5、这个寄存器版本的是完全按照库函数版本改过来的,库函数版本不存在第3点的问题
正点原子
2楼-- · 2019-10-18 00:08
回复【14楼】Badu_Space:
---------------------------------
谢谢.cool.
这种加printf的,我遇到过几次了.
原因:
1,字节对齐问题.
2,操作不当,没有按要求操作.

具体到你这里,怀疑是不是延时的问题?
库函数因为各个都是函数,一般需要一点时间.
而寄存器,如果全部操作寄存器,不要经过那么多函数调用.
看看是不是操作上面,有没有需要注意时间的.

另外,我们的战舰版本也有SDIO,寄存器版本的,你测试下是否也有这个问题?
八度空间
3楼-- · 2019-10-18 02:21
 精彩回答 2  元偷偷看……
八度空间
4楼-- · 2019-10-18 06:22
回复【15楼】正点原子:
---------------------------------
原子哥,我将你的例程的SDIO寄存器版本驱动代替了我工程的SDIO驱动测试了一下,和我的那个SDIO寄存器版本结果是一摸一样的
八度空间
5楼-- · 2019-10-18 07:45
回复【15楼】正点原子:
---------------------------------
1、原子哥,这个问题搞好了,原来手误写错寄存器了,呵呵。。。刚开始的版本读取block是可以的,写block就死机,后来改掉寄存器就可以了
2、也顺便下载你的下去试了一下,也是可以的。我的那个发送命令什么的也不需要延时,直接像你的一样直接就用,也是可以了
正点原子
6楼-- · 2019-10-18 09:25
回复【18楼】Badu_Space:
---------------------------------
哦,恭喜.

一周热门 更多>