关于spi模式的命令

关于spi模式的命令,第1张

7 SPI模式

7.1 介绍

SPI模式由一个由基于闪存SD存储卡提供的次要通信协议组成.此模式是SD存储卡协议的子集。此接口在上电(CMD0)后的每一个复位命令期间被选择。

SPI标准只定义物理链接,而不提供数据传输协议。SD存储卡SPI执行利用SD存储卡协议和命令集的子集。

7.2 SPI总线协定

SD卡是基于命令和数据流,这些命令和数据流以一个起始位开始,以停止位结束的.SPI通道是面向字节的.每个命令或数据块都是由多个8位字节构成,且每个字节与CS片选信号对齐(例蚂州如:此长度是8时钟周期的倍数)。

类似于SD存储卡协议,SPI短信是由命令,响应和数据块环组成。所有的通信都由主机控制,主机通过拉低CS来启动每个总线事务。

SPI模式下的响应行为有三个方面和SD模式不同:

1、被选择的卡总是回应命令。

2、使用附加的(8位)响应结构。

3、当卡遇到一个数据检索问题时,它会用一个响应错误来回应(替换预期的数据块),而不是SD模式中的超时。

除了命令响应之外,每一个在写 *** 作期间发送到卡的数据块将以一个特殊的数据响应令牌来被响应。一个数据块可能和一个写块(WRITE_BL_LEN)一样大,也可能和一个信号字一样小。部分块的读/写 *** 作都被卡中CSD寄存器中所叙述的被选择的项使能。

7.2.1 模式选择

SD卡从SD模式中唤醒。如果CS信号在复位命令(CMD0)被接收期间被拉低,并进入空闲模式,如果认为是SD模式被需求则不会响应此命令,仍在SD模式下。如果SPI模式被需求,则卡将会切换到SPI,且用SPI模式R1响应。

唯一返回SD模式的方法是进入上电周期。在SPI模式下,SD存储卡协议状态机不被遵守。所有的在SPI模式下被支持的SD存储卡命令闷塌蔽总是可用的。

7.2.2 总线传输保护

每个在总线上传输的SD存储卡令牌被CRC位保护。在SPI模式下,SD存储卡提供一个非保护模式。此模式使系统用可靠的数据链接来建立,以排除(否定)硬件或软件需要执行CRC生成和校验功能。

在非衫扰保护模式下,命令、响应和数据令牌的CRC位在令牌中仍被需要,尽管,对于发送器,它们被定义成“don't care”,且被接收器忽略。

在非保护模式下,SPI接口被初始化。尽管,RESET命令用于使卡切换到SPI模式,但它是在SD模式下被卡接收,所以,必须有一个有效的CRC域。

因为CMD0没有参数,所有的域的内容(包括CRC域)都是常数,不需要在运行时间计算出来。一个有效的复位命令是:

0x40,0x0, 0x0, 0x0, 0x0,0x95

主机可以用CRC_ON_OFF命令(CMD59)开关卡的CRC选项。

7.2.3 读数据

SPI支持单块读和多块读 *** 作(在SD存储卡协议中的CMD17 OR CMD18)。当接收一个有效的读命令后卡将在一个在SET_BLOCK_LEN(CMD16)定义了长度的数据令牌之后,用一个响应令牌作出回复。(参考Figure41)

Figure41 单块读 *** 作

一个有效的数据块被添加了一个16位CRC,此CRC由CCITT标准多项式X16+X12+X5+1生成。

能被READ_BL_LEN给出的最大的块的的长度大CSD中定义了。如果片块被允许,块长度可以是1~MAX块大小之间的任何长度。否则,数据读的有效块长度只是在READ_BL_LEN中给出的值。

起始地址可以是在卡的有效地址范围内的任何字节地址。但是,每一个块,必须包含入一个单一的物理卡扇区中。

如发生一个可修复错误,卡不会传输任何数据,而是发送一个特定的数据错误令牌到主机。

Figure42:读 *** 作-数据错误

从sd卡的初始化说起吧,只说初始化流银野程以及一些细节问题(spi模式)。

1、第一步,在将spi模块初始化好之后,将spi速度设为低速模式,我这里用的是250k

2、保持select脚为高电平,并向SD卡发送不低于74个时钟脉冲,此时sd卡将进入它的native operation mode(翻译为本地 *** 作模式了),并做好接收本地指令的准备。

3、此时将select脚拉低并向SD卡发送cmd0指令,SD卡在检测到select脚为低并收到cmd0指令后将进入spi模式,并返回0x01空闲状态。

4、成功进入空闲状态后,继续发送cmd8指令,携带的参数为0x000001AA,如果SD卡不能识别并返回错误码5,说明此卡非2.0卡(进入步骤6)。如果指令能被识别,则SD卡将返回R1+32位共40位数据,其中R1位0x01,32位数据为0x000001AA。此时可判断卡为2.0卡。

5、判断为2.0卡后,紧接着发送cmd55+acmd41指令(应该是在cmd55返回1的情况下再接着发送acmd41),如果返回0,则初始化成功。此时如果你想继续判断是标准2.0卡SCSD还是大容量HCSD,则需要继续发送cmd58指令,并在cmd58指令被成功响应后连续从SD卡读取4个字节的ocr数据,若其第31位为1,表示初始化成功,其第30位为1表示是HCSD,为0表示SCSD。 此时2.0卡初始化结束。

6、步骤4对cmd8无响应,则继续判断卡为1.0或mmc卡。此时同步骤5一样向卡发送cmd55+acmd41指令,如果返回0,则表示1.0卡初始化成功,如果返回错误,则确定卡为mmc卡。 在确定卡为mmc卡后,继续向卡发送cmd1指令,如果返回0,则含搏猛mmc卡初始化成功,否则失败,判断为错卡!!

7、初始化成功后,将spi切换为高速模式,我这里用的是4m。

至此,SD卡初始化过程就结束了,记得几点:在发送cmd函数后,记得补偿时钟;在读寄存器位时,需要select拉低;初始化时,一定要是低速模式并且有超过74个时钟脉冲!

注:在测试的过程中,也是遇到了些比较蛋疼的问题,我手里有3张卡,2张8ghc,1张2gsc。这两张8g卡在读ocr时,其最高字节一直返回0x80,也就是说从ocr上面判断不出谈桥是HC大容量卡,那张2g卡返回也是0x80是正常的。  于是找啊找查啊查,究竟是哪里出问题了。最后实在是差不出来,重新买了个新的HC,还好,果然成功了,ocr最高字节终于为0xc0。 所以说就是提醒大家在测试过程中,多找些,多对比现象。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12489925.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存