最近闲了就玩玩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即可
---------------------------------
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点的问题
---------------------------------
谢谢.cool.
这种加printf的,我遇到过几次了.
原因:
1,字节对齐问题.
2,操作不当,没有按要求操作.
具体到你这里,怀疑是不是延时的问题?
库函数因为各个都是函数,一般需要一点时间.
而寄存器,如果全部操作寄存器,不要经过那么多函数调用.
看看是不是操作上面,有没有需要注意时间的.
另外,我们的战舰版本也有SDIO,寄存器版本的,你测试下是否也有这个问题?
---------------------------------
原子哥,我将你的例程的SDIO寄存器版本驱动代替了我工程的SDIO驱动测试了一下,和我的那个SDIO寄存器版本结果是一摸一样的
---------------------------------
1、原子哥,这个问题搞好了,原来手误写错寄存器了,呵呵。。。刚开始的版本读取block是可以的,写block就死机,后来改掉寄存器就可以了
2、也顺便下载你的下去试了一下,也是可以的。我的那个发送命令什么的也不需要延时,直接像你的一样直接就用,也是可以了
---------------------------------
哦,恭喜.
一周热门 更多>