特权同学

SPI协议定义

0
阅读(2846)

SD卡手册第5章节学习笔记

 

5.1 SPI总线协议

         SD卡是基于命令和数据流的传输,开启于一个起始位并结束于一个停止位,SPI是基于字节进行传输的。每个命令或者数据是8bit即一个字节,并 与CS信号对齐(多次的8个时钟)。

         SPI信息由命令、响应和数据传输组成。所有主机和从机之间的通信由主机控制。主机通过拉低CS信号开始每个总线传输。

         SPI总线模式的响应不同于SD总线模式有如下三点:

被选中的卡总是对命令做出响应;

使用8或者16位的响应结果;

当卡遇到数据恢复问题,它将会产生一个错误响应,而不是像SD总线模式下的超时响应。

 

5.1.1 模式选择

         SD卡在总线模式中唤醒。在接收复位命令时如果CS信号有效(拉低), 那么将进入SPI模式。如果SD卡认为SD总线模式是必须的,那么它不会对命令做出响应并继续保持SD总线模式。如果是需要SPI模式,SD卡将切换到SPI模式并发出SPI模式下的R1响应。

         返回SD总线模式唯一的方法是 重新给SD卡上电。在SPI模式下,SD卡协议状态机不被检测。所有在SD总线模式支持的命令在SPI模式也是可用的。

         SPI模式下缺省的命令结构/协议是CRC检测关闭。随着SD卡在SD总线模式下上电,CMD0必须紧跟着一个有 效的CRC字节。一旦在SPI模式下,默认将关闭CRC。

         CMD0命令通常是顺次发送:40 00 00 00 00 95(16进制)。

 

5.1.2 总线传输保护

         SPI接口在非保护模式下初始化。主机可以通过CRC_ON_OFF命 令(CMD59)开启或关闭保护模式。

 

5.1.3 数据读取

         SPI模式支持单块和多块的数据读取操作(CMD17和CMD18)。当SD卡接收到一个有效的读 命令时,它将发出响应并随之发送完成早先定义在SET_BLOCK_LENGTH(CMD16)命令里的相应长度数据。


         最大块长度如定义在READ_BL_LEN(CSD参数)的512字节。块长度可以定 义在1到READ_BL_LEN之间的任何数。

         起始地址可以定义为SD卡有效地址范围内的任 意地址。然而,每个块必须被包含在一个单一的物理卡断里。

 

5.1.4 数据写入

         SPI模式下,SD卡支持单块或者多块写 入操作。在接收到一个有效的写命令(CMD24或者CMD25)后,SD卡将做出响应并等待从主机传输过来的数据块。有效的块长度是512字节。设置一个更小的块长度将会导致下一个写命令出错。


         每个数据块有个start block的 传输(一个字节)。SD卡接收到数据块后将会发出一个数据响应并且如果数据接收无误,那么它将被写入。只要SD卡忙于数据写入,一个持续的忙信号将会发送给主机(有效保持dataout线为低)。

         一旦写入操作完成,主机必须使用SENT_STATUS(CMD13)命令检测写入结果。一些错误(地址溢出、写保护违规等等)只会在写入期间被检测到。

         在多块写入操作中,停止写入将发生在下一个块写入开始时发送“Stop Tran”取代“Start Block”。


         当SD卡忙时,复位CS信号并不会终止写入操作。SD卡释放dataout线并继续写入。如果在写入完成前不再片选SD卡,dataout线将会被强制拉低并拒绝所有命令。

         SD卡复位(CMD0)将会终止任何悬 挂着或者激活操作。这将会SD卡的数据格式。主机有责任包含SD卡。

 

5.1.5 擦除和保护管 理

 

5.1.6 读CID/CSD寄存器

         与SD总线协议不同(发送的 寄存器内容包含命令响应),SPI模式下读CID和CSD寄存器是纯粹的读块传输。SD卡将会发出一个标准的 响应,随后发送一个末尾包含16位CRC的16字节字节数据块。

 

5.1.7 复位顺序

         SD卡需要一个预定好的复位顺序。上电复位后或发送完CMD0命令(软件复位命令),SD卡进入IDLE状态。这个状态下主机合法的命令只有CMD1(SEND_OP_COND),ACMD41(SD_SEND_OPCND),CMD59(CRC_ON_OFF)和CMD58(READ_OCR)。

         主机必须不断查询SD卡(通过不断发送CMD1命令)直到SD卡响应的“in-idle-state”位(被设置为0)指示SD卡完成初始化步骤并准备好进入下一个命令。

         然而,在SPI模式下CMD1没有操作数并且不返回OCR寄存器的内容。取而 代之的,主机可以使用CMD58(仅用于SPI模式)读取OCR寄存器。主机有职责阻止在SD卡不支持的电压范围内 被访问。

 

5.1.8 时钟控制

         SPI主机可以使用SPI总线时钟信号使得SD卡进入低功耗模式或者或者控制总线的数据流(以避免过慢或过快传输)。允许主机改变时钟频率或关闭时 钟。

         以下是SPI主机必须遵守的一些 约定:

1.       总 线频率可以在任何时候被改变(低于SD卡本身所限定的最大数据传输率);

2.       SD卡的数据输出和响应明 显都是需要时钟的运行的。在SPI总线传输的最后,主机需要给SD卡操作完成提供8个周期的时钟信号。在这8个时钟周期内,CS信号值是不相关的,它可以有效也可以无效。以下是各种SPI总线传输需要的额外时钟罗列:

—  命令及响应后。SD卡响应结束位后8个时钟,在这8个时钟周期内CS信号值可以有效也可以 无效。

—  读数据传输。最后一个数据块的读取后的8个时钟周期。

—  写数据传输。CRC状态后的8个时钟周期。

 

5.2 SPI命令设置

5.2.1 命令格式

         所以的SD卡命令是6个字节长,并且高位在前传输。


5.2.2 命令分类

         略