由于这几天接触到了各种通信协议,但是却没有搞懂,造成了一点尴尬。。。来总结一下各个通信协议之间的区别。

IIC协议(也叫I2C协议)

IIC协议(Inter-Integrated Circuit)协议,是由PHILIPS(荷兰皇家飞利浦)公司提出的。为了让主板、嵌入式系统或手机用以连接低速周边外部设备而发展。IIC协议是我们现在使用最多的通信协议。

物理接口

IIC总线只使用两条双向漏极开路的信号线(串行数据线:SDA,串行时钟线:SCL),并利用上拉电阻。IIC总线仅仅使用SCL,SDA两根线,就实现了数据间的交互。而且IIC支持的电压范围相当大,例如+3.3V或者+5V都可以。

SCL(Serial Clock):串行时钟线,传输CLK信号,一般是主设备向从设备提供
SDA(Serial Data):串行数据线,传输通信数据
物理接口示意图
text

IIC协议符合严格的通讯时序图,如果需要传输数据,就要符合通讯协议。
具体的时序图不需要知道的太清楚,了解即可。i2c时序图的详细讲解

地址及数据方向

IIC总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送设备地址(SLAVE_ADDRESS)来查找从机。IIC 协议规定设备地址可以是 7位或 10 位,实际中 7 位的地址应用比较广泛。紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位(R/W),第 8位或第 11 位。数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。见下图。
text

IIC协议总结

1.两根线(SDA,SCL)

2.半双工,同步通信。

3.速率100K~3Mbps.

4.有ACK应答。一主多从。

5.SCL高电平读取数据,低电平可以改变数据。

6.数据长度限制8位。

7.有地址位,以及传送方向位,方向位来决定是主机发送还是接受数据。

UART串口通信协议

我之前一直以为这个叫做SPI协议,孤陋寡闻,也许是因为SPI用的少,然后整天TXD和RXD看得多,就搞混了。
UART是一个把并行信号转换成串行信号的硬件设备,通常被集成在MCU的内部。

硬件接口

TXD:接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。
RXD:发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使 能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O 用于发送和接收数据(USART 电平下,随后在 SW_RX 上接收数据)。

通讯协议

UART通信协议也是相对来说比较复杂一点吧,所以需要了解,不用熟悉。
UART通信协议

UART协议总结

1.三根线 (rx,tx,gnd);

2.全双工 :发送接收可以同时。

3.波特率需提前设定

4.发送数据长度限制8位

5.没有应答机制,但有奇偶校验位。

6.只允许1对1通信。

7.异步通信。

8.小于20Kbps

SPI通信协议

SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola(摩托罗拉)公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。SPI的特点就是传输熟读很快。

硬件接口

MISO 主设备数据输入,从设备数据输出。
MOSI 主设备数据输出,从设备数据输入。
SCLK时钟信号,由主设备产生。
CS从设备片选信号,由主设备控制

通信原理

采用主-从模式(Master-Slave) 的控制方式

SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。

采用同步方式(Synchronous)传输数据

Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的.

数据交换(Data Exchanges)

SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 “发送者(Transmitter)” 或者 “接收者(Receiver)”. 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了。

一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上。

在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃, 导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的.

SPI协议总结

1.三根线(SDO,SDI,SCLK)1对1传输可以省CS.

2.全双工:这里的全双工可串口还不同,不能同时收发。SCLK由主机控制,从机不能主动给主机发数据。感觉类似半工。

3.数据发送位数没有要求,而且可以中断发送然后续上。

4.一个上降沿+上升沿为1个数据。

5.没有应答机制,也没有硬件校验机制。

6.可以1主多从,靠CS片选使能。

7.同步通信。

8.速度可达几Mbps

三个协议总结

其实如果你不清楚三个协议的区别的话,就只需要记住接口不同,如果要使用对应的通信协议的话,设定好端口就可以直接使用:
IIC使用了两根线,一根是SCL时钟,一根是SDA数据线
UART使用了两根线,一根是TXD,一根是RXD,需要反接,然后主从都要事先设定好相同的波特率
SPI使用了四根线,一根是CLK时钟线,一根是CS片选线,一根是MOSI输入线,一根是MISO输出线

然后有的时候可能会有人问硬件和MCU之间的硬件是啥,一般我们的外部设备都是工作在+5v的电压中,如蓝牙芯片,但是单片机使用的+3.3V电压,就需要有一个电压转换器叫做TTL,还有一种是电平反向的转换接口叫做RS-232C标准接口也用的很多。

我们在日常使用中,遇到的硬件通信协议99.9%都是这三种,然后网络通信协议一般是TCP/UDP协议,以后再说。