首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 SDIO FatFs 文件系统 有感

STM32 SDIO FatFs 文件系统 有感

最近在写STM32sdio文件系统。
感触颇多。
刚开始调用红牛开发板的SDIO例程。真是无语,问题好多。
基本上都不成功,每次都SD_Error都不是2A,2A表示正常。原来发现死在CMD55这个地方。在这里加一个延时就1ms就OK了。如下

  SDIO_CmdInitStructure.SDIO_Argument =0x00;
  SDIO_CmdInitStructure.SDIO_CmdIndex =SDIO_APP_CMD;
  SDIO_CmdInitStructure.SDIO_Response =SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait =SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM =SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
Delay_ms(1);  
  errorstatus = CmdResp1Error(SDIO_APP_CMD);
至于原因还不是很理解,当时也调了很久,因为总是超时。

红牛的例程非常蛋疼,他只有SDIO的例程,但是文件系统确实用SPI写的,你说坑人不坑人。
后来只有网上去找别人写的文件系统,但是由于不同版本的SDIO 也都不一样。于是改了又改。总结了不少问题。
因为SDIO_FIFO的寄存器是u32 的,所以配置DMA的时候一定要注意,一般情况扇区我们选择512.所以DMA次数就应该是512/4(这个是固定的不能修改,因为SDIO_FIFO的寄存器是固定的,扇区大小也是固定的,)。所以类型也要配置成Word。
为什么呢不能配置成Byte.其实语法上也是可以的,但是这样一来数据就会少了很多每次都只有128字节的。
只有把u8地址强制转换成U32这样,刚开始定义的U8数据寄存器就可以在128次的情况下,顺利存满1个扇区512字节。因为u32传一次就会传4个u8.这个想一下就会明白了。
那么为什么不直接把数据定义成u32呢?
这个问题我开始也想了很久。后来发现FatFs都是以字节为单位的。如果把这里面的函数修改起来的话就非常麻烦。所以只有一开始把数据定于成u8.这样的优点就是可以节省一点空间。但是对于一些大于u8的数据来说存放起来就会有一点麻烦,要分高位地位了。
还有一点。在用SD卡前一定要现在电脑上格式化过。一般选择,FAT32,512字节扇区这里一定要注意。如果不先在电脑上格式化,用单片机的软件格式化可能会有一些问题(我还没有尝试过)。
还有再这里要感谢http://www.360doc.com/content/12/0321/00/9072830_196150129.shtml。这个楼主,我是看了他的说明才顺利成功移植成功。
对了,注意一点就是,如果你要用文件系统,就不要在用其他的函数在SD卡里面写东西了。因为文件系统会与这些函数有冲突的,文件系统的存放的地址是一些链表的关系,并不是完全的顺序来写的。
所以一旦选择了文件系统,就要舍弃传统的读写。比如SD_WriteBlock,SD_Read_Block这类函数。刚开始自己就是犯了这个错误。以为只有头几个扇区不能写,其实后面很多扇区的的一些位置都是记录了文件系统的信息的。不能轻易修改。如果要进一步了解文件系统的内部的话,就要花更多时间了。由于本人能力有限,等以后再去挖掘了。
总之调程序一定不能死脑筋,在自己思考过后的同时多和别人交流。
今天调了一天总算有收获。
嘿嘿。一分耕耘一分收获!
继承事业,薪火相传
返回列表