本文章根据江科大的视频制作,供学习参考
1.SPI通信
1.1 SPI简介
SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
四根通信线:SCK/SCLK/CLK/CK(Serial Clock)(串行时钟线)、MOSI/DO(Master Output Slave Input)(主机输出从机输入)、MISO/DI(Master Input Slave Output)(主机输入从机输出)、SS/NSS/CS(Slave Select)(从机选择)
同步,全双工(数据接收和数据发送单独各占一根线)
支持总线挂载多设备(一主多从)(多一条通讯线,专门用来指定我要跟哪个从机进行通信)
I2C,无论是硬件电路,还是软件时序,设计都相对比较复杂,硬件上,我们要配置位开漏外加上拉的模式 ,软件上,我们有许多功能与要求,比如,一根通信线兼顾数据收发,应答位收发,寻址机制的设计等等,最终通过这么多设计,就使得I2C通信的性价比非常高。I2C可以再消耗最低硬件资源的情况下,实现最多的功能,在硬件上,无论挂载多少个设备,都置需要两根通信线,在软件上,数据双向通信、应答位,都可以是实现。I2C的缺点:由于I2C开漏外加上拉电阻的电路结构,使得通信线高电平的驱动能力比较弱,这就会导致,通信线由低电平变到高电平的时候,这个上升沿耗时比较长,这会限制I2C的最大通信速度。
SPI传输速率快,SPI协议并没有严格规定最大传输速度,这个最大传输速度取决于芯片厂商的设计需求,如:W25Q64芯片手册里写的SPI时钟频率,最大可达80MHz。其次,SPI设计比较简单粗暴,实现的功能没有I2C多。最后,SPI的硬件开销比较大,通信线的个数比较多,并且通信过程中,经常会有资源浪费的现象。
1.2 硬件电路
左边这里是SPI主机,主导整个SPI总线,主机一般都是控制器来作,比如STM32,下面就是从机,左边的主机实际引出了6根通信线,因为由3个从机,所以SS线需要3根,再加上SCK、MOSI、MISO,就是6根通信线,当SPI所有通信线都是单端信号,它们的高低电平都是相对GND的电压差,所以,单端供电,所有设备还需要共地,这里GND的线没花出来但是必须要接,如果从机没有独立供电的话,主机还需要再额外引出电源正极VCC,给从机供电,这两根电源线VCC和GND,也要注意接好。首先,SCK时钟线,时钟线完全由主机掌控,所以对于主机来说,时钟线为输出,对于所有从机来说,时钟线都为输入,这样主机的同步时钟,就能送到各个从机了。下一个,MOSI,主机输出从机输入,这里左边是主机,所以就对应MO,主机输出,下面三个都是从机,所以就对应SI,从机输入,数据传输方向是主机通过MOSI输出,所有从机通过MOSI输入。下一个,MISO,主机输入从机输出,左边是主机对应MI,下面是从机对应SO,数据传输方向是,三个从机通过MISO输出,主机通过MISO输入。
主机想指定谁,就把对应的SS输出线置低电平,主机初始化后所有从机都输出高电平。这样就是谁也不指定。SPI由一个冲突点,就是图上的MISO引脚,再这个引脚上,可以看到主机一个是输入,但是三个从机全是输出,如果三个从机都始终是推挽输出,势必会导致冲突,所以在SPI协议里,有一条规定,就是当从机的SS引脚为高电平,也就是未被选中时,它的MISO引脚,必须切换为高阻态,高阻态相当于引脚断开,不输出任何电平,这样就可以防止,一条线有多个输出,而导致的电平冲突的问题,在SS为低电平时,MISO才允许变为推挽输出,这就是SPI对这个可能的冲突做出的规定。
1.3 硬件电路
左边时主机有一个8位移位寄存器,右边是从机也有一个8位移位寄存器,因为SPI一般是高位先行,所以每来一个时钟,移位寄存器都会想左进行移位,从机中的移位寄存器也是同理,然后呢,移位寄存器的时钟源,是由主机提供的·,这里叫做波特率发生器,它产生的时钟驱动主机的移位寄存器进行移位,同时,这个时钟也通过SCK引脚进行输出,接到从机的移位寄存器里,之后,上面移位寄存器的接法是,主机移位寄存器左边移出去的数据,通过MOSI引脚输入到移位寄存器的右边,从机移位寄存器左边移出去的数据通过MISO引脚,输入到主机移位寄存器的右边。
1.4 SPI时序
SS从高电平变为低电平,代表选择某个从机,通信开始。SS从低电平变为高电平,终止选择从机,通信结束。
SS产生下降沿后,MISO退出高阻态,在SCK上升沿时,MOS和MISO同时移出最高位数据,在下降沿时便开始采样,这里主机移出的最高位字节进入从机移位寄存器的最低位,从机移出的最高位进入主机寄存器的最低位,这样,一个之中脉冲残生完毕,一个数据位传输完毕。重复此过程,传输多个字节。SS上升沿后,MOSI还可以变化一次,将MOSI置一个默认的高低平或低电平,也可以不用管,然后MISO,从机必须置回高阻态。
SS下降沿时,就要立刻触发移位输出,所以这里MOSI和MISO的输出,时对齐SS的下降沿的,或者说,这里把SS的下降沿,也当作时钟的一部分,那SS下降触发了输出,SCK上升沿,就可以采样输入数据了,然后SCK上升沿移入数据,SCK下降沿移除数据。
CPOL(时钟极性)
CPHA(时钟相位)
模式2和模式3,就是SCK的极性取反
在SPI中,通常采用的时指令码加读写数据的模型。SPI起始后,第一个发送从机的数据叫做指令码,在从机中,对应的会定义一个指令集,当我们需要发送什么指令时,就可以在起始后第一个字节发送指令集里的数据,这样就能指导从机完成相应的功能,不同的指令,可以有不同的数据个数,有的指令,只需要一个字节的指令码就可以完成,而有的指令,后面就需要再跟要读写的数据。
标签:MISO,SS,主机,通信,STM32,SPI,从机,寄存器 From: https://blog.csdn.net/2401_83265518/article/details/139627628