StTM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先行 时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 支持多主机模型、主或从操作 可精简为半双工/单工通信 支持DMA 兼容I2S协议 STM32F103C8T6 硬件SPI资源:SPI1、SPI2
如同前面一样,这是硬件电路自动生成时序,不需要我们自己来生成
硬件电路设计出来,功能基本无法更改,与软件不同,这样就会导致外设电路的知识点很多
我们先学习主线
8位数据帧就是每次交换的数据都是8个bit
8位数据帧是最常见的
也可以设置位16位数据帧
实际上也就是两个8位拼起来
高位先行是正过来看
低位线性是反过来看
时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)
所以SPI的时钟就是由PCLK分频过来的
APB2的PCLK是72MHz
APB1的PCLK是36MHz
支持多主机模型,主或从操作
可精简为半双工单工(如循迹模块)
支持DMA
兼容I2S,一种数字音频信号传输的专用协议,例如一个音频数据,看上去是一个波,实际上是一个点一个点的电压数据,如果要把这个音乐给播放出来,就需要外挂一个解码器把数字信号转换为模拟信号,这时候两个设备需要传输这个音乐的数据就需要一个协议来规定数据怎么发,每个数据是什么,时序该怎么产生,传输速度是多快
stm32的硬件SPI资源自然是有限的,如C8T6就只有两个
这里可以分成两部分,左上角这部分就是为了实现连续的数据流的部分
和前面那些差不多,就是一个移位寄存器和一个数据寄存器相互配合
右下角这一部分就是一些控制寄存器用的,
从MISO移位到移位寄存器,移位寄存器的数据再从MOSI移出去,这样就是一个低位先行的状态,从右边的LSBFIRST数据位可以控制是低位先行还是高位先行,正如前面的低位先行,实际上就是把数据倒过来了,我们也倒过来读就可以了
也就是控制SPI_CRX寄存器,位7给0就是先发送MSB,给1就是先发送LSB
LSB就是低位的意思,MSB就是高位的意思
这里MOSI和MISO的交叉主要是控制主从模式引脚变换的
MOSI为MO主机输出
MISO为MI主机输入
如果stm32作为从机
MOSI作为从机输入,这时候让信号走交叉的一路
即切换主从机时线路需要交叉一下
下面的缓冲区即是存数据的DR寄存器
在MISO输入完成数据到移位寄存器后
移入的数据就会从移位寄存器转入到RDR
这时状态寄存器的RXNE为1
然后就要尽快读出RDR以保证在下个数据传输进来之前这个数据可以有用途或被保留
DR和移位寄存器配合可以实现无延迟的连续传输(全双工同步),即总线写入发送缓冲区,发送缓冲区写入移位寄存器的低位,MISO再输入到移位寄存器的高位,这样移位寄存器的低位就被挤出去了,可以通过MOSI输出,移位寄存器接收完毕而又发送完毕后就可以给接收缓冲区送出
我们再来看看控制逻辑
波特率发生器
主要用来产生一个分频时钟
每产生一个时钟移位移出一个bit
右边的BR0,1,2则用来控制分频系数
LSB控制高低位先行
SPE是SPI使能
BR配置波特率
MSTR配置主从模式
CPOL用来选择4种模式
SR状态寄存器
TXE发送寄存器空
RXNE接收寄存器非空
CR2则是使能位,如中断使能,DMA使能
NSS引脚是从机选择,但更偏向于实现多主机模型
例如3个stm32的nss接在一起
当配置为输出,要告诉别人自己是主机(SSOE = 1)
配置为输入,可以接收别设备的信号(SSOE = 0)
简化一下就是这样