《STM32从零开始学习历程》@EnzoReventon
SPI特性及架构
相关链接:
SPI物理层及FLASH芯片介绍
SPI协议层
SPI固件库
参考资料:
[野火EmbedFire]《STM32库开发实战指南——基于野火霸天虎开发板》
[正点原子]STM32F4开发指南-库函数版本_V1.2
[ST]《STM32F4xx中文参考手册》
SPI协议及总线协议介绍
W25Q128产品数据手册
STM32的SPI外设简介
- STM32的SPI外设可用作通讯的主机及从机,支持最高的SCK时钟频率为fpclk/2 (STM32F407型号的芯片默认fpclk2为84MHz,fpclk1为42MHz),完全支持SPI协议的4种模式,数据帧长度可设置为8位或16位,可设置数据MSB先行或LSB先行。
- 它还支持双线全双工、双线单向(两根数据线都做发送或者接收模式)以及单线模式。
- 本文为以STM32F407为实验对象,经查阅手册,该芯片有3个SPI通讯接口,具体引脚请查阅手册。
STM32的SPI架构剖析
- ①为通讯引脚,连接到外部设备,引脚的介绍可以查看:《SPI物理层》。
- ②为波特率发生器,用来产生时钟。
- ③为数据控制逻辑,与I2C结构类似:内核将数据写入到发送缓冲区,使用移位寄存器将数据一位一位的经过MOSI发送出去;MISO接收数据写入到移位寄存器中,接收缓冲区将移位寄存器中的数据转移到数据总线中。
- ④为整体控制逻辑,SPI_CR2为控制寄存器;SPI_SR为状态寄存器;TXE发送缓冲区为空;RXNE接收缓冲区为非空;BR2\BR1\BR0为波特率寄存器,控制波特率。
时钟控制逻辑
SCK 线的时钟信号,由波特率发生器根据“控制寄存器CR1”中的BR[0:2] 位控制,该位是对fpclk时钟的分频因子,对fpclk 的分频结果就是SCK 引脚的输出时钟频率,计算方法见下表。
BR[0:2] | 分频结果(SLK频率) | BR[0:2] | 分频结果(SLK频率) |
---|---|---|---|
000 | fpclk/2 | 100 | fpclk/32 |
001 | fpclk/4 | 101 | fpclk/64 |
010 | fpclk/8 | 110 | fpclk/128 |
011 | fpclk/16 | 111 | fpclk/256 |
数据控制逻辑
SPI的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源来源于接收缓冲区及发送缓冲区。
- 通过写SPI的“数据寄存器DR”把数据填充到发送缓冲区中。
- 通过读“数据寄存器DR”,可以获取接收缓冲区中的内容。
- 其中数据帧长度可以通过“控制寄存器CR1”的“DFF位”配置成8位及16位模式;配置“LSBFIRST位”可选择**MSB(高位先行)先行还是LSB(低位先行)**先行。
整体控制逻辑
- 整体控制逻辑负责协调整个SPI外设,控制逻辑的工作模式根据“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的SPI模式、波特率、LSB先行、主从模式、单双向模式等等。
- 在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”(TXE,RXNE),只要读取状态寄存器相关的寄存器位,就可以了解SPI的工作状态了。
- 除此之外,控制逻辑还根据要求,负责控制产生SPI中断信号、DMA请求及控制NSS信号线。
- 实际应用中,一般不使用STM32 SPI外设的标准NSS信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。
- SSM软件从器件管理,SSM取1时,使能软件从器件管理,SSM取0时,禁止软件从器件管理。SSM为1时,可以随意指定一个GPIO引脚用来产生开始或者停止信号而非只能选用有SSM功能的引脚,使用灵活。
通讯过程
橙色:表示发送数据
黄色:表示发送标志,TXE的状态
紫色:表示接受标志,RXNE的状态
绿色:表示MISO输入
- 发送过程:
- 内核向数据寄存器SPI_DR写入0xF1,数据写入到发送缓冲区,移位寄存器将数据一位一位的发送出去。
- TXE=1(由于第一次数据传输,移位寄存器为空,数据很快的能够传输到移位寄存器中),表示数据寄存器为空,此时可以写入第二个数据进入发送缓冲区,等待转移至移位寄存器(此时TXE=0,表示移位寄存器还在发送数据中,非空),即等待TXE再次等于1。
- 接下来的数据传输按照上述步骤重复执行,等待移位寄存器将数据发送结束,接受新的数据,等待发送。
- 接收过程:
- 与发送过程一致,接收数据的标志位为RXNE,当RNXE为1时可以从数据寄存器中读取接收到的数据。
没有往SPI_DR寄存器写入数据的话,SCK将不会产生时钟,因此如果想要读取数据,就必须向SPI_DR寄存器写入数据。