最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Micro-SD卡读写时序及程序调试关键(汇编)

IT圈 admin 27浏览 0评论

2024年5月19日发(作者:穰夜天)

精品文档

Micro SD卡读写时序及程序调试关键

调试关键:

1.

上电时要延时足够长的时间给SD卡一个准备过程,在我的程序里是5秒,

根据不同的卡设置不同的延时时间。SD卡初始化第一步在发送CMD命令之前,

在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能

初始化的问题。

2.

SD卡发送复位命令CMD0后,要发送版本查询命令CMD8,返回状态一般分

两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返

回0x05则表示此SD卡支持版本1。因为不同版本的SD卡操作要求有不一样的

地方,所以务必查询SD卡的版本号,否则也会出现SD卡无法正常工作的问

题。

3.

理论上要求发送CMD58获得SD卡电压参数,但实际过程中由于事先都知道

了SD卡的工作电压,因此可省略这一步简化程序。协议书上也建议尽量不要

用这个命令。

精品文档

精品文档

4.

SD卡读写超时时间要按照协议说明书书上的给定值(读超时:100ms;写超

时:250ms),这个值要在程序中准确计算出来,否则将会出现不能正常读写

数据的问题。我自己定义了一个计算公式:超时时间=(8/clk)*arg。

5.

2GB以内的SD卡(标准卡)和2GB以上的SD卡(大容量卡)在地址访问形式上

不同,这一点尤其要注意,否则将会出现无法读写数据的问题。如标准卡在

读写操作时,对读或写命令令牌当中的地址域符初值0x10,表示对第16个字

节以后的地址单元进行操作(前提是此SD卡支持偏移读写操作),而对大容量

卡读或写命令令牌当中的地址域符初值0x10时,则表示对第16块进行读写操

作,而且大容量卡只支持块读写操作,块大小固定为512字节,对其进行字节

操作将会出错。

6.

对某一块要进行写操作时最好先执行擦出命令,这样写入的速度就能大大

提高。进行擦除操作时不管是标准卡还是大容量卡都按块操作执行,也就是

一次擦除至少512字节。

7.

对标准卡进行字节操作时,起始和终止必须在一个物理扇区内,否则将不

能进行读写操作。实际操作过程中建议用块操作以提高效率。不管是标准卡

还是大容量卡一个读写命令只能对一个块进行操作,不允许跨物理层地址操

作。

8.

在写数据块前要先写入若干个dummy data字节,写完一个块数据时,主机

要监测MISO数据线,如果从机处于忙状态这根数据线会保持低电平,这样主

机就可以根据这根数据线的状态以决定是否发送下一个命令,在从机没有释

放MISO数据线之前,主机绝对不能执行其他命令,否则将会导致写入的数据

出错,而且从机也不会响应主机的命令。

精品文档

精品文档

9.

在SPI模式下,CRC校验是被忽略的,但依然要求主从机发送CRC码,只

是数值可以是任意值,一般主机的CRC码通常设为0x00或0xFF。

读多块操作和写多块操作的传输停止形式不一样,读多块操作时用用命令

CMD12终止传输,而写多块操作时用Stop Tran Token(停止传输令牌,值为0xFD)

终止传输

精品文档

2024年5月19日发(作者:穰夜天)

精品文档

Micro SD卡读写时序及程序调试关键

调试关键:

1.

上电时要延时足够长的时间给SD卡一个准备过程,在我的程序里是5秒,

根据不同的卡设置不同的延时时间。SD卡初始化第一步在发送CMD命令之前,

在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能

初始化的问题。

2.

SD卡发送复位命令CMD0后,要发送版本查询命令CMD8,返回状态一般分

两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返

回0x05则表示此SD卡支持版本1。因为不同版本的SD卡操作要求有不一样的

地方,所以务必查询SD卡的版本号,否则也会出现SD卡无法正常工作的问

题。

3.

理论上要求发送CMD58获得SD卡电压参数,但实际过程中由于事先都知道

了SD卡的工作电压,因此可省略这一步简化程序。协议书上也建议尽量不要

用这个命令。

精品文档

精品文档

4.

SD卡读写超时时间要按照协议说明书书上的给定值(读超时:100ms;写超

时:250ms),这个值要在程序中准确计算出来,否则将会出现不能正常读写

数据的问题。我自己定义了一个计算公式:超时时间=(8/clk)*arg。

5.

2GB以内的SD卡(标准卡)和2GB以上的SD卡(大容量卡)在地址访问形式上

不同,这一点尤其要注意,否则将会出现无法读写数据的问题。如标准卡在

读写操作时,对读或写命令令牌当中的地址域符初值0x10,表示对第16个字

节以后的地址单元进行操作(前提是此SD卡支持偏移读写操作),而对大容量

卡读或写命令令牌当中的地址域符初值0x10时,则表示对第16块进行读写操

作,而且大容量卡只支持块读写操作,块大小固定为512字节,对其进行字节

操作将会出错。

6.

对某一块要进行写操作时最好先执行擦出命令,这样写入的速度就能大大

提高。进行擦除操作时不管是标准卡还是大容量卡都按块操作执行,也就是

一次擦除至少512字节。

7.

对标准卡进行字节操作时,起始和终止必须在一个物理扇区内,否则将不

能进行读写操作。实际操作过程中建议用块操作以提高效率。不管是标准卡

还是大容量卡一个读写命令只能对一个块进行操作,不允许跨物理层地址操

作。

8.

在写数据块前要先写入若干个dummy data字节,写完一个块数据时,主机

要监测MISO数据线,如果从机处于忙状态这根数据线会保持低电平,这样主

机就可以根据这根数据线的状态以决定是否发送下一个命令,在从机没有释

放MISO数据线之前,主机绝对不能执行其他命令,否则将会导致写入的数据

出错,而且从机也不会响应主机的命令。

精品文档

精品文档

9.

在SPI模式下,CRC校验是被忽略的,但依然要求主从机发送CRC码,只

是数值可以是任意值,一般主机的CRC码通常设为0x00或0xFF。

读多块操作和写多块操作的传输停止形式不一样,读多块操作时用用命令

CMD12终止传输,而写多块操作时用Stop Tran Token(停止传输令牌,值为0xFD)

终止传输

精品文档

发布评论

评论列表 (0)

  1. 暂无评论