一、uart
通用异步收发器,就是常说的串口通信,常常用在异步通信并且是一种全双工的通信方式,不需要严格的时间限制,两个设备之间连线简单,往往只需要将RX,TX端交叉相连即可。现实中利用面很广,多用于调试,在以后学习Linux驱动开发时是非常重要的。uart的连接过程如下图,很简洁明了。
由图可见,数据在总线和uart之间还是并行传输的,但是两个设备之间的uart之间就采取了单线的传输,在传输的前,还会自动的添加起始位、奇偶校验位、停止位。具体的传输过程如下图:
这样对uart整个的工作流程就全部解刨开了,学习难度降了好多。在以前的文章里有手撕uart代码的文章,有兴趣的可以去看看。
二、spi-串行外设接口
这是一种同步全双工的传输方式,他的连线是这三种通信方式里面最多的,有一个clk串行时钟、MOSI主设备输出、MISO主设备输入、cs从设备片选。他的缺点就是每个从设备都需要有一个cs口用来对其在传输时进行选择。在数据传输时还需要考虑传输时是低电平有效还是高电平有效、第一个下降沿有效还是第二个下降沿有效,相当于有四种传输方式。内部spi通信相当于一个环路,输出数据后又读入数据:
具体读和取数据的过程如下(网上找到很好地一张工作流程图),需要16个脉冲才可以完成一个完整的读取周期。
三、iic
iic实现连线简单,只需要一个clk时钟线和sda数据线即可,但是iic的协议相对复杂。如图iic可以挂载多个设备,但是传输时只能有一个设备工作,iic是利用地址来选择从机的,这点和spi不同,两条线都有上拉电阻且都设为开漏输出,目的是为了数据传输时的稳定,也是一种规范,iic在高电平时是空闲状态。在数据传输时,clk在高电平的时候,SDA绝对不能发生改变,否则会发生错误。
在iic中想利用其收发数据必须会起始与终止信号:在SCL为高期间 SDA : 由高到低,起始信号、 SDA:由低到高,终止信号。
IIC一次最多可以挂载多少个设备呢?由iic地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127个地址, 所以理论上可以挂127个从器件。但是IIC协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件。过多设备会导致信号传输速度变慢,这牵扯到模电方面的内容,不过多解释。
主设备对从设备可以进行读写,主设备首先会发送7bit位的slave device地址,和1bit位的read或者write命令。
时序图如下write:
read:
语言描述就是:
(1)write命令
如果为write命令,则主设备释放总线(If the I2C-bus is free, both SDA and SCL lines should be both at High level),即SDA为高位;然后从设备拉低SDA,表示ACK主设备;然后主设备再发送8bit数据,从设备再ACK(A),通信结束(P)。
写寄存器的标准流程:
1. Master发起START
2. Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
3. Slave发送ACK
4. Master发送reg addr(8bit),等待ACK
5. Slave发送ACK
6. Master发送data(8bit),即要写入寄存器中的数据,等待ACK
7. Slave发送ACK
8. 第6步和第7步可以重复多次,即顺序写多个寄存器
9. Master发起STOP
(2)read命令
如果为read命令,则从设备先拉低SDA表示ACK主设备,然后再发送8bit数据。主设备拉低SDA表示ACK从设备(我已经读取8bit的数据了),之后结束。
读寄存器的标准流程
1、Master发送I2Caddr(7bit)和 W操作1(1bit),等待ACK
2. Slave发送ACK
3. Master发送reg addr(8bit),等待ACK
4. Slave发送ACK
5. Master发起START
6. Master发送I2C addr(7bit)和 R操作1(1bit),等待ACK
7. Slave发送ACK
8. Slave发送data(8bit),即寄存器里的值
9. Master发送ACK
10. 第8步和第9步可以重复多次,即顺序读多个寄存器
以上文字来源于以下链接:原文链接:https://blog.csdn.net/oqqHuTu12345678/article/details/72356722
四、三种通信方式对比图
对比项 | UART | SPI | I2C |
信号线数目 | 3根,RX、TX、GND | 4根,SDO、SDI、SCLK、SS | 2根,SDA、SCLK |
设备从属关系 | —— | 存在主从设备。SPI用片选信号选择从机 | 存在主从设备。IIC用地址选择从机。 |
通信方式 | 全双工通信 | 全双工通信 | 半双工通信 |
通信速率 | 速度慢 | 比I2C总线要快,速度可达到几Mbps | I2C的速度比SPI慢 |
应用领域 | 1、UART常用于控制计算机与串行设备的芯片 2、就是我们经常所说的串口,基本都用于调试。 | 主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间 | I2C一般是用在同一个板子上的2个IC之间的通信 ,它可以替代标准的并行总线,连接各种集成电路和功能模块。 |
传输距离 | I2C需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信 | ||
通信特征 | 异步,一帧可以传5/6/7/8位 | 同步,SPI允许数据一位一位的传送,甚至允许暂停。从最高位开始传。 | 同步,电平信号,一次连续8bit。从最高位开始传 |
协议复杂度 | 结构比较复杂 | SPI实现要比UART简单,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。 | 协议比SPI复杂,但是连线比标准的SPI要少 |
对比 | 只能与一个设备相连 | 在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。 在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。 |