一,SPI的简介
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如MSP430单片机系列处理器。
二,SPI的物理层
1.多CS
SCK:时钟线 CS:片选信号
MOSI:主机把向从机写入数据 MISO:主机从从机读取数据
CS:片选信号线,当有多少个从设备,就会有多少个外接线。当从设备的片选拉低的时候,就选中和主设备进行通讯,而其余的设备未被选中则会忽视总线数据上的传输。
SCK:时钟线,用于数据同步,由主机进行发送,决定的数据传输的速度。STM32的SPI的最大速率为fpclk/2。多个设备同时进行通讯的过程,速度受限于低速设备。
MOSI:主设备的输出引脚,从设备的输入引脚。【主设备输出数据,从设备接受数据】
MISO:主设备的输入引脚,从设备的输出引脚。【主设备输入数据,从设备输出数据】
2.菊花链
信号会通过将移位寄存器的数据通过MOSI输出,然后通过MOSI-1引脚进入从机1,在第二个数据命令周期,数据会通过从机1的MISO-1引脚将移位寄存器的数据传入到从机2里面,此时从机1便可以同时的接受来自主机的新命令,以此类推。当三个从机都收到了彼此需要的命令的时候,当检测到CS的上升沿信号,此时对应的从器件会执行自己移位寄存器里面的命令。当片选拉低时,命令不会执行,这就使得我们可以不断的通过一个一个的设备传递命令,直到到达我们需要执行该命令的从器件,去执行命令。
三,SPI的协议层
1.起始信号和终止信号
起始信号:CS片选信号高电平变为低电平,当从机检测到自己的片选拉低后,开始与主机进行通信。
终止信号:CS信号由低电平变为高电平,结束和主机之间的通讯,本次数据交互结束。
2.数据的有效性
数据借助MOSI和MISO进行传输,通过SCK时钟线进行数据的同步传输,数据在每一个SCK时钟周期传输一位数据。数据的输入和输出是同时进行的,发送一个数据也就会接受一个数据。在进行双向通信的时候,一边采用的是“MSB先行”。
3.时钟的相位和极性
SPI_CR寄存器的时钟和极性,出现了四种组合形式。
时钟极性【CPOL】:控制的是设备在空闲状态下的电平状态
CPOL为1:空闲状态为高电平 CPOL为0:空闲状态为低电平
时钟相位【CPHA】:控制采样信号的边沿
CPHA = 1:在SCK时钟的第二个边沿进行采样,同时数据要保持稳定,与此同时,则在第一个边沿进行数据的转换,准备下一次的数据传输。
CPHA = 0:在SCK时钟的第一个边沿进行采样,同时数据要保持稳定,与此同时,则在第二个边沿进行数据的转换,准备下一次的数据传输。
四种组合:
空闲状态为低电平:
CPOL= 0,CPHA = 0 在第一个上升沿采集信号
CPOL = 0,CPHA = 1 在第一个下降沿采集信号
空闲状态为高电平:
CPOL = 1,CPHA = 0 在第一个下降沿采集信号
CPOL = 1,CPHA = 1 在第一个上升沿采集信号
4.外设速率
stm32的SPI外设的速率为fpclk/2。
SPI1挂在在APB2总线上,速率为fpclk2/2 = 36Mbits/s。
SPI2挂在在APB1总线上,速率为fpclk1/2 = 18Mbits/s
5.数据的发送控制
不管是发送还是接收,数据都先会被存放在一个缓存器当中,发送时,先把数据放在发送缓存器中,再发送,接收时,先接收到接收缓存器,再被从设备接收。
不难看出,每次发送一个字节数据,同时也要接收一个字节数据,同步完成。时钟信号由主设备发出。
移位寄存器通过MOSI线将数据传输给从机,从机也通过将移位寄存器的数据通过MISO传输给主机。当主机只读取一个从机的字节的时候,也需要向从机发送一个空字节,但是从机可以忽略这个字节,同理,从机只读取主机的一个数据,也需要向主机发送一个空子节,但是主机可以忽略掉。
发送时:当数据被写入到SPI_DR【发送缓存器】,数据被并行的传送到移位寄存器,然后串行的被移位到MOSI引脚。
接收时:当数据从MISO引脚接收到后,然后串行移位到移位寄存器,数据再从移位寄存器并行的移动到SPI_DR【接收缓存器】。