S3C2440读写sd卡的一些总结

整理硬盘的时候发现这个文档,以前写2440操作sd卡程序的时候总结的。

 

1.我的2440 sdisd卡发送ACMD41时总是反馈crc fail,但是可以得到正确的responsesd卡可以正常使用。

2 sd卡可以没有mbr,在物理的 0 block上面直接开始dbr。我的山寨kingston 1g mini sd在板子自带的测试程序读写后,0 block被覆盖,插到电脑上之后提示未格式化,用Windows格式化之后,用winhex查看physical sector no.logical sector no.相同,dbr在第0 block,可以正常读写数据,不过系统识别sd卡的速度很慢。

3 sd卡的sector有两个含义,在spec part1中,sectorerase的基本单位,一个sector包含多个block,具体数值在csd中有(我手上的两个卡都是128blocks/sector);在spec part2 文件系统的介绍中,sectorblock含义一样。

4 read/write/erase命令的参数是字节地址。

5 sd卡执行erase之后的状态由厂商决定,在SCR寄存器中可以查询到。

6 sdr/w操作的基本单位是block,但是可以读取最小一个byte的数据,如果csd寄存器的WRITE_BLK_PARTIAL位为1,可以写入最少一个字节的数据。一个r/w命令是否可以跨block读写,由csd寄存器的WRITE_BLK_MISALIGREAD_BLK_MISALIGN决定,如果该位为1,则允许。(spec上面的规定,我没有验证)

7 write命令之后进入prg状态,在此状态下,如果向sd卡发送read/write/erase命令会timeout,所有如果上一个命令是write,需要用cmd13查询状态的READY_FOR_DATA,到此位置1才能进行后续的read/write/erase

8 发命令的时候一定要用一些机制来做超时,因为硬件不一定就是正常工作的。有时候发完命令之后命令状态寄存器SDI Command Status Register一直不会变化(可能是硬件的问题),如果光靠读取命令状态寄存器的值决定程序的行为很可能会进入死循环。(所有的针对硬件控制并需要硬件响应的程序都应该加个额外的超时机制)

9 fatfs的移植问题

我手上的代码是r0.06的,从九九兄的那个帖子上直接下载的http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=3210864

对于arm来说,_MCU_ENDIAN应该设置为2,按byte访问FAT structure

fatfsreadme上说:

When the target device corresponds to either or both of following cases, it must always be set 2.

  - Muti-byte integers (short, long) are stored in Big-Endian.

  - Address miss-aligned memory access results in an incorrect behavior.

ARM32bit16bit内存访问是要求地址对齐的,所以如果把_MCU_ENDIAN设置为1的话,会出现data abort exception

FatFs Module Application NoteMemory Usagefatfs的作者在测试ARM7_MCU_ENDIAN = 2

网上转的比较多的《转一篇比较详细介绍FatFs文件系统移植的文章》里面把_MCU_ENDIAN设置为1,然后用函数的形式实现了LD_WORD/LD_DWORD宏的按byte访问,这并不是正确的处理方法。

九九兄的代码也是将_MCU_ENDIAN设置为2,一直奇怪为什么他的代码不会出现data abort exception,也没见到有人说代码报错——后来在这个讨论结构体占用内存的帖子中http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=1672225看到四楼的兄弟说STM32的内存可以不对齐访问。不知道是不是这个原因?

现在fatfs已经r0.08a了,增加了很多功能,代码看起来比以前好多了,_MCU_ENDIAN也已经改为_WORD_ACCESS了。

10 如果想用winhex查看mbr,需要在open disk时选择physical media。

11 DMA模式下何时开启DMA

CSDN上看到这样一个问题:

有的sd卡命令是要传输数据的,那应该什么时候进行dma呢?

比如:下面两种顺序哪个更好?

顺序1. 先发送命令;再接收response;最后启动dma传输。

顺序2. 先启动dma传输;再发送命令;最后接收response

我觉得“顺序1”肯定没问题。请问“顺序2”可以吗?

http://topic.csdn.net/u/20100301/18/868de0f6-3370-411c-b1c5-4907d1418a7f.html

sdi模式下datacmd是在不同的线上传输的,在sd spec 1.0 p57上的给出的读数据的时序图中可以看到response还没有发送完成的时候,数据已经可以发送到data线上了,所以我认为应该先开DMA,然后发命令。

当然由于fifo这个缓存器的存在,先开DMA和后开DMA实际上可能没什么影响。

在写数据的情况下,需要确认SD卡的状态,所以不存在response未接收完就可以发数据的问题。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值