STM32的SPI学习
听说这个比较简单
老样子,先向豆包问问题:
主机的IO接口用什么模式,推挽还是开漏
从机可以同时发送信息吗
多个从机可以同时接收主机的信息吗
从机为什么只有一个移位寄存器
数据装载进入移位寄存器的时间是否是限制了SPI速率上线的主要原因
SPI的通信只能由主机发起
SPI通信的核心就是一个环形以为寄存器,主机每提供一个时钟,双方就交换一位
SPI的通讯没有应答位,也没有检验帧和起始结束位,所以需要数据帧格式校验,加上CRC吧

SPI通信是点对点的,因为有片选CS的存在,对比I2C无需仲裁。
SPI通信MCU有4条线,其中三条都是推挽输出,最后一条MISO设置为输入模式,据说上拉比较好。

SPI通信有CPOL和CPHA,这两个合作设置决定数据采样是第一个跳变沿还是第二个跳变沿,之所以不像I2C那样只要上升沿,
既有历史的原因(已经有很多传感器了,上升沿下降沿都有),也有为了保障数据有足够的时间送上移位寄存器的原因。


SPI的CS引脚好像不止是片选这么一个作用,还相当于起始帧以及停止位,甚至还有复位的功能。

移位寄存器是移动完8位,再装载新的数值吗
当CPOL和CPHA设置成00的时候,在第一个上升沿就进行数据采样,数据是在CS片选信号之后就已经端上来了的,在第二个下降沿修改数据线电平。
数据可以选择MSB或者LSB模式,I2C只支持MSB
大致就这些内容,然后就可以进入SPI了,不过听说模拟SPI用得少,这次就不动手实现软件SPI了,大致是怎么样的我已经心中有数。
总结一下SPI的使用:
SPI是一种比I2C更简单的协议,不过它应该得先配置CPOL和CPHA来设置采样边沿以及发送数据的时间,它是有一个单独的位来控制起止信号的,
也就是CS位,当CS从高变低的时候,SPI从机就知道通信要开始了,就准备把数据发送到移位寄存器,并且移位寄存器将一位放到MISO线上,
同样我们知道,整个通讯主机是主导,所以在软件将CS拉低之后,主机也需要将数据写入移位寄存器,然后硬件就会自动将一位移动到MOSI数据线上
(这一步是在CLK来之前就独立完成的),
等待CLK上升沿的时候采样(如果CPOL和CPHA配置成0 0),当CLK开始动作的时候,整个数据传输的环就开始了,主机将数据通过MOSI线发送到
从机的移位寄存器,从机的移位寄存器将数据通过MISO线发送到主机的移位寄存器,两个移位寄存器联通成一个环,当发送完一个字节数据之后
(可能不止一个字节,这一点应该是可以根据设置来判断,但有一点要肯定,主机和从机的移位寄存器的位数要保持相同),也就是主机的移位寄存器
变成了从机里的数据,从机的移位寄存器变成了主机里的数据,然后硬件快速将移位寄存器里的数据存入数据寄存器,
并且将新的字节替换掉移位寄存器的内容(并行传输),这个新的字节需要提前准备要,要是一个字节已经发送完成了才准备,会来不及。
最后可以根据CS以及BUSY来判断是否完成了一帧数据的传输。
主机中还有几个常用的标志位,比如判断TX_BUFFER是否为空,判断SPI是否正在进行传输BUSY,判断CS的电平。






为什么同样是同步通信,SPI比I2C快。原来是因为I2C选择的是开漏输出引脚,驱动能力较弱,需要外加上拉电阻,但这也会降低其电压的敏感度,上升沿较慢,t=R*C。
浙公网安备 33010602011771号