SPI是由摩托罗拉公司开发的一种通用数据总线,其中由四根通信线,支持总线挂载多设备(一主多从),是一种同步全双工的协议。主要是实现主控芯片和外挂芯片之间的交流。这样可以使得STM32可以访问并控制各种外部芯片。本文主要是实现STM32连接W25Q64外挂Flash芯片。
I2C的优点是,无论外挂多少设备,只需要两根通信线就可以实现连接,但是由于其默认弱上拉的设计,其由低电平变换到高电平的时候会比较慢,这会使得其通讯频率较低,最高位400kHz。
SPI传输更快,其通讯频率更高,最高可达80MHz。SPI实现简单,没有继承这么多功能,没有应答机制,而且通信线较多。分别位四条通信线:
- SCK(Serial Clock):串行时钟线,由主机控制,将主机的时钟信号同步输出到所有从机中
- MOSI(Master Output Slave Input):主机输出从机输入
- MISO(Master Input Slave Output):主机输入从机输出
- SS(Slave Select):从机选择,其中每一个从机就需要一根SS信号线。当对应的从机SS线低电平的时候,表示主机和当前从机通信
硬件电路配置:
- 所有SPI设备的SCK、MOSI、MISO分别连接在一起
- 主机引出多条SS控制线,分别接到各个从机的SS引脚
- 输出引脚为推挽输出,输入引脚为浮空或者上拉输入
- 从机未被选中时,从机的MISO必须设置为高阻态
SPI基本收发电路
SPI基本收发电路使用的是一个移位模型,该模型中分别连接着主机和从机的两个移位寄存器,这两个移位寄存器就是负责存储需要发送的数据和需要接受的数据的。每当发送一个时钟信号,两个移位寄存器都会向左移位一位,然后最高位就会通过各自的MOSI口发送出去;而最低位则是通过MISO接收对方发送过来的一位数据。这就好像一个摩天轮一样轮转,主机的最高位会被移动到从机的最低位,相对的,从机的最低位会移动到主机的最高位上,经过8个时钟周期,刚好将两个移位寄存器的内容交换一次。
SPI时序基本单元
起始条件:SS从高电平切换为低电平
终止条件:SS从低电平切换到高电平
交换一个字节:
SPI对交换字节的时钟信号规定不是很严格,可以自定义。其中有两个标志位用于自定义时钟信号,CPOL用于指定极性,用于指定空闲状态的时候SCK是否为高电平,CPHA用于指定相位,CPHA=1指定MISO和MOSI在SCK的第一个边沿移入数据,第二个边沿移出数据。
CPOL=0,CPHA=0被称为模式0,是使用最广泛的模式,也是后面我们会继续使用的模式
SPI的报文模型
主机的第一个数据帧一般是指令帧,用于告诉从机需要机型什么操作。往后就是主机和从机的数据交换。