STM32+FatFs+SDIO接口调试与问题分析.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

这两天调试stm32单片机的sdio接口读写sd卡,把调试经验总结一下。

我首先采用的是例程里面得dma方式,直接使用的sdcard.c文件。首先一个uint32类型的数据缓冲区,读写sd卡的

每个扇区完全正常,随后添加fatfs的文件,然后改好接口函数,其中有一处做了强制转换,就是fatfs的缓冲区都是uint8*类型的,而

sdcard.c文件要求为uint32*类型,所以我把uint8*强制转换为uint32*类型。编译成功后执行,结果fatfs的初始化函数返回“没有文件系统”,

经过多次小改动后重试,问题依然如此,后来我怀疑是我强制转换出的问题,为了验证我的想法,我做了如下程序:

#includestdio.h

#includestring.h

voidmain(void)

{

unsignedchari;//AA[]={0,1,2,3,4,5,6,7,8,9,0,4};

unsignedchar*aa;

unsignedint*bb;

for(i=0;i10;i++)

{

*(aa+i)=i;

}

bb=(unsignedint*)aa;

printf(bbis:0X%04x\n,*bb);

bb=(unsignedint*)(aa+1);

printf(bbis:0X%04x\n,*bb);

while(1);

}

以上程序验证结果为:在IAREWARM5.40中,强制转换不会对数据存取产生影响。

既然不是这个问题,那会呢?!我只好单步执行程序,一步步下去,看看到底问题出在哪里。功夫不负有心人,最后发

现出问题的地方,如下图:

32类型的数据缓冲区,读写sd卡的

声明的缓冲区都是uint8*类型的,而

的初始化函数返回“没有文件系统”,

了如下程序:

里。功夫不负有心人,最后终于发

原来是DMA传输出了错误,fatfs的uint8*的缓冲区不是从整4倍字节地址开始的,而DMA控制器在操作uint32*类型地址的时候

必须从整4倍字节地址开始,由于强制转换,产生了2个字节的偏移,从而导致最终的数据错误。

既然发现问题所在,就想办法解决,我在fatfs和sd

文档评论(0)

+ 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档