概要
嵌入式设备中最常用的三种通信协议,今天重点写的是SPI,因为这也是自己后面需要用的,重新看了一些SPI通信相关的一些东西,又有了一些新的收获。在小结中将对三种协议做一个简要的对比。
SPI通信
说起SPI,大多数人其实并不知道其英文全称,Serial Peripheral Interface,“串行外围设备接口”,而一说起特点,就是“高速,全双工,同步,串行”,这里面需要注意的是全双工和同步,全双工也就是可以同时进行数据的发送和接受,不同于后文将要介绍到I2C的半双工模式。
SPI工作时有四根线:SCLK(时钟),MOSI(主机输出从机输入),MISO(主机输入从机输出),CS(片选信号)
四根线中需要注意的CS线,其全称是Chip Select,之前自己一直对这根线半知半解,只知道需要将其拉低(常用)后才会进行通信过程,今天看了一些资料后,才知道这根线还有些门道。首先我们常见的芯片上的CS标识符上会有一个横杠,其实就代表着在低电平时候有效,有的芯片也会标为“CS#”。另外就是一根CS线连接着一个从机(Slave),当一主多从的时候,就需要多根CS线在不同的时候发挥其作用,因此,这也是为什么很多文章说SPI的一大缺点就是需要多根线连接,可能会增加硬件设计的复杂性。
再一个就是SPI协议中的极性和相位,也就是CPOL和CPHL,它们均由0和1两种状态:
极性CPOL为0:SCLK空闲时处于低电平状态
极性CPOL为1:SCLK空闲时处于高电平状态
相位CPHL为0:主机在上升沿发送数据,从机在下降沿接受数据
相位CPHL为1:主机在下降沿发送数据,从机在上升沿接受数据
CPOL和CPHL各自状态的两两组合,就形成了SPI通信的四种状态,各位可以自己动手画简单画画四种状态,自己刚开始看着这些感觉也挺绕,但动手画了画之后发现理解起来还是挺简单的。电路或这些信号传输的相关内容有的还是需要将抽象形象化后可能会恍然大悟。
最后就是总结一下SPI优缺点:
优点:通信速度快,可以同时进行数据发送和接受,协议相对简单
缺点:多线连接,增加硬件复杂性(其实也是小问题),长距离传输的话可能会导致信号衰减和干扰,主设备数量有限。
为什么重点要写SPI,因为最近需要用SPI来做一个数字电位器控制的电路模块,后面完成了再出一期。
UART通信
UART全称:Universal Asynchronous Receiver Transmitter,通用异步收发传输器。最主要特点就是只需要两根线,即数据发送线和数据接收线,发送器和接收器不需要共享时钟。数据被组织成了数据包进行传输,一个数据包包含一个起始位,5到9个数据位,以及一个活两个停止位。
至于优点,协议简单,非常容易,兼容性很好,可以用于通信距离长的场景
缺点的话,速度较低,可靠性不太行,可能会受到噪声和干扰的影响。
I2C通信
I2C通信可能是我们最经常用和听到的,记得以前本科时候第一个调的单片机通信就是I2C通信。同样作为一种串行通信协议,使用两根线来进行双向通信,不同与UART的发送线和接受线,I2C两根线分别是SCL(时钟)和SDA(传输线)。
优点:可以实现多设备连接到同一总线,每个设备地址唯一,协议简单,空闲模式下功耗低
缺点:速度慢,总线长度和设备数量有限制,多个设备同时发送数据时,可能会发生冲突。
小结
大概了解了三种通信方式,也可以对它们进行一些对比,上面介绍每一种协议的时候,其实都有自己画的一些示意图,偷懒一下就没有放上来,各位看官可以找找一些示意图会更加直观。
首先对比下I2C和SPI:
I2C 半双工 SPI 全双工
I2C 有应答机制 SPI 无应答机制(这一点可以想象下一个人喊另一个人,I2C就是只有另一个人答应后,这个人才会跟他说考试答案。而SPI虽然无应答机制,但其通过时钟的上升下降沿判断发送数据,也可以想象为一个人自己喊两个不同的音调,喊完后不管另一个人如何就开始自说自话,也许大概可以这样比喻比喻hhh)
I2C向总线广播从机地址寻址,SPI向对应从机发出使能信号(第二点的专业化描述)
从第三点也可以看出来,I2C虽然节省了硬件资源,但通信时间也就长了,而SPI虽然需要的硬件资源多,但时间短了。鱼与熊掌向来不可兼得。
UART总结就是在长距离通信和速度要求较低的配置中表现比较出色。
以上就是今天的主要内容,深入理解这些协议还是要亲自动手去实践一下,不然纸上谈兵再熟悉其实都没啥用。
一点儿碎碎念
每天都感觉有好多事情要去做,但每天一坐下来又总是半天不知道从哪里开始,时间却又总是在这种状态中悄然流逝,有时候还是需要有一个清晰的思路去把每一天的时间最大化利用。