【自学嵌入式:stm32单片机】SPI通信外设

SPI通信外设

SPI通信外设简介

  • STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担

  • 可配置8位/16位数据帧、高位先行/低位先行(最常用的是8位数据帧,高位先行)

  • 时钟频率: \(f_{\text{PCLK}} / (2, 4, 8, 16, 32, 64, 128, 256)\) (这些数字是分频系数)

  • 支持多主机模型、主或从操作

  • 可精简为半双工/单工通信(单工就是单独拿掉发送数据线或者单独拿掉接收数据线)

  • 支持DMA

  • 兼容I2S协议(数字音频传输协议)

  • STM32F103C8T6 硬件SPI资源:SPI1、SPI2,SPI1挂载在APB2,PCLK是72M,SPI2挂载在APB1,PCLK是36M

SPI框图

image
image
如上图,左上角这部分是数据寄存器和移位寄存器配合的过程,和之前的硬件I2C的框图类似。
image
右下角这部分是控制逻辑,寄存器的哪些位,控制哪些部分,会产生哪些效果,可以参照手册。

数据寄存器和移位寄存器配合的过程

image
先看移位寄存器,数据一位一位地从MOSI移出去,然后MISO的数据一位一位地移入左边的数据高位,达到一种交换数据的效果,图上展示的是一种低位先行的状态,LSBFIRST控制位可以控制是低位先行还是高位先行,高位先行就是输出从左边移出去,输入用右边移进来
image
MSB是高位的意思,LSB是低位的意思
image

这里MOSI和MISO做了个交叉,这一块主要是用来进行主从模式引脚变换的,这个SPI外设可以做主机也可以做从机,做主机时,这个交叉就不用,做从机时候,启用交叉连接,MOSI就变成从机输入,走输入那一路。MISO编程从机输出,走输出那一路,如下图:
image

image

这两个缓冲区,实际上就是接收数据寄存器RDR和发送数据寄存器TDR,和之前硬件I2C的数据缓冲区类似,和串口那里意义,TDR和RDR占用同一个地址,统称为DR
image

写入DR时,数据从上图蓝色指示的方向,写入到TDR,读取DR时,数据从RDR读出,数据寄存器和移位寄存器打配合,可以实现连续的数据流
image

具体流程就是,比如我们需要连续发送一批数据,第一个数据写入到TDR,当移位寄存器没有数据移位时,TDR的数据会立刻转入移位寄存器,开始移位,这个转入时刻,会置状态寄存器的TXE为1,表示发送寄存器为空,当检查TXE置1后,紧跟着,下一个数据,就可以提前写入到TDR里候着了,一旦上一个数据发完,下一个数据就可以立刻跟进,实现不间断的连续传输,然后移位寄存器这里,当数据过来了,它就会自动产生时钟,将数据移出去
image

在移出的过程中,MISO的数据也会移入,一旦数据移出完成,数据移入也完成,这时,移入的数据就会整体地从移位寄存器转入到接收缓冲区RDR,这个时刻,会置状态寄存器的RXNE为1,表示接收寄存器非空,当我们检查RXNE置1后,就要尽快把数据从RDR读出来,在下一个数据到来之前,读出RDR,就可以实现连续接收,否则下一个数据已经收到的清空下,上一个数据还没从RDR中读出来,那RDR的数据就会被覆盖

控制逻辑

image
波特率发生器用来产生SCK时钟,其内部就是一个分频器,输入时钟是PCLK,72M或36M,经过分频器之后,输出到SCK引脚,当然这里生成的时钟肯定是和移位寄存器同步的了,每产生一个周期的时钟,移入移出一个bit
image
image

然后右边,CR1寄存器的三个位BR0、BR1、BR2,用来控制分频系数,

image
LSBFIRST,决定高位先行还是低位先行;SPE(SPI ENABLE)是SPI使能,就是SPI_Cmd函数配置的位;BR(Baud Rate)配置波特率,就是SCK时钟频率,MSTR(Master)配置主从模式(1是主模式,0是从模式,一般用主模式),CPOL和CPHA,这个之前讲过,用来选择SPI的4种模式

image
然后这里SR状态寄存器,最后两位,TXE位发送寄存器空,RXNE接收寄存器非空,CR2寄存器都是一些使能位,中断使能DMA使能等等...

image
最后这里有个NSS引脚,SS就是从机选择,低电平有效,所以这里前面加了个N,这里的NSS更偏向于实现多主机模型,这个NSS不会用到,SS引脚我们直接使用一个GPIO模拟就行

SPI基本结构

image

主模式全双工连续传输

CPOL = 1,CPHA = 1,使用SPI模式3,这里演示的是低位先行的模式
image
这个传输效率高,但是比较复杂,不利于封装,实际上用非连续输出
image
这个发送的是交错的,发送数据2后才接收数据1。

非连续传输

image
image

它的缺点是在这个位置没有及时把下一个数据写入TDR等着,所以等到第一个字节时序完成后,第二个字节还没有送过来,那数据传输就会在这里等着,所以这里时钟和数据的时序在字节和字节之间会产生间隙,拖慢了整体数据传输的速度,这个间隙,在SCK频率低的时候,影响不大,但是在SCK频率非常高时,间隙拖后腿的现象,就比较严重了

软件/硬件波形对比

软件波形

image

硬件波形

image

SCK下降沿数据移出,上升沿数据移入,无论是下降沿变化还是低电平期间变化,它们都是一个意思,下降沿和低电平期间都可以作为数据变化的时刻,只是硬件波形一般会紧贴边沿,软件波形,一般只能在电平期间,当然无论是哪种方式,最终都不会影响数据传输

posted @ 2025-08-24 09:00  秦瑞迁  阅读(62)  评论(0)    收藏  举报