串行外设接口(Serial Peripheral Interface)的简称也叫做SPI,是一种高速、全双工同步通信的一种接口,串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK),但是如果打算实现单向通信也可以只使用3根线(NSS、MISO/MOSI、SCK),就可以利用这种机制实现一对多或者一对一的通信。
通常SPI通过4个引脚与外部器件相连:
SPI总线:单一主机对单一从机
SPI总线:单一主机对复合从机
SPI总线采用的 环形结构 ,利用的是主从模式(主机→从机)进行数据的传输,由于是同步通信,所以在主机发送数据的同时也会收到从机发送的数据。
MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在)。通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。
NSS的说明:主机的NSS引脚在空闲状态下应处于高电平(VDD),主机发送数据时,主机的NSS应为输出模式,从机的NSS为输入模式,当主机的NSS引脚拉低,从设备的NSS引脚可以检测到低电平,该设备被选中。
从SPI的结构框图中可以看到NSS也是外部引脚的名称,其实控制SPI收发数据是通过内部的NSS信号实现的,而这个内部的NSS信号源可以由SPI_CR1寄存器的SSM(Software slave management)位来配置。
注意:由于SPI外设是 全双工同步通信 ,所以时钟信号就由SCK引脚来生成, SCK引脚只能由主设备控制,从设备是无法控制的 ,所以SCK引脚输出的脉冲信号的极性和相位就需要进行配置。
SPI_CR寄存器的CPOL(时钟极性位)和CPHA(时钟相位位),能够组合成四种可能的时序关系。
CPOL | CPHA | 模式说明 |
---|---|---|
0 | 0 | 该模式指的是SCK引脚在空闲状态下为低电平,并且在第一个时钟边沿(上升沿)采集数据,在第二个时钟边沿(下降沿)来修改数据。 |
0 | 1 | 该模式指的是SCK引脚在空闲状态下为低电平,并且在第二个时钟边沿(下降沿)采集数据,在第一个时钟边沿(上升沿)来修改数据。 |
1 | 0 | 该模式指的是SCK引脚在空闲状态下为高电平,并且在第一个时钟边沿(下降沿)采集数据,在第二个时钟边沿(上升沿)来修改数据。 |
1 | 1 | 该模式指的是SCK引脚在空闲状态下为高电平,并且在第二个时钟边沿(上升沿)采集数据,在第一个时钟边沿(下降沿)来修改数据。 |
通过这两位可以得到四种不同的组合,就被作为SPI总线的工作模式( 模式0~模式3 ),到底要选择哪种模式,主机的工作模式必须根据从设备的数据手册的说明进行设置。
在实际的开发过程中,使用最多是模式0和 模式3 ,比如2.4G无线通信模块NRF24L01采用模式0来通信。
DFF :数据帧格式 (Data frame format)
LSBFIRST :帧格式 (Frame format)
The SPI HAL driver can be used as follows:
(#) **Declare a SPI_HandleTypeDef handle structure**, for example:
`SPI_HandleTypeDef hspi`;
(#)**Initialize the SPI low level resources** by implementing the `HAL_SPI_MspInit()` API:
(##) **Enable the SPIx interface clock**
(##) **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**
(+++) Configure the SPIx interrupt priority
(+++) Enable the NVIC SPI IRQ handle
(##) **DMA Configuration if you need to use DMA process**
(+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel
(+++) Enable the DMAx clock
(+++) 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 handle
(+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream/Channel
(#) **Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS
management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure.**
(#) **Initialize the SPI registers by calling the** `HAL_SPI_Init() API`:
(++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
by calling the customized HAL_SPI_MspInit() API.
简述如下:
SPI_HandleTypeDef
句柄结;HAL_SPI_MspInit()
初始化 SPI 低级资源; HAL_SPI_Init()
初始化 SPI 寄存器:全部0条评论
快来发表一下你的评论吧 !