1.CRC
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601002229831-44941302.png)
- 发送命令或数据的时候,都需要经过芯片的IO口,SD Host和SD卡是通过PCB的走线连接在一起的,SD Host IO --> PCB线 --> SD Card IO,PCB走线容易受到电磁干扰,所以在传递的数据的时候可能出现错误
- 在进行数据或者指令传输的时候,会跟一段数据的编码(CRC),CRC的位宽通常比数据位宽小很多
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601002635923-269151461.png)
- 在传输数据和命令的时候,发送端有一个CRC生成器,当数据发送完之后,再传输CRC生成器生成的CRC(CRC-m)
- 在接收端,不断接收数据,一边接收数据,也会一边生成自己的CRC(CRC-s),然后通过比较器cmp比较CRC-m和CRC-s,如果相同,就表示数据没有问题
- 如果CRC-m和CRC-s如果不同,有两种情况,数据传输出现错误或者CRC传输的时候出现错误,就不能使用这一笔数据,接收端会发送信息给发送端,将接收到数据并出错的信息返回给发送端,发送端一般会再次发送一次数据
- CRC的作用主要是为了校验发送的数据是不是传输正确
1.1 CRC生成
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601003235507-1483921947.png)
- 对于CMD来讲使用的是CRC7,7bitCRC
- CRC生成多项式:CRC7,最高次幂是7,系数为1;其他次幂前的系数是0或者是1
- 最高次幂是多少就有多少个寄存器,data out和data in做异或逻辑,输入到第一个寄存器
- x3之前的系数是1,就在第三个寄存器后面加异或逻辑,哪一项系数是1,就在其所在次幂的寄存器之后加一个异或逻辑
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601004325054-95020975.png)
- DATA位宽比较宽,使用的是CRC16
2.Command种类及格式
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601011159919-1797625649.png)
- bc(Broadcast) - 命令总是从SD Host发送给SD Card,SD Host发送一些命令,所有的SD Card都会收到这个命令
- bcr - Broadcast with response,需要SD卡进行响应,比如CMD2,SD card收到之后会回复CID
- ac - Address command(point-to-point command),没有data transfer,CMD7,CMD16,ACMD6
- actc - Address data transfer command,比如CMD发送出去之后附带有数据返回或者输出
- SD Host在进行读写的时候,只会要求一个SD Card进行读写
- 最高位是1bit,0表示开始
- transmission bit:0表示响应回来的数据,1表示发送的命令
- command index:CMD3,4,5,6,7,具体的命令编号通过[45:40]进行体现
- argument:命令附带的参数,比如电压等信息,体现在这里面
- CRC7:CRC7编码
- 最低位1bit,1结束
2.1 CMD类型
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601012518535-1530703277.png)
- CMD0 - 所有的SD Card都会回到IDLE状态
- CMD2 - SD Card返回CID
- CMD3 - SD Card返回RCA,SD Host收到RCA之后,会进行存储
- CMD4 - 设置DSR(Driver Stage),设置驱动等级,挂载的SD Card越多或者总线越长,驱动能力需求越强,在standby状态下可以通过CMD4设置驱动能力
- CMD7 - argument中会携带RCA,SD Card收到之后会进行比对RCA值,相同则转到data transfer state
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601013437957-414241268.png)
- CMD8 - check电压值
- CMD9 - 给SD A通信就发送A的RCA,返回CSD
- CMD10 - 返回CID值
- CMD12 - stop transmission(用于multiple block transfer)
- CMD13 - 返回状态信息,addressed card就是匹配RCA的值的SD card
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601222028088-513244614.png)
- CMD16 - argument中有block length,设置block length,默认用512byte,设置超过512byte,SD card会将错误信息配置到状态寄存器中,block length error bit拉高,表示配置的block length错误
- 读写操作都是以block为单位进行的,会有设置block length的操作
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601222256407-441845483.png)
- CMD17,18 - single,multiple block transfer, SD Card处于data transfer state,都会携带data address(开始读的地址)
- 系统是指令驱动的,在设计指令集的时候,存在一些保留的指令空间,方便后期增加指令(CMD19-CMD23)
- CMD16\17\18都是在Data Transfer state状态下配置的
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601222845352-1249571883.png)
- CMD24,25 - single block,multiple block write,都会携带data address,常规容量的SD Card的block length是CMD16设置的,但是高容量的SD Card的block length就是固定的512byte,不使用CMD16设置的block length
- CMD27 - 对于CSD进行program,改变CSD的值
CMD指令通常就是对于SD卡中的寄存器进行读写操作并启动一些操作
3. Application Command
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601223603393-1779573205.png)
- ACMD6 - 设置Bus的位宽,位宽存在于SCR寄存器中,就是设置其中Bus位宽的域段
- ACMD13 - 发送SD卡的状态
- ACMD22 - 设置写的block num,在进行写操作之前,需要将写的block的数量配置好
- ACMD23 - 设置erase num
4.SD Card state
- 不同的CMD会使SD Card处于不同的状态
- 在特定的状态才可以接收一些CMD
- 在SD Card接收到CMD0的时候,除了处于inactive state以外的所有状态,都会回到IDLE状态
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601224748184-1528090388.png)
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601235009551-1478291911.png)
- ACMD41 - OCR check is ok and Card is not busy --> SD卡从IDLE-->ready
- ACMD41 - 命令发送之后,SD Card根据OCRcheck和busy情况可以有四种选择
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601235444715-223894396.png)
5.Response
- 通过CMD线进行返回,CMD总是48bit,Response可以是48bit或者是更多bit
- 起始位0
- 第二位也是0 - 表示Response,从SD Card发送给SD Host
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230601235903712-534227463.png)
5.1 Response Width
- 有几种不同的分类
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230602000143385-558137818.png)
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230602000311530-681683177.png)
- [133:128] - reserved(没有使用)
- [127:1] - CID和CSD register信息,包含CRC7
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230602000445703-1246590922.png)
- R3 - 是没有CRC,发送OCR register(包含具体的电压返回和busy状态)
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230602000632222-488144818.png)
- R6 - 会返回RCA的值,作为CMD3的返回值,除了返回RCA还会返回一些SD Card的状态
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230602000746096-1652005983.png)
- R7 - 针对CMD8的响应,会返回4bit电压是不是被接受的状态
6.Card Status
- SD Card支持两种状态
- Card Status:执行的命令的状态和错误信息,通过response指示
- SD Status:包含了SD Card feature信息和应用的spec
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230602001033499-1246315495.png)
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230602001055646-1264671498.png)
- OUT_OF_RANGE - 接收了CMD,CMD中的argument超出范围
- ADDRESS_ERROR - 假设block length为512byte,如果出现misaligned transfer就会报错
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230602001658498-1852327913.png)
SD Status
- SD Card支持两种状态
- Card Status:执行的命令的状态和错误信息,通过response指示
- SD Status:包含了SD Card feature信息和应用的spec
- 返回使用的是Data线,使用的是16bit的CRC
![](https://img2023.cnblogs.com/blog/3077491/202306/3077491-20230602001946069-1042553547.png)
- ACMD13 - SD Card将卡的信息进行返回,SD Card处于Sending data state
posted @
2023-06-01 01:52
Icer_Newer
阅读(
703)
评论()
编辑
收藏
举报