浅谈三种通信协议_UART\IIC\SPI
为了回顾三种常用通信协议的区别,特此写一篇文章来回顾回顾。
怎么区分和记忆比较好呢?看时钟线和数据线。
1.UART(Universal Asynchronous Receiver/Transmitter,全双工通用异步收发器)
首先作个名词解释,全双工是指允许数据在两个方向上同时传输,异步的意思是通信双方使用各自的始终控制数据传输,这意味着若需要数据传输不丢包,必须得双方约定好用同样的频率去传输数据,也就是要在相同波特率下才能把数据相对完整地传输。
该协议有两条数据线(Tx、Rx),故能满足全双工通信,无时钟线,故而是异步通信。需要通信双方有相同的波特率才能通信。
2.IIC
该协议只有一条数据线(SDA),故只能满足半双工通信,也就是数据在一个时间内只能收或者发,有一条时钟线(SCL),因为需要同步通信。
在IIC中,首先会发出开始信号,然后发出第一个字节,里面包含了七位的地址,和最后一位的读写标记(R/W),这里的信息就是与哪一个IIC设备通信。若从设备存在,则会将主机的第九位拉低。从设备通过读取后续数据进行通信,直到主设备发出终止信号。
开始信号是SCL在保持高电平时,SDA从高变低(类似于导演的action手势,从上往下),终止信号是SCL在保持高电平时,SDA从低变高(就像乐团结束时,指挥家往上挥手并握拳)。
数据取SCL高电平期间SDA的数据。
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
SDA_DATA(1);
SCL_OUT(1);
delay_us(20);
SDA_DATA(0); //START:when CLK is high,DATA change form high to low
delay_us(20);
SCL_OUT(0); //钳住IIC总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT(); //sda线输出
SCL_OUT(0);
SDA_DATA(0); //STOP:when CLK is high DATA change form low to high
delay_us(20);
SCL_OUT(1);
SDA_DATA(1); //发送IIC总线结束信号
delay_us(20);
}
3.SPI(Serial Peripheral Interface)串行外围设备接口
该协议有两条数据线(MOSI、MISO),故能满足全双工通信,有一条时钟线(SCLK),因为需要满足同步通信。一个片选信号线(SS),由主机发送,如图所示,一个SPI主机连接了多个从机,当片选信号为低时选中某个相连从机。
因为SPI是同步通信,故需要时钟信号,如下图,SPI通信有两种读取数据方式——在时钟信号的上升沿或下降沿读取。