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条回答
八度空间
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点的问题

一周热门 更多>