SPI通信分析
Posted 皇甫春云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPI通信分析相关的知识,希望对你有一定的参考价值。
SPI通信分析
许久不更,想你们了。
SPI 模式的配置
-
SPI通信配置
STM官方的芯片手册中对于SPI通信模式的配置过程,CPHA和CPCL的配置对于通信模式的影响如下图所示:
note :中断模式下的连续从机数据传输。
STM32通信接口介绍:
对于STM32F103ZET6配置:
Up to 13 communication interfaces
– Up to 2 × I2C interfaces (SMBus/PMBus)
– Up to 5 USARTs (ISO 7816 interface, LIN,
IrDA capability, modem control)
– Up to 3 SPIs (18 Mbit/s), 2 with I2S
interface multiplexed
– CAN interface (2.0B Active)
– USB 2.0 full speed interface
– SDIO interface
对于 STMF407ZET6配置:
Up to 15 communication interfaces
– Up to 3 × I2C interfaces (SMBus/PMBus)
– Up to 4 USARTs/2 UARTs (10.5 Mbit/s,
ISO 7816 interface, LIN, IrDA, modem
control)
– Up to 3 SPIs (37.5 Mbits/s), 2 with muxed
full-duplex I2S to achieve audio class
accuracy via internal audio PLL or external
clock
– 2 × CAN interfaces (2.0B Active)
– SDIO interface
任务要求:
SCLK: 高于4Mhz
MISO:速度高于2Mbps
note :要求数据要连续传输大约192+1字节,而SPI通信,需要分字节传送数据帧。另外还得兼顾MOSI引脚的配置,和CS片选信号的使用。
寄存器配置:
F4的无线接口的引脚定义:
F1的无线引脚的定义:
对于SPI通信的特点:
- 所有的通信过程都是有主设备进行发起。
- 在通信配置上,主从设备必须在同一时序模式下进行。即配CPOL 和CPHA.
- 在主从通信前,需要先使能从设备,然后才是主设备的SCK发出时钟信号。
- 在TI模式下,主设备不用设置CPOL和CPHA。以及配置LSBFIRST位来定义帧格式。
- SPI的半双工通信模式可以配置为包含一条时钟和一条数据线(只接受或只发送)。
- 在主机启动数据的发送前,需要从机先用软件将数据存储到其内部的发送缓冲区中,然后再启动SPI通信。
- 在只发送模式下,应用程序只需要忽略接收缓冲区,而接收管脚可以作为普通的IO使用。
- 为了达到最大的传输速度,可以使用DMA进行发送缓冲区数据的更新操作。(ADC的数据也支持DMA的数据传送)
速度测量:
数据分帧:
对于SPI通信而言,一次最多传输32 字节的数据。
SPI每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。
-
SPI半双工通信下的从机中的只发送模式(MISO上发送数据)
验证工作:
分为两个部分,第一是用两个单片机进行通信,测试通信的速率最大是多少;第二步是将主机换成FPGA,而从机依旧是用单片机,进行传输速度的测试。
第一步单片机的SPI通信:
主机:配置为单向只接受模式
单向只接收过程(BIDIMODE=0 且 RXONLY=1)
在此模式下,可以按如下所述简化过程(参见图 282):
- 将 SPI_CR2 寄存器中的 RXONLY 位置 1。
- 通过将 SPE 位置 1 使能 SPI:
a) 在主模式下,这会立即激活 SCK 时钟的产生,并以串行方式接收数据,直到关闭
SPI (SPE=0)。
b) 在从模式下,当 SPI 主器件将该从器件的 NSS 驱动为低电平并输出 SCK 时钟时,
接收数据。- 等待 RXNE=1,然后读取 SPI_DR 寄存器以获取接收的数据(此操作会将 RXNE 位清 零)。对每个要接收的数据项重复此操作。
此外,还可以使用在 RXNE 标志所产生的中断对应的中断子程序来实现该过程。
注意:如果需要在最后一次传输后关闭 SPI,请采纳第 740 页的第 27.3.8 节:关闭 SPI中所述的 建议。
从机:配置为单向只发送模式
只发送模式下的数据发送过程(BIDIMODE=0、RXONLY=0)
在此模式下,可以按下文所述简化过程,并且可使用 BSY 位等待发送完成(参见图 280 和 图 281)。
1.通过将 SPE 位置 1 来使能 SPI。
2. 将第一个要发送的数据项写入 SPI_DR 寄存器(此操作会将 TXE 标志清零)。
3. 等待至 TXE=1,然后写入下一个要发送的数据项。对每个要发送的数据项重复此步骤。
4. 将最后一个数据项写入 SPI_DR 寄存器后,等待至 TXE=1,然后等待至 BSY=0,这表 示最后的数据发送完成。
此外,还可以使用在 TXE 标志所产生的中断对应的中断子程序来实现该过程。
注意:在不连续通信期间,在对 SPI_DR 执行写操作与 BSY 位置 1 之间有 2 个 APB 时钟周期的延 迟。因此,在只发送模式下,写入最后的数据后,必须先等待 TXE 位置 1,然后等待 BSY 位清零。
在只发送模式下,发送两个数据项后,SPI_SR 寄存器中的 OVR 标志将置 1,因为始终不会 读取接收的数据。
SPI通信的总线检测信号:
发送缓冲区为空 (TXE)
此标志置 1 时,表示发送缓冲区为空,可以将待发送的下一个数据加载到缓冲区中。对 SPI_DR 寄存器执行写操作时,将清零 TXE 标志。
接收缓冲区非空 (RXNE)
此标志置 1 时,表示接收缓冲区中存在有效的已接收数据。读取 SPI_DR 时,将清零该 标志。
BUSY
BSY 标志由硬件置 1 和清零(对此标志执行写操作没有任何作用)。BSY 标志用于指示 SPI 通信的状态。
在以下情况硬件将清零该标志:
● 传输完成时(主模式下的连续通信除外)
● 关闭 SPI 时
● 发生主模式故障时 (MODF=1)
当通信不连续时,BSY 标志在各通信之间处于低电平。
当通信连续时:
● 在主模式下,BSY 标志在所有传输期间均保持高电平
● 在从模式下,BSY 标志在各传输之间的一个 SPI 时钟周期内变为低电平
注意:请勿使用 BSY 标志处理每次数据发送或接收,最好改用 TXE 标志和 RXNE 标志。
如何使能USART的SPI模式?可细分为两种模式,也就是USART可以当作SPI的MASTER(主机模式),还可以当作SPI的SLAVE(从机模式)。
这里,需要大家注意一下,并不是所有的STM32都可以当作SPI的从机模式,目前主要是STM32L4+和STM32H7这两个系列可以支持SPI的从机模式,其他的都仅支持SPI的主机模式。简而言之,L4和H7系列是既支持主机模式又支持从机模式。
以上是关于SPI通信分析的主要内容,如果未能解决你的问题,请参考以下文章
SPI通信协议:单片机spi通信接口什么意思,spi接口干什么用的?