SPI总线概述1 基本概念 串行外设接口(Serial Peripheral Interface)的简称也叫做SPI,是一种高速、全双工同步通信的一种接口,串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK),但是如果打算实现单向通信也可以只使用3根线(NSS、MISO/MOSI、SCK),就可以利用这种机制实现一对多或者一对一的通信。 ' Y) A7 e- s" t! x 通常SPI通过4个引脚与外部器件相连:
+ G# D+ }4 K6 d i b: v( z 5 h, n2 Q: m' P" y
3 }* P; G& a$ i+ d " X6 u3 z: [! C# j+ Y% [- \
SPI总线采用的环形结构,利用的是主从模式(主机→从机)进行数据的传输,由于是同步通信,所以在主机发送数据的同时也会收到从机发送的数据。 ; V3 N* U5 q3 J% ?4 L% L0 A2 ~* f# f8 N3 W( ]9 \ MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在)。通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。 6 g; U5 l7 x4 k- u NSS的说明:主机的NSS引脚在空闲状态下应处于高电平(VDD),主机发送数据时,主机的NSS应为输出模式,从机的NSS为输入模式,当主机的NSS引脚拉低,从设备的NSS引脚可以检测到低电平,该设备被选中。 # D' c- I2 G x ]0 ] }. ]6 S: Q4 L 从SPI的结构框图中可以看到NSS也是外部引脚的名称,其实控制SPI收发数据是通过内部的NSS信号实现的,而这个内部的NSS信号源可以由SPI_CR1寄存器的SSM(Software slave management)位来配置。 & e6 q4 d' H6 G; U6 M2 n. ~
6 m7 e& H" _+ {4 J ; N1 h; J. ?) U2 Q/ V! U. N5 o# j + `* M; A3 c7 L $ S7 ]% X- H ]5 O) Q
注意:由于SPI外设是全双工同步通信,所以时钟信号就由SCK引脚来生成,SCK引脚只能由主设备控制,从设备是无法控制的,所以SCK引脚输出的脉冲信号的极性和相位就需要进行配置。
SPI_CR寄存器的CPOL(时钟极性位)和CPHA(时钟相位位),能够组合成四种可能的时序关系。
' c" v, j8 _4 N 通过这两位可以得到四种不同的组合,就被作为SPI总线的工作模式(模式0~模式3),到底要选择哪种模式,主机的工作模式必须根据从设备的数据手册的说明进行设置。 在实际的开发过程中,使用最多是模式0和模式3,比如2.4G无线通信模块NRF24L01采用模式0来通信。 5 x' r: Q( e2 }. D! |, a; ~" y# Z: u+ R* J 3.2 数据帧格式
$ ~- J, _% X7 U DFF:数据帧格式 (Data frame format)
LSBFIRST:帧格式 (Frame format)
5 使用流程 6 f' h: P. Z: t 1 k) K. G8 E5 I9 u# H s The SPI HAL driver can be used as follows:* ^1 T# W% F) i |+ G & u& c; }6 D8 P. j0 g/ n (#) **Declare a SPI_HandleTypeDef handle structure**, for example:) b r0 S! g6 }/ K `SPI_HandleTypeDef hspi`;; u7 B1 y$ N: d. ? (#)**Initialize the SPI low level resources** by implementing the `HAL_SPI_MspInit()` API:/ [% H5 g! C @( ~& W8 M9 w7 L (##) **Enable the SPIx interface clock*** f6 D* i0 e3 u- V (##) **SPI pins configuration** (+++) Enable the clock for the SPI GPIOs (+++) Configure these SPI pins as alternate function push-pull (##) **NVIC configuration if you need to use interrupt process**) B) y) P5 ]" \ (+++) Configure the SPIx interrupt priority+ ], h3 r4 A$ J. G4 ~3 K0 U- \# W (+++) Enable the NVIC SPI IRQ handle8 w, O0 P# A3 y6 {' t& z; X (##) **DMA Configuration if you need to use DMA process**5 U, B* K1 \7 C2 M3 v (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel (+++) Enable the DMAx clock) Q; J8 @' R( Q8 r; T (+++) Configure the DMA handle parameters (+++) Configure the DMA Tx or Rx Stream/Channel (+++) Associate the initialized hdma_tx(or _rx) handle to the hspi DMA Tx or Rx handle9 ]: e- L4 J$ \( d# F (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream/Channel1 O! Z! U+ L, @ D% p$ q2 a l; Y. e! A: k5 E) G1 {; y# { (#) **Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS) _$ Y5 V: H, I9 _ management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure.** " Q2 i B" L$ K! e) I4 d- N (#) **Initialize the SPI registers by calling the** `HAL_SPI_Init() API`: (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)9 J2 d' [! v6 }5 i B by calling the customized HAL_SPI_MspInit() API. / [ b* I4 _: h7 j r8 \8 W+ [ 简述如下:
转载自:上下求索电子er 如有侵权请联系删除/ O, M* l3 q* A0 K |
【STM32C0评测】4、驱动Lorasx126x,实现透传
基于STM32的SPI传输时会丢失数据吗?
基于STM32的SPI读取数据的最后位出错问题经验分享
基于STM32关闭SPI会导致WRPERR错误的问题分析
基于STM32关闭SPI导致WRPERR错误经验分享
基于STM32CubeMX的SPI总线经验分享
如何实现基于STM32 SPI+DMAWS2812灯的驱动
基于STM32F030硬件SPI经验分享
基于STM32的经验分享—SPI详解
基于STM32的语经验分享—SPI读写FLASH