⑴ 关于spi模式的命令
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:读操作-数据错误
⑵ nrf24l01模块中c程序spi问题 reg_val = SPI_RW(0);
不是的
,spi_rw(reg)返回的值不是a的值,这里返回的值没有意义是被丢弃掉了的,紧接着下一次spi_rw(0)返回的才是。
一次spi操作一般在cs(片选)的一个周期进行,
在读取寄存器值时一般需要调用2次以上的spi_rw,
比如读取寄存器reg,
首先
拉低cs线(片选)->调用spi_rw(reg),这里的reg实际上是0...1111按位与上reg,因为reg这个地址没有用到最高位,最高位为0代表读地址操作,1代表写地址操作。->再次调用spi_rw(0)
,这里为0是因为读操作,如果是写那么就是写地址reg的值,即spi_rw(val)
->拉高cs线结束spi操作。
spi读写时是先写地址与操作或命令的一个byte,再读写值的一个byte,也就是clk周期是2个byte也就是2*
8bit
=
16个周期的。
地址与操作的一个byte:这个字节的最高位是控制读写的,读写分别为
0b0xxxxxxx或0b1xxxxxxx
的形式,
xxxxxxx中的最后几位是地址。中间几位是spi命令。
值的一个byte:
如果是读,那么全为0,如果是写,那么就是要写的值。如果是命令就看命令的定义了。
在时钟线电平的上升yuan写1位,的在时钟下降yuan读1位的,当这8个时钟周期完结那么就得到了8位正好一个字节。当然如果寄存器的数据宽度是2个字节时,相应的这里就要是16个时钟周期2个字节。
没用过nrf24l01模块,但一般spi的过程就是这样,关键要看你要访问的模块的spec文档,里面都描述了这些读写,控制的时序图。
⑶ 单片机的SPI通信怎么用
一个前提,就是时钟线始终是主机来产生的如果你是使用单片机内部SPI模块的话只要往主机的发送寄存器里面放入一个字节,主机会在时钟线自动产生8个脉冲,当主机的时钟线,产生8个脉冲的时候,那么此时 主机 从机发送寄存器发出一个字节 接收寄存器接收到主机发送的字节接收寄存器接收从机发送的一个字节 发送寄存器发出一个字节至于哪些数据是你要的,哪些数据是不要的,这个就根据你的数据通讯规范来选取了一般来说,主机在发送给从机的命令的时候,此时主机接收寄存器的接收到的数据是没有用的,那就不去出来,如果要让从机发送一个数据回来,那就随便往发送寄存器里面写入一个数据,让时钟线自动产生8个脉冲,从而让从机把他发送寄存器的数据移动主机的接收寄存器来
⑷ CAD中spI是什么命令
楼上不对
spline的abbr是spL,不是spI,SPi是螺旋线命令 即三维建模环境中的helix
如图