SPI (Serial Peripheral interface) 串行外围设备接口
SPI特征
3线全双工同步传输,第4根线是片选
8或16位传输帧格式选择
主或从操作
支持多主模式
8个主模式波特率预分频系数(最大为fPCLK/2)
从模式频率 (最大为fPCLK/2)
主模式和从模式的快速通信
主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变
可编程的时钟极性和相位
可编程的数据顺序, MSB在前或LSB在前
可触发中断的专用发送和接收标志
SPI总线忙状态标志
支持可靠通信的硬件CRC
在发送模式下, CRC值可以被作为最后一个字节发送
在全双工模式中对接收到的最后一个字节自动进行CRC校验
可触发中断的主模式故障、过载以及CRC错误标志
支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求
SPI 工作模式
当器件作为主机时,使用一个IO引脚拉低相应从机的选择引脚(NSS),传输的起始由主机发送数据来启动,时钟(SCK)信号由主机产生,通过MOSI发送数据,同时通过MISO接收从机发出的数据。
当器件作为从机时,从机的选择引脚(NSS)被主机拉低后开始,接收主机输出的时钟信号,在读取主机数据的同时通过MISO引脚输出数据。
SPI引脚
MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
SCK:串口时钟,作为主设备的输出,从设备的输入。
NSS:从设备选择。这是一个可选引脚,用来选择主/从设备。它的功能是用来做片选引脚,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准IO引脚来驱动。一旦被使能(SSOE位), NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低;此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚,则会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。当配置为主设备、 NSS配置为输入引脚(MSTR=1, SSOE=0)时,如果NSS被拉低,则这个SPI设备进入主模式失败状态:即MSTR位被自动清除,此设备进入从模式。
MOSI脚相互连接, MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。
主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机,这样两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节,反之,主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
NSS说明
有2种NSS模式
软件NSS模式
SPI主机
可以通过设置SPI_CR1寄存器的SSM位来使能这种模式。在这种模式下NSS引脚可以用作它用,而内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动。
SSI只有在SSM为1时才有效,它决定了NSS上的电平,在NSS引脚上的IO操作无效。也就是说NSS的外部引脚不影响内部引脚,内部引脚值由SSI决定。
设置SPI_CR1寄存器的SSM=1和SSI=1
SSM=1使能软件管理
NSS由内部和外部引脚。
外部引脚做其他用途,如从设备的片选信号。
内部引脚通过SSI位来驱动,SSI=1时,NSS电频拉高。要保持MSTR=1,SPE=1,也就是要保持主机模式,只有内部NSS连接到高电平,这两位才能保持为1.
SPI从机
NSS引脚在完成字节传输之前必须拉低,在软件模式下设置SSM=1,SSI=0.
硬件模式
NSS输出被使能:当STM32F10xxx工作为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成从SPI设备。当一个SPI设备需要发送广播数据,它必须拉低NSS信号,以通知所有其它的设备它是主设备;如果它不能拉低NSS,这意味着总线上有另外一个主设备在通信,这时将产生一个硬件失败错误(Hard Fault)。
NSS输出被关闭:允许操作于多主环境。
时钟信号的相位和极性
SPI_CR1寄存器的CPOL(时钟极性)和CPHA(时钟相位),能够组成四种可能的时序关系。这个位的组合选择数据采样的时钟边缘。
CPOL 位控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。
CPOL = 0,SCK引脚在空闲时为低电平
CPOL = 1,SCK引脚在空闲时为高电平
CPHA = 0,SCK时钟的第一个边沿(CPOL=0下降沿,CPOL=1上升沿)进行数据位的采样,数据在第一个时钟边沿被锁存。
CPHA = 1,SCK时钟的第二个边沿(CPOL=0下降沿,CPOL=1上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。
数据帧格式
根据SPI_CR1寄存器中的 LSBFIRST 位,输出数据位时可以MSB在先也可以LSB在先。
根据SPI_CR1寄存器中的 DFF 位,每个数据帧可以是8位或是16位。
配置SPI为从模式
配置步骤
1. 设置DFF位以定义数据帧格式为8位或16位。
2. 选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系。为保证正确的数据传输,从设备和主设备的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引脚是数据输出。
配置SPI为主模式
在主配置时,在SCK脚产生串行时钟。
配置步骤
1. 通过SPI_CR1寄存器的BR[2:0]位定义串行时钟波特率。
2. 选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系。
3. 设置DFF位来定义8位或16位数据帧格式。
4. 配置SPI_CR1寄存器的LSBFIRST位定义帧格式。
5. 如果需要NSS引脚工作在输入模式,硬件模式下,在整个数据帧传输期间应把NSS脚连接到高电平;在软件模式下,需设置SPI_CR1寄存器的SSM位和SSI位。如果NSS引脚工作在输出模式,则只需设置SSOE位。
6. 必须设置MSTR位和SPE位(只当NSS脚被连到高电平,这些位才能保持置位)。
在这个配置中, MOSI引脚是数据输出,而MISO引脚是数据输入。
状态标志
应用程序通过3个状态标志可以完全监控SPI总线的状态
TXE(发送缓冲器空闲),为1时,发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中,当写入SPI_DR时,TXE被清零。
RXNE(接收缓冲器非空),为1时,接收缓冲器中包含有效的接收数据,读SPI_DR寄存器,可以清零RXNE
BSY(忙),由硬件设置与清除,表示SPI通信层的状态。
SPI 中断
中断事件 事件标志 使能控制位
发送缓冲器空标志 TXE TXEIE
接收缓冲器非空标志 RXNE RXNEIE
主模式失效事件 MODF ERRIE
溢出错误 OVR ERRIE
CRC错误标志 CRCERR ERRIE