物理层
SPI总线是一种高速的同步全双工总线,支持一主多从的模式,一个SPI总线有四个信号线,分别是SCK时钟线,MOSI主机信号输出线,MISO从机信号输出线,CN/NSS从机使能信号线,一个从机对应一个CN/NSS。
协议层
除从机信号输出线之外,其他的信号线均由主机进行控制,其中,MOSI和MSIO线上的数据仅仅只在NSS为低的时候有效。

NSS线由主机控制,空闲的时候置位高电平,而起始信号为低电平,每一个时钟周期内进行一个数据的采样操作。时钟线的上升沿或者下降沿会引发触发或者采样工作,确保在信号线稳定的时候采取数据。通过配置CPOL或者CPHA可以来实现四种采样模式的配置。
1.CPOL=1时,SCK在空闲状态保持低电平
2.CPOL=2时,SCK在空闲状态保持高电平
CPHA=0时,在SCK的第一个沿进行采样
CPHA=1时,在sck的第二个沿进行采样
在一个SCK周期内,主从机会分别读取一位数据同时发送一位数据。发送和接受数据通过移位寄存器来实现,数据依次按照从低位到高位的顺序进行交换。
STM32的SPI外设

开启或者关闭SPI通信可以用软件进行管理或者硬件进行管理。通过设置SPI_CR1寄存器的SSM位可以使能软件触发,此时NSS引脚的电平可以由SSI位控制。通过SPI_CR2寄存器的SSOE位控制硬件使能模式,当他拉低NSS引脚的时候代表他将作为主机进行通信。
可以发送8位或者16位的信号,由SPI_CR1寄存器的DFF位进行选择。主机从机的SPI设置需要保持一致。
配置SPI为从模式
配置步骤
1. 设置DFF位以定义数据帧格式为8位或16位。
2. 选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系(见图212)。为保证正确
的数据传输,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。
3. 帧格式(SPI_CR1寄存器中的LSBFIRST位定义的”MSB在前”还是”LSB在前”)必须与主设备
相同。
4. 硬件模式下(参考从选择(NSS)脚管理部分),在完整的数据帧(8位或16位)传输过程中,
NSS引脚必须为低电平。在NSS软件模式下,设置SPI_CR1寄存器中的SSM位并清除SSI
位。
5. 清除MSTR位、设置SPE位(SPI_CR1寄存器),使相应引脚工作于SPI模式下。
在这个配置中, MOSI引脚是数据输入, MISO引脚是数据输出
写数据时,写入数据到发送缓冲器后,开始发送,将整个数据传入移位寄存器,将TXE标志置位,可以产生中断,之后逐位传输。
读数据的时候,数据一位一位进入移位寄存器,数据接收完全之后移动到接收缓存器,将RXNE标志置位,可以产生中断。读SPI_DR寄存器时,SPI返回缓存的数据。
试图写发送缓存器的时候,需要确认TXE标志位为1.
应用程序通过3个状态标志可以完全监控SPI总线的状态。
发送缓冲器空闲标志(TXE)
此标志为’1’时表明发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中。当写入SPI_DR
时, TXE标志被清除。
接收缓冲器非空(RXNE)
此标志为’1’时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。
忙(Busy)标志
BSY标志由硬件设置与清除(写入此位无效果),此标志表明SPI通信层的状态。
小马哥四轴学习平台SPI的应用代码举例说明
dragon fly四轴平台使用SIR2401作为2.4G无线通信模块。

初始化代码,如果选择使用硬件控制SPI,需要调用SPI_SSOutputCmd(SPI2,ENABLE),软件控制则不需要。

读写信息
使用SIR2401的时候需要吧NRF_CE引脚置高电平,不工作的时候置低电平。接受数据完成之后,NRF_IRQ引脚会有电平的变化。

包控制字的长度为9bit,数据包长度6bit,PID 1bit,NO_ACK 1bit
pid告诉接收端是新的包还是重发的包,自动累加。
、NO——ACK为1时,不需要回执。需要先配置FEATURE寄存器中EN_DYN_ACK位为1,且使用W_TX_PAYLOAD_NACK命令写fifo。
负载数据最高32字节
SPI的时钟空闲状态为低电平,CPOL=1,在第一个时钟沿进行采集,CPHA=0




