S3C2440读写大容量SD卡
扫描二维码
随时随地手机看文章
先了解一下SD卡协议方面的东西
一、SD卡协议概要
命令(Command):在CMD线上,由主机发出
响应(Response):在CMD线上,由被寻址的卡发出。
数据(data): 在数据线上,用DAT0或DAT0~DAT3。
CRC校验响应及忙指示(The CRC status response and Busy indication)只能经过DAT0发送
二、命令格式:
高位,第48位 低位,第1位
0
1
contents
CRC7
1
起始位,总为0
传输方向,
1:主机发出
0:设备发出
内容,由具体命令决定
七位CRC
终止位,
总为1
响应格式:R1、R3、R6与命令格式同,只是第47位为0;而R2为136位,只是contents与上表的位数多而已。
四条数据线时的传输格式:略
数据经过总线的顺序:高位在前,低位在后。
SD卡寄存器:
名称
宽度
说明
CID
128
Card identification number; 卡标识
RCA
16
Relative card address; 局部地址,在初始化时由主机和卡决定
DSR
16
Driver Stage Register;配置卡的输出驱动
CSD
128
Card Specific Data; 关于卡的操作信息
SCR
64
SD Configuration Register; 卡配置信息
OCR
32
Operation conditions register
SSR
512
SD Status; information about the card proprietary features
CSR
32
Card Status; information about the card status
红色为V2.0曾加的寄存器。绿色为SPI用,蓝色为V1.0用
三、命令种类:广播命令、点对点寻址命令。
操作模式:标识卡模式、数据传输模式。
卡的标识过程:1、复位。上电或发送CMD0使卡进入空闲状态。
2、发ACMD41、CMD2、CMD3使之进入数据传输模式的等待状态。
对于大容量的SD卡,在发送ACMD41后要检查CCS是否为1来确定大容量SD卡否。为了能够识别各种卡,最始的时钟设置不能高于400kHz
数据传输:
对大容量SD卡操作的差异
存储器访问命令包括读块命令(CMD17、CMD18)、写块命令(CMD24、CMD25)及块擦除命令(CMD32、CMD33)。
下面是标准容量SD卡和大容量SD卡在存储器访问时的功能差别:
1 . 命令变量
大容量SD卡,存储器访问命令的32位变量是对块寻址的存储器访问(是决定块的块变量)。块的固定大小为512字节。而标准容量的SD卡,32位变量是对字节寻址,块长度由CMD16命令决定。
即:
(a),标准容量的SD卡,变量0001h是对0001h字节单元寻址,而在大容量SD卡中是对0001h块寻址。
(b),标准容量的SD卡,变量0002h是对0002h字节单元寻址,而在大容量SD卡中是对0002h块寻址。
2. 局部寻址和非对齐寻址。在大容量SD卡中,不允许作为块寻址的局部寻址和非对齐寻址(跨跃块边界),只允许对整个块寻址。
3.设置块长度
当使用块寻址模式的存储器读写命令,块长度为512字节,不关心CMD16设置的块长度。块长度设置对存
储器访问命令无效。CMD42不属于存储器访问命令。CMD16指定的数据块大小和块长度,置为512字节。大于
512字节将里将置位BLOCK_LEN_ERROR,且忽略卡容量。
4. 写保护分组
大容量SD卡不支持。发送命令CMD28、CMD29和CMD30将产生ILLEGAL_COMMAND错误
5、读写超时检查
读:对标准容量的SD卡,读超时的时间设定为大于典型读出时间的100倍,或者设置为100mS。卡参数的读时间为:CSD中的TAACT NSAC参数的两倍。
写:对标准容量的SD卡,写超时的时间设定为大于典型编程时间的100倍,或者设置为250mS。卡参数的写时间为:CSD中的R2W_FACTOR
对于大容量卡,CSD中的参数为因定值,因此最好使用>100mS作为读超时,>250mS作为写超时。
四、命令格式
位序
47
46
[45:40]
[39:8]
[7:1]
0
宽度
1
1
6
32
7
1
数值
‘0’
‘1’
x
x
x
‘1’
备注
起始位
1发送、0接收
命令索引
变量
CRC7
终止位
五、关于命令索引
“命令索引”在SD协议中并没有明确指出,但综合参考三星程序及网上文章,认为这种说法是正确的:“命令索引”中的数字就是其“索引值”。对于ACMD类的命令,可以看作为“复合命令”,即在执行时,前面先执行CMD55,然后再执行“去掉ACMDn前的‘A’的命令”
二、S3C2440手册中关于SD卡的操作说明
串行时钟对数据线的信息进行移位同步并采样,设置SDIPRE来控制传输频率。
基本编程过程:1、设置SDICON来选择时钟和中断。
2、将SDIPRE设置为适当的数值。
3、等待74个SDCLK,让SD卡初始化完毕
命令的发送过程: 1、写32位命令变量到SDICmdArg
2、设置SDICmdCon寄存器,选择命令类型并启动传输
3、检查SDICmdSta的指定位是否置位,判断命令是否传输完毕。
4、若有响应,检查响应寄存器SDIRSPn
5、对SDICmdSta寄存器相应的位写1,清除标志位
数据通道编程:1、写超时寄存器SDIDTimer
2、写入要操作的块大小到SDIBSize
3、设置块模式,总线宽度,DMA等,设置SDIDatCon.启动传输
4、发送数据时,当TCFIFO有效、过半、空时,将数据写入SDIDAT中,
5、接收数据时,当RXFIFO有效、过半、空时,将数据写入SDIDAT中,
6、确认数据是否传送完毕。
7、清除SDIDatSta中相应的标志
一、初始化命令的差别:
1、加入CMD8命令,以识别是否为大容量卡,如果是,则响应为R7,返回可接受的电源范围及和发送一致的检验码。
2、ACMD41与V1.0版本稍有不同,它的响应一般是rSDIRSP0=0xc0ff8000,为了兼容要多增加一个分支。
3、发送CMD2,响应为CID。如某卡的rSDIRSP0:rSDIRSP1:rSDIRSP2:rSDIRSP3值为:0x1b534d30:0x30303030:0x10b1846c:0xdc00879d意义如下:
127 0
位数
8
16
40
8
32
4
12
7
1
值
1b
534d
3030303030
10
b1846cd
c
008
79d
意义
MID
“SM
00000”
PRV
PSN
RSV
MDT
CRC
二、读写差别
V2.0是对块操作,每块512字节。V1.0是可以对字节操作,用CMD16设置块的大小。用CMD17,CMD18分别对单个块、多块操作。
值得注意的是,三星的例程比较经典,但不能读大容量SD卡,原因是没有设置SDI Data Control Register,对于大容量卡,一定要设置该寄存器,使之等于0x200,且必须是此值。
以下是对某大容量卡的起始扇区的读出数据:
0x 0: Rx-0xeb068005,0x2039ffff,0xe800005b,0xc1eb048c
0x 4: Rx-0xc801c38e,0xdb536a19,0xcbf60602,0x 4740f
0x 8: Rx-0x31c08ec0,0xbffc0566,0xb8445543,0x4566ab68
0x c: Rx-0x 2017bc,0x 9031c9,0x51ba8000,0x52b408f9
0x 10: Rx-0xcd135a58,0x16077217,0x80e13ff9,0x741191b4
0x 14: Rx-0x 289c531,0xdb4152f9,0xcd135a72,0x 2f6dc0e
0x 18: Rx-0x1f9c31f6,0x31ffb9df,0x fcf3a5,0xbbfc1966
0x 1c: Rx-0xb8475255,0xaaea7a00,0x 20161f,0x66390775
0x 20: Rx-0x549d723c,0x e1fad88,0xe6ad89c1,0x243f741f
0x 24: Rx-0x29e848f6,0xd8bf0300,0xb4026800,0x d0731db
0x 28: Rx-0x60cd1361,0x730a6031,0xc0cd1361,0x4f75e9f9
0x 2c: Rx-0xe8c50977,0x2883c60c,0x81fefe01,0x72c67715
0x 30: Rx-0xbeb231b4,0x 89952cd,0x13587209,0x9991243f
0x 34: Rx-0x740341eb,0xc0be5101,0xe86f00eb,0xfe1e0666
0x 38: Rx-0x608cc3fa,0x f011660,0x a0f20c0,0x c010f22
0x 3c: Rx-0xc0be0800,0x8ec66631,0xf66631ff,0x66b90024
0x 40: Rx-0x fcf3,0x66a5be10,0x 8ec624,0xfe0f22c0
0x 44: Rx-0x8ec3b900,0x 231f656,0xbf007c57,0x 61f5607
0x 48: Rx-0xfcf3a5bf,0x107ebe00,0x ab91e00,0xfcf3662e
0x 4c: Rx-0xa5061ffb,0xcbfab800,0x208ed0bc,0xdc8ffb66
0x 50: Rx-0x61071fe9,0x6fffb40e,0xcd102eac,0x3c0075f6
0x 54: Rx-0xc30d0a4d,0x69737369,0x6e67204d,0x42522d68
0x 58: Rx-0x656c7065,0x722e0000,0x 0,0x 0
0x 5c: Rx-0x 0,0x 0,0x 0,0x 0
0x 60: Rx-0x 0,0x 0,0x 0,0x 0
0x 64: Rx-0x 0,0x 0,0x 0,0x 0
0x 68: Rx-0x 0,0x 0,0x 0,0x 0
0x 6c: Rx-0x 0,0x 0,0x9bb43b00,0x 8001
0x 70: Rx-0x 1000cfe,0x7ff23f00,0x c17f,0x7a000000
0x 74: Rx-0x 0,0x