SPI通信外设

1,805 阅读6分钟

1.SPI外设介绍

  • 时钟频率就是SCK波形的频率,时钟频率一般体现的是传输速度,一个SCK时钟交换一个Bit。单位是Hz或者bit/s。可以看出来,SPI的时钟其实就是由pclk分频得来的,pclk就是外设时钟,APB2的PCLK就是72MHz,APB1的PCLK是36MHz。

    • **注意事项:**一是这个频率数值并不是任意指定的,它只能是PCLK执行分频后的数值就只有这八个选项。 二是SPI1和SPI2挂载的总线是不一样的,SPI1挂载在APB2,PCLK是72MHz,SPI1挂载在APB1,PCLK是36MHz,所以同样的配置,SPI1的时钟频率要比SPI2的大一倍。
  • **单工:**单工指的是数据只能单向传递 **半双工:**半双工指的是数据可以双向不同时传递

  • **支持DMA:**可帮助大量数据快传

  • 兼容I2S协议:是一种数字音频信号传输专用协议、

2.SPI框图

接下来看一下SPI的框图,我们可以大致把它分成两部分,左上角这一部分就是数据寄存器和移位寄存器打配合的过程。然后剩下右下角这一部分,就是一些控制逻辑寄存器。 ####主从模式引脚变换 这里画了个方框,里面把MOSI和MISO做了个交叉,这一块主要是用来进行主从模式引脚变换的。我们这个SPI外设可以做主机,也可以做从机,做主机时这个交叉就不用,MOSI为MO,主机输出,MISO为MI,主机输入,这是主机的情况。

如果我们STM32作为从机的话,MOSI为SI,从机输入,这时他就要走交叉的这一路,输入到移位寄存器,同理MISO为SO,从机输出,这时输出的数据也走交叉的这一路输出到MISO

####接收发送缓冲区

  • 接收发送缓冲区,这两个缓冲区实际上就是数据寄存器DR,下面发送缓冲区就是发送数据寄存器TDR,上面接收缓冲区就是接收数据寄存器RDR,TDR和RDR占用同一个地址,统一叫做DR

    • 写入DR时,数据写入到TDR,读取DR时,数据从RDR读出,数据寄存器和移位寄存器打配合,可以实现连续的数据流。
  • 具体流程:比如我们需要连续发送一批数据,第一个数据写入到TDR,当移位寄存器没有数据移位时,TDR的数据会立刻转入移位寄存器,开始移位,这个转入时刻,会置状态寄存器的TXE为1,表示发送寄存器空,当我们检查TXE置1后,紧跟着下一个数据就可以提前写入到TDR里侯着了,一旦上个数据发完,下一个数据就可以立刻跟进,实现不间断的连续传输。然后移位寄存器,这里一旦有数据过来了,它就会自动产生时钟将数据移出去,在移出的过程中,MISO的数据也会移入,一旦数据移出完成,数据移入也完成了,这时移入的数据就会整体的从移位计算器,转入到接收缓冲区RDR,这个时刻会置状态寄存器器的RXNE为1,表示接收计寄存器器非空。当我们检查RXNE置1后,就要尽快把数据从RDR读出来,在下一个数据到来之前,读出RDR就可以实现连续接收。否则如果下一个数据已经收到了,上个数据还没从RDR读出来,那RDR的数据就会被覆盖,就不能实现连续的数据流了。


####控制逻辑寄存器 右下角是一些控制逻辑,首先是波特率发生器,这个主要就是用来产生SCK时钟的,它的内部主要就是一个分频器,输入时钟是PCLK72M或36M,经过分频器之后输出到SCK引脚,当然这里生成的时钟肯定是和移位寄存器同步的,每产生一个周期的时钟移入移出一个bit。 然后右边CR1寄存器的三个位BR0、BR1、BR2,用来控制分频系数。手册这里看到BR[2:0] 是波特率控制,这三位写入下面这些值,可以对PCLK时钟执行2~ 256的分频,分频之后就是SCK时钟,所以这一块就对于来之前这里说的时钟频率是fpclk的2~256分频,那这就是波特率发生器的部分。 ####各种寄存器

LSB FIRST,决定高位先行还是低位先行。 SPE是SPI使能,就是SPI_Cmd函数配置的位。 BR配置波特率,就是SCK时钟频率。 MSTR(Master),配置主从模式,1是主模式,0是从模式,我们一般用主模式 CPOL和CPHA,用来选择SPI的四种模式。 SR状态寄存器,TXE发送寄存器空,RXNE接收寄存器非空,这两个比较重要,我们发送接收数据的时候需要关注这两位。 CR2寄存器,是一些使能位,比如中断使能,DMA使能等。 #3.SPI基本结构 移位寄存器,是左移,高位移出去,通过GPIO到MOSI,从MOSI输出,显然这是SPI的主机。 之后引入的数据从MISO进来,通过gpio到移位寄存器的低位,这样循环八次,就能实现主机和从机交换一个字节,然后TDR和RDR的配合,可以实现连续的数据流。

另外TDR数据,整体转入移位寄存器的时刻,置TXE标志位。移位寄存器数据整体转入RDR的时刻,置RXNE标志位。

波特率发生器,产生时钟输出到SCK引脚。

数据控制器,看成是一个管理员,它控制着所有电路的运行。

开关控制就是SPI_Cmd,初始化之后,给个ENABLE,初始化整个外设。

SS从机选择引脚,另外这里并没有画SS从机选择引脚,这个引脚我们还是使用普通的GPIO来模拟即可。在一主多从的模型下,GPIO模拟的SS是最佳选择,这就是SPI的简化的结构。 #4.非连续传输发送(好处易封装)

  • 第一步等待TXE置1
  • 第二步写入要发送的数据置TDR
  • 第三步等待RXNE为1
  • 第四步读取RDR接收的数据
  • 之后重复这4步 ####缺点: 但是字节和字节之间存在间隙 在字节与字节之间会产生间隙,拖慢了整体数据传输的速度这个间隙在SCK频率低的时候影响不大,但是在SCK频率非常高时,间隙拖后腿的现象就比较严重了。

#5.软硬件波形对比 软硬件波形对比,这里上面是软件波形,下面是硬件波形。 区别就是硬件波形,数据线的变化是紧贴SCK边沿的,而软件波形数据线的变化,在边沿后有一些延迟。只是硬件波形一般会紧贴边缘,软件波形一般只能在电平期间,不过最终都不会影响数据传输,不过软件波形如果能贴近边缘,我们还是贴近边缘,否则如果你等太久比较靠近下一个边沿,那数据也容易出错。