日常所使用到的通讯协议
1、几种通讯的协议
主要介绍几种我常用到的通讯协议SPI、IIC、IIS、UART、CAN、SDIO、GPIO总线协议。
SPI总线由三条信号线组成:串行时钟SCLK、串行数据输出SDO、串行数据输入SDI。SPI总线可以实现多个SPI设备互相连接。IIC总线用两条线(SDA和SCL)在总线和装置之间传递信息。IIS则大部分是3线的(除了时钟和数据外,还有一个左右声道的选择信号),IIS主要用来传输音频信号。UART总线是异步串口,一般由波特率产生器、UART接收器、UART发送器组成,硬件上由两根线连接,一根用于发送,一根用于接收 ,两个设备之间需要共地。CAN信号使用差分电压传送,抗干扰能力强,两条信号线被称为CAN_H和CAN_LGPIO是一种通用的数字输入/输出端口端口。JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线,测试复位信号TRST一般作为可选的第五个端口信号。
2、SPI/UART/I2C区别及特点
SPI是四根线的高速同步串行口,分别是CS(片选)、MOSI(主发从收)、MISO(从发主收)、SCLK(时钟),是一种同步传输协议。主机送出CLK信号,主机到从机的数据在MOSI线上传输,从机到主机的数据在MISO线上传输。在启动传输之前,需要先拉低对应从机的CS管脚,在传输完成之后,再拉高CS管脚,从机的SPI Slave模块进入休眠。I2C是两根线,SDA(数据)和SCL(时钟),也是一种同步传输协议。主机在发送开始信号之后,先发送7个比特的地址位和1个比特的读写位,每个从机有自己的I2C地址,当发现该条指令是发给自己的时候,拉低SDA线(即回复ACK信号),然后主机发送或接收数据,完成传输。传输完成之后,主机发送停止位,完成该次传输。UART一般由VCC、TXD、RXD、GND三根线组成,是一种异步传输协议。无论是主机还是从机,均可以自由发送数据,但是由于UART总线并没有时钟线,所以需要提前约定对应的波特率,这是一种很简单的传输协议。
3、通讯协议
3.1、UART
UART是一个大家族,其包括了RS232、RS499、RS423、RS422和RS485等。COM口是电脑上异步串行通信口的简写,由于历史原因,现在PC机的COM口均为RS232。UART用的TTL电平, 低电平为0=0V,高电平为1=3.3V或以上,这里由于篇幅有限仅写RS232。
在使用时候,最少连接三根线,如图所示。
起始位:先发出一个逻辑
0的信号,表示传输字符的开始。数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。
奇偶校验位:数据位加上这一位后,使得
1的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
波特率:数据传输的速率。有通常使用的以下几个档位:
300、600、1200、2400、4800、9600、19200、38400、43000、56000、57600、115200、当然也可以自定义。在数据传输和接收双方,需要预先统一波特率,以便正确的传输数据。
3.2、IIC
I²C (Inter-Integrated Circuit)。SDA和SCL总线通过上拉电阻与电源相连接。每个接到I2C总线上的器件都有唯一的地址。其中,主动发起操作的一方为主机,另外一方为从机。
没有数据时:SCL和SDA都为高电平
开始信号START:SCL为高电平,SDA的电平由高跳到低表示开始信号。
终止信号STOP:SCL为高电平,SDA的电平由低跳到高表示终止信号。
每8bit数据传输结束,都需要一个ACK。起止信号都有Master发出,而ACK则可能由Master或者SLAVE来发出。
写寄存器的标准流程为:
- Master发起START
- Master发送
I2C addr(7bit)和w操作0(1bit),等待ACK - Slave发送
ACK - Master发送
reg addr(8bit),等待ACK - Slave发送
ACK - Master发送
data(8bit),即要写入寄存器中的数据,等待ACK - Slave发送
ACK - 第6步和第7步可以重复多次,即顺序写多个寄存器
- Master发起STOP
读寄存器的标准流程为:
- Master发起
START - Master发送
I2C addr(7bit)和r(读)操作1(1bit),等待ACK - Slave发送
ACK - Slave发送
data(8bit),即寄存器里的值 - Master发送
ACK - 第7步和第8步可以重复多次,即顺序读多个寄存器
3.3、SPI
SPI(Serial Peripheral Interface)四根硬脚引线,分别为 SDI(串行数据输入),SDO(串行数据输出),SCK(串行移位时钟),CS(片选)。因为一个主设备可以挂多个从设备,则通过片选引脚对从设备进行选择。
SPI在数据传输的时候,需要确定两件事情:
数据是在时钟的上升沿采集还是下降沿采集;
时钟的初始(空闲)状态是为高电平还是低电平。而I2C的空闲状态,时钟线为高电平;数据采集的时候,时钟线也为高电平。但SPI给出了更自由的方式。
CPOL:时钟极性, 表示 SPI 在空闲时, 时钟信号是高电平还是低电平。
CPHA:时钟相位, 表示 SPI 设备是在 SCK 管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样。
那么,SPI CPOL有两种可能,CPHA有两种可能,则SPI数据传输就有四种可能,SPI数据传输就有四种模式。
| MODE | CPOL | CPHA |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 2 | 1 | 0 |
| 3 | 1 | 1 |
SPI在Mode 0情况下示意图:
SPI在硬件设计上采用的双数据线制,根据设计,在SPI通信过程中,主从设备之间会形成一个数据环形链路,通俗的将就是主设备向从设备写一次数据,从设备就会回一次数据(至于该从设备回复的数据是否有效,如果有效,主设备就把它读入;如果无效,则丢弃即可)。
