SD初始化过程以及Cmd解析

D:

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作为命令参数,取消所有选中

时间: 2024-10-11 20:21:55

SD初始化过程以及Cmd解析的相关文章

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

类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来分析的文章更是鲜有所见. 本文主要对类和对象初始化全过程进行分析,通过一个实际问题引入,将源代码转换成 JVM 字节码后,对 JVM 执行过程的关键点进行全面解析,并在文中穿插入了相关 JVM 规范和 JVM 的部分内部理论知识,以理论与实际结合的方式介绍对象初始化和类初始化之间的协作以及可能存在的

MyBatis初始化过程解析----广西11选5平台出租源码解析

准备工作 为了看清楚广西11选5平台出租的 Q1446595067 整个初始化过程,先创建一个简单的Java项目,目录结构如下图所示: 1.1 Product 产品实体类 public class Product { private long id; private String productName; private String productContent; private String price; private int sort; private int falseSales; p

Spring IoC容器初始化过程

IoC容器是什么?IoC文英全称Inversion of Control,即控制反转,我么可以这么理解IoC容器: 把某些业务对象的的控制权交给一个平台或者框架来同一管理,这个同一管理的平台可以称为IoC容器. 我们刚开始学习spring的时候会经常看到的类似下面的这代码: ApplicationContext appContext = new ClassPathXmlApplicationContext("cjj/models/beans.xml"); Person p = (Per

Mybatis深入之初始化过程

Mybatis深入之初始化过程 一:简介 这篇开始是根据Mybatis源码来对Mybatis进行更深入的学习.当然.精力有限.还做不到学习的面面俱到. Mybatis初始化过程可以用一句话概括:就是将Mybatis的配置信息加载到一个类中.供后面Mybatis进行各种操作时使用.这个类叫:Configuration--见名知意.当然这个类的功能并不仅限与存放配置文件信息. 二:整体流程 下面是一段正常情况下从加载配置到执行sql语句的代码: String mybatisConfigPath =

Spring IoC容器的初始化过程

Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生在第一次通过getBean向容器索取Bean的时候. 先看以下代码: ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml"); Car car = (Car) context.getBean(&q

Nginx 启动初始化过程

Nginx 启动过程 Nginx 的启动初始化由 main 函数完成,该函数是整个 Nginx 的入口,该函数完成 Nginx 启动初始化任务,也是所有功能模块的入口.Nginx 的初始化工作主要是一个类型为 ngx_cycle_t 类型的全局变量.main 函数定义在文件:src/?core/?nginx.c Nginx 启动过程如下. 调用 ngx_get_options() 解析命令参数: 显示版本号与帮助信息: 调用 ngx_time_init() 初始化并更新时间: 调用 ngx_lo

【初探Spring】------Spring IOC(三):初始化过程---Resource定位

我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然后根据这些信息绑定整个系统的对象,最终组装成一个可用的基于轻量级容器的应用系统. Spring IoC容器整体可以划分为两个阶段,容器启动阶段,Bean实例化阶段.其中容器启动阶段蛀牙包括加载配置信息.解析配置信息,装备到BeanDefinition中以及其他后置处理,而Bean实例化阶段主要包括实

Spring之IOC容器初始化过程

Ioc容器的初始化是由refresh()方法来启动的,这个方法标志着Ioc容器的正式启动. 具体来说这个启动过程包括三个基本过程: 1.BeanDifinition的Resource定位 2.BeanDifinition的载入与解析 3.BeanDifinition在Ioc容器中的注册 需要注意的是,Spring把这三个过程分开,并使用不同的模块来完成,如使用相应的ResourceLoader.BeanDifinitionReader等模块,通过这样的实际方式,可以让用户更加灵活的对这三个过程进

Java类加载及变量初始化过程

Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就是解决上面3个问题的. 本文前面理论部分比较枯燥,但是如果耐心读完,结合后面的实例,我相信你以后绝对不会再遇到java类初始化这样的疑惑.若有不正之处,请多多谅解并欢迎各位能够给予批评指正,提前谢谢各位. 1. Java虚拟机加载.class过程 虚拟机把Class文件加载到内存,然后进行校验,解析和初始化,最终形成java类型,这就是虚