SD:

1条CMD线,所有的命令和回应都是通过这条线一位一位的传输.不同模式或不同版本下,命令有不同含义.(SD(SD[0],SD[3:0]),SPI))

1条时钟线,时钟源是来自APH总线时钟

4条数据线,SPI模式下用了两条(一条输出,一条输入),SD的一位模式下一条(输出输入),也可以用完四条(输出输入,DATA[0]将分时复用).

SD卡是以块为单位,初始化时有配置,一般为512字节,一个扇区有4096个块.

2410_SDI控制器:

封装了命令和数据的移位操作,支持SDI_1.0规范.有FIFO和DMA模式.当操作某些寄存器时,控制器会自动帮我们转换成48位的命令包通过移位控制器发给SD从机.

SD命令包格式

----------------------------------------------------------------------------

Bit 位置 47    46              [45:40]      [39:08] [07:01] 00

Bit 宽度 1      1               6        32   7   1

值         0            1                x         x  x    1

说明  Start BitTransmission Bit      Command Index   ArgumentCRC7   End Bit

----------------------------------------------------------------------------

在S3C2410中要发送CMD需要设置SDICARG,SDICCON两个寄存器.

SDICARG: SDI 命令参数寄存器:

SDICCON: SDI 命令控制寄存器:

这两个寄存器合起来构成SD协议规范中的CMD命令.其中:

SDICARG[31:0] ===================== CMD[39:8]  命令的参数(根据命令所需的参数位格式设置)

SDICCON[7:0]  ===================== CMD[47:40] 包含Start Bit,Transmission Bit,Command Index.

ACMD命令:

ACMD是特殊命令.虽然发送方法也是用SDICARG和SDICCON来发.但是,在发送特殊命令前,

要先发送一条普通的不带参数的CMD55命令,表示下一条所发送的命令是特殊命令.

例如:CMD52 SDICARG:

----------------------------------------------------------------------------

Bit 位置  31       [30:28]           27        26    [25:9]             8     [7:0]

Bit 宽度  1         3                1         1      17                1      8

说明     R/W flag  Function Number  RAW flag  Stuff  Register Address  Stuff  Write Data or Stuff Bits

----------------------------------------------------------------------------

SCR 该寄存器保存的SD的特殊性信息(例如支持的总线位宽,SD卡的版本),MMC卡没有此寄存器,获取该寄存器的数据需要从数据线读的.

CSD 该寄存器保存着SD卡的详细信息,如块大小,SD卡的容量大小,文件系统等信息.

RCA SD的相对地址(SD卡已经保存在芯片内部)

OCR 该寄存器保存着SD的可供电范围,并且区别是否为HC卡(根据返回的ORC回应第30位是否置1).

CIA (Card I/O Area)

CID SD卡的唯一ID号

CIS (Card Information Structure)跟Linux内核的参数TagList的存放方式很相似,都是以标识号和长度加后续内容表示一个节点.

SD模式的命令说明:

CMD0 GO_IDLE_STATE  Mandatory Mandatory  Used to change from SD to SPI mode /* 使SD卡进入Idle状态 */

CMD2 ALL_SEND_CID Mandatory  CID not supported by SDIO /* 广播获取卡的CID信息 */

CMD3 SEND_RELATIVE_ADDR  Mandatory Mandatory  /* 广播获取SD卡所分配的相对地址 */

CMD4 SET_DSR  Optional    DSR not supported by SDIO

CMD5 IO_SEND_OP_COND    Mandatory

CMD6 SWITCH_FUNC  Mandatory1 Mandatory1 Added in Part 1 v1.10

CMD7 SELECT/DESELECT_CARD Mandatory Mandatory  /* 根据获取指定的RCA,选中SD卡,如果在选中一个卡的状态下,又选中其他的卡,那么之前的卡会自动取消选中,如果发送地址0,则表示取消选中全部卡 */

CMD9 SEND_CSD  Mandatory    CSD not supported by SDIO /* 获取SD相关的存储信息,如块大小,容量等. */

CMD10 SEND_CID  Mandatory   CID not supported by SDIO

CMD12 STOP_TRANSMISSION  Mandatory /* 停止多块传输操作 */

CMD13 SEND_STATUS  Mandatory    Card Status includes only SDMEM information /* 获取卡的状态 */

CMD15 GO_INACTIVE_STATE  Mandatory Mandatory

CMD16 SET_BLOCKLEN  Mandatory /* 设置SD卡的块大小,CSD寄存器有描述. */

CMD17 READ_SINGLE_BLOCK  Mandatory /* 使SD卡进入传输状态,读取单个块 */

CMD18 READ_MULTIPLE_BLOCK Mandatory /* 使SD卡进入传输状态,读取多个块,直到收到CMD12为止 */

CMD24 WRITE_BLOCK   Mandatory /* 使SD卡进入传输状态,写入单个块 */

CMD25 WRITE_MULTIPLE_BLOCK Mandatory /* 使SD卡进入传输状态,写入多个块 */

CMD27 PROGRAM_CSD  Mandatory    CSD not supported by SDIO

CMD28 SET_WRITE_PROT  Optional

CMD29 CLR_WRITE_PROT  Optional

CMD30 SEND_WRITE_PROT  Optional

CMD32 ERASE_WR_BLK_START  Mandatory

CMD33 ERASE_WR_BLK_END  Mandatory

CMD38 ERASE  Mandatory

CMD42 LOCK_UNLOCK  Optional

CMD52 IO_RW_DIRECT    Mandatory

CMD53 IO_RW_EXTENDED    Mandatory  Block mode is optional

CMD55 APP_CMD Mandatory /* 特殊指令前命令,在发送ACMD类指令前,需要发送此命令 */

CMD56 GEN_CMD  Mandatory

ACMD6 SET_BUS_WIDTH  Mandatory /* 设置SD卡的总线位宽,这个需要读取SCR确定 */

ACMD13 SD_STATUS  Mandatory

ACMD22 SEND_NUM_WR_BLOCKS  Mandatory

ACMD23 SET_WR_BLK_ERASE_COUNT Mandatory

ACMD41 SD_APP_OP_COND  Mandatory /* 获取SD电压值 */

ACMD42 SET_CLR_CARD_DETECT  Mandatory

ACMD51 SEND_SCR  Mandatory    SCR not supported by SDIO /* 获取SD卡的SCR寄存器的值 */

2410 SDI控制寄存器:

SDICON 0x5A000000    R/W SDI control register             /* 完成SD卡基础配置,包括大小端,中断允许,时钟使能和重启FIFO */

SDIPRE 0x5A000004    R/W SDI baud rate prescaler register /* 对SD的时钟分频系数设置 */

SDICARG 0x5A000008   R/W SDI command argument register    /* 指令的参数存放在这里,不同的命令,参数的位数格式有不用含义 */

SDICCON 0x5A00000C   R/W SDI command control register     /* 控制指令形式的寄存器,配置SPI还是SDI指令,指令的反馈长度,是否等待反馈,是否运行指令,指令的索引等 */

SDICSTA 0x5A000010   R/(W) SDI command status register    /* 指令状态寄存器,指令是否超时,传送,结束,CRC是否正确等 */

SDIRSP0 0x5A000014   R SDI response register 0            /* SD回应状态寄存器,R1的回应都用这个,其他长回应会用到4个. */

SDIRSP1 0x5A000018   R SDI response register 1

SDIRSP2 0x5A00001C   R SDI response register 2

SDIRSP3 0x5A000020   R SDI response register 3

SDIDTIMER 0x5A000024 R/W SDI data / busy timer register   /* 设置超时时间 */

SDIBSIZE 0x5A000028  R/W SDI block size register          /* 设置Block的大小,FIFO共填充的数据.单位是字节 */

SDIDCON 0x5A00002C   R/W SDI data control register        /* 数据控制寄存器,配置是几线传输,数据发送方向,数据传送方式,要传送多少个块的数据等 */

SDIDCNT 0x5A000030   R SDI data remain counter register   /* 数据保持计数器 */

SDIDSTA 0x5A000034   R/(W) SDI data status register       /* 数据状态寄存器,数据是否发送完,CRC效验,超时等*/

SDIFSTA 0x5A000038   R SDI FIFO status register           /* FIFO状态寄存器,DMA传输时不用判断FIFO */

SDIDAT 0x5A00003C    (Li/W,Li/B, Bi/W) 0x5A00003F(Bi/B) R/W SDI data register /* 数据传输寄存器,要严格读完所请求的数据块,否则遗留的数据位将影响下一次的数据传输 */

SDIIMSK 0x5A000040   R/W SDI interrupt mask register      /* 中断屏蔽 */

SD/MMC 初始化流程

步骤是:1)配置时钟,慢速一般为400K,设置工作模式

2)发送CMD0,进入空闲态,该指令没有反馈

3)发送CMD8,如果有反应,CRC值与发送的值相同,说明该卡兼容SD2.0协议。

4)发送CMD55+ACMD41,判断SD卡的上电是否正确,短反馈成功说明该卡为SD卡(短反馈第31位置1为HC卡),否则发送CMD0,有反应说明是MMC卡

5)发送CMD2,验证SD卡是否接入,长反馈(CID)

6)发送CMD3,读取SD卡的RCA(地址),短反馈

7)发送CMD9,读取CSD寄存器获取卡的相关信息

8)发送CMD7,使能SD卡

9)配置高速时钟,准备数据传输,一般20M~25M

10)发送CMD55+ACMD51读取SCR寄存器,SD卡可以通过该值获得位宽,如果是MMC卡则需要使用主线测试来确定卡的位宽。

11)SD卡发送CMD55+ACMD6配置为4bit数据传输模式(根据SCR读出来的值确定),MMC卡发送CMD6来设置位宽

12)发送CMD7,使能SD卡,使其进入传输状态),接着发送CMD16设置块大小(根据前面读取的CSD信息确定)。

13) 把命令参数设置为0,再次发送CMD7,取消选中所有卡。

SD 读操作(注意:标准卡和HC卡最大区别在于单块或者多块读写时命令的起始地址参数对齐,标准卡是以字节计算为起始地址的,而HC则按块地址作为起始地址.例如,一般情况下从CSD获取的卡信息中,块长度都为512字节大小,那么要访问第一个512字节时,对于标准卡,命令的参数直接写512,而HC卡则写1.另外,标准卡所使用的SD协议有可能是1.0也有可能是2.0,但是HC的卡就一定是2.0的,大部分的SD卡都是2.0的,而最新的XC卡则使用3.0的协议.)

步骤是:1)发送CMD7,以卡的相对地址为参数,选中该卡,并使其进入Tran状态

2)发送CMD17/CMD18,命令的参数需要根据初始化时所判断的卡类型填写,按字节或按块.

3)循环读取数据

4)发送CMD12,强制停止所有传输.

5)发送CMD7,以0作为命令参数,取消所有选中.

SD/MMC 初始化流程

步骤是:1)配置时钟,慢速一般为400K,设置工作模式

2)发送CMD0,进入空闲态,该指令没有反馈

3)发送CMD8,如果有反应,CRC值与发送的值相同,说明该卡兼容SD2.0协议。

4)发送CMD55+ACMD41,判断SD卡的上电是否正确,短反馈成功说明该卡为SD卡(短反馈第31位置1为HC卡),否则发送CMD0,有反应说明是MMC卡

5)发送CMD2,验证SD卡是否接入,长反馈(CID)

6)发送CMD3,读取SD卡的RCA(地址),短反馈

7)发送CMD9,读取CSD寄存器获取卡的相关信息

8)发送CMD7,使能SD卡

9)配置高速时钟,准备数据传输,一般20M~25M

10)发送CMD55+ACMD51读取SCR寄存器,SD卡可以通过该值获得位宽,如果是MMC卡则需要使用主线测试来确定卡的位宽。

11)SD卡发送CMD55+ACMD6配置为4bit数据传输模式(根据SCR读出来的值确定),MMC卡发送CMD6来设置位宽

12)发送CMD7,使能SD卡,使其进入传输状态),接着发送CMD16设置块大小(根据前面读取的CSD信息确定)。

13) 把命令参数设置为0,再次发送CMD7,取消选中所有卡。

SD 读操作(注意:标准卡和HC卡最大区别在于单块或者多块读写时命令的起始地址参数对齐,标准卡是以字节计算为起始地址的,而HC则按块地址作为起始地址.例如,一般情况下从CSD获取的卡信息中,块长度都为512字节大小,那么要访问第一个512字节时,对于标准卡,命令的参数直接写512,而HC卡则写1.另外,标准卡所使用的SD协议有可能是1.0也有可能是2.0,但是HC的卡就一定是2.0的,大部分的SD卡都是2.0的,而最新的XC卡则使用3.0的协议.)

步骤是:1)发送CMD7,以卡的相对地址为参数,选中该卡,并使其进入Tran状态

2)发送CMD17/CMD18,命令的参数需要根据初始化时所判断的卡类型填写,按字节或按块.

3)循环读取数据

4)发送CMD12,强制停止所有传输.

5)发送CMD7,以0作为命令参数,取消所有选中

SD初始化过程以及Cmd解析相关推荐

  1. [Spring 深度解析]第7章 IoC容器的初始化过程

    7. IoC容器的初始化过程 ​ 简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个方法标志着IoC容器的正式启动.具体来说,这个启动包括BeanDefinition的Re ...

  2. 解析 Java 类和对象的初始化过程 由一个单态模式引出的问题谈起

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 问题引入 近日我在调试一个枚举类型的解析器程序,该解析器是将数据库内一万多条枚举代码装载到缓存中,为了实现快速定位枚举代码 ...

  3. Mybatis源码解析之Mybatis初始化过程

    一.搭建一个简单的Mybatis工程 为了了解Mybatis的初始化过程,这里需要搭建一个简单的Mybatis工程操作数据库,工程结构如下: 一个UserBean.java private int i ...

  4. webserver接口_SpringBoot内置源码解析WebServer初始化过程

    WebServer 初始化过程 在上一节中 Spring Boot 初始化了 WebServer 对应的工厂类.同时,我们也知道对应 Web容器的WebServer实现类有:TomcatWebServ ...

  5. 解析 Java 类和对象的初始化过程

    跳转到主要内容 中国 [ 选择 ] dW 全部内容--------------  AIX and UNIX  Info Mgmt  Lotus  Rational  WebSphere-------- ...

  6. seata源码解析:TM RM 客户端的初始化过程

    TM和RM初始化过程 上一篇文章说过,在Spring启动的过程中就会就会初始化TM和RM,建立与TC的长连接.TM,RM,TC都是用netty来处理网络连接的,初始化netty客户端和服务端的过程也非 ...

  7. MMC子系统识别SD设备过程简述

    一 :引子–WIFI 模块移植 二 : MMC 识别 SD设备过程 第一步: 注册虚拟总线 第二步: 初始化并挂载设备驱动 第三步:初始化注册主控驱动 第四步:Host驱动的prob() 4.1 mm ...

  8. PCIe和NVMe SSD初始化过程简介

    1.PCIe初始化流程 PCIe硬件初始化完成的标志是盘进入最大速率L0状态,进入L0状态后,主机和盘就能正常使用TLP报文进行数据传输.参见图1. 从状态机可以看到,盘进入L0只能是通过Config ...

  9. hadoop作业初始化过程详解(源码分析第三篇)

    (一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...

最新文章

  1. c++概念模型的官方解释
  2. BZOJ3709: [PA2014]Bohater
  3. 【MATLAB】数据类型 ( 矩阵 | 随机数函数 | 生成矩阵 )
  4. CRM项目经验总结-从DAO层到链接数据池
  5. Android的开机流程及对应源码位置分析
  6. Angular之Error: ExpressionChangedAfterItHasBeenChecked
  7. java怎么输入数据_java怎么键盘输入数据啊?
  8. c/c++教程 - 1.9 指针 空指针 野指针 const修饰指针 指针常量 常量指针 指针和数组 指针和函数
  9. figsize, dpi参数
  10. 计算机原理考研题库,东北大学计算机组成原理题库(9)
  11. Matlab实现无标度网络生成及其分析
  12. mac sublime中文乱码问题解决
  13. RabbitMq 406错误
  14. 详解华硕电脑asus安装win7系统教程
  15. 数据结构之常见排序算法的适用范围
  16. linux开启vi命令,让Linux默认启动是字符界面和Linux之VI命令详解
  17. Jetson TK1 刷机步骤小记
  18. java企业号开发教程_详解java微信企业号开发之开发模式的开启步骤
  19. Eclipse 2020-06 汉化包安装步骤(附汉化包+安装教程)(转载)
  20. cocos3.4 使用quic-src报错:duplicate symbol _MD5_Final in:

热门文章

  1. boost::merge相关的测试程序
  2. boost::log::sinks::syslog用法的测试程序
  3. Boost:系统测试的实例
  4. DCMTK:用于管理常见的增强型CT特定类型的类
  5. DCMTK:DcmItem类的测试程序
  6. VTK:模型之MarchingSquares
  7. VTK:Medical之GenerateCubesFromLabels
  8. 与C ++中的QML对象进行交互
  9. OpenGL上下文共享示例
  10. QT实现Three.js将Qt Quick项目用作纹理