详解UART、IIC、SPI经典通信总线协议
一、通信基础——并行、串行、单工、双工(全双工半双工)
1.1 并行、串行、单工、双工(全双工半双工)
并行通信
串行通信
单工通信
双工通信(半双工同一时刻只可以有一个发送或接收、全双工同一时刻可以同时发送或接收)
1.2 波特率
波特率用于描述UART通信时的通信速度,其单位为bps (bit per second)即每秒钟传送的bit的数量
1.3 同步、异步
同步:发送方发出数据后,等接收方发回响应以后,才发下一个数据包的通讯方式。
异步:发送方发出数据后,不等接收方发回响应,接着发送下一个数据包的通讯方式。
二、UART 通用异步收发器
UART(Universal Asynchronous Receiver Transmitter,即通用异步收发器)是一种通用的串行、异步通信总线,拥有两条数据线,一根TXD用于发送,一根RXD用于接收,常用于主机与辅助设备之间的通信。
UART帧格式
-
起始位:表示数据传输的开始,电平逻辑为“0” 。
-
数据位:可能值有5、6、7、8、9,表示传输这几个bit 位数据。一般取值为8,因为一个ASCII 字符值为8 位,先发低位后发高位。
-
奇偶校验位:用于接收方对接收到的数据进行校验,校验“1” 的位数为偶数(偶校验) 或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。
-
停止位:表示一帧数据的结束。电平逻辑为“1”。
三、I2C总线
I2C总线是Philips公司在八十年代初推出的一种串行、半双工总线主要用于近距离、低速的芯片之间的通信,I2C总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步,I2C总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用。
时序图
说明:
- 开始结束:在SCL为高电平期间,SDA由高变低,即为start信号;在SCL为高电平期间,SDA信号由低变高,即为stop信号
- 应答信号:当检测到start信号后,在随后的8个时钟周期,SDA线进行一次8bit的数据传输,若接收到相应的8bit信号,则在第9个时钟周期拉低SDA信号,并视为一次ack应答信号
数据格式
3. 一次完整的IIC传输包含 Trans_data = Start + n * Bytes+ n * ack + Stop
4. 当检测到Start信号时,主机输出8bit的信号,其中前7bit表示从机的地址,为选中的从机信息,第8bit表示当前进行的读写操作,为’1’表示读操作,为’0’表示写操作,然后第9位为从机的应答ack信号,表示指定从机已接收到地址信号,以进行后续的传输;后续的传输以 8 bit + ack 的重复,即 n * Bytes + n * ack 信号来进行数据的传输,最后主机发出Stop信号,即当前的一次IIC传输结束
四、SPI
SPI(Serial Peripheral Interface)是串行外设接口的缩写,是一种高速的、全双工、同步的串行通信总线。它是由“单个主设备+多个从设备”构成的系统。
在系统中,只要任意时刻只有一个主设备是处于激活状态的,就可以存在多个SPI主设备。常运用于AD转换器、EEPROM、FLASH、实时时钟、数字信号处理器和数字信号解码器之间实现通信。
为了实现通信,SPI共有4条信号线,分别是:
-
主设备出、从设备入(Master Out Slave In,MOSI):由主设备向从设备传输数据的信号线,也称为从设备输入(Slave Input/Slave Data In,SI/SDI)。
-
主设备入、从设备出(Master In Slave Out,MISO):由从设备向主设备传输数据的信号线,也称为从设备输出(Slave Output/Slave Data Out,SO/SDO)。
-
串行时钟(Serial Clock,SCLK):传输时钟信号的信号线。
-
从设备选择(Slave Select,SS):用于选择从设备的信号线,低电平有效。
五、UART、SPI、I2C比较
-
I2C线更少,比UART、SPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。
-
SPI实现要简单一些,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。
-
IIC的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准的SPI要少。
-
UART一帧可以传5/6/7/8位,I2C必须是8位。I2C和SPI都从最高位开始传。
-
SPI用片选信号选择从机,I2C用地址选择从机。
以上资料来源于网络,如有侵权,告知删除。