抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

日常所使用到的通讯协议

1、几种通讯的协议

主要介绍几种我常用到的通讯协议SPIIICIISUARTCANSDIOGPIO总线协议。

  • SPI总线由三条信号线组成:串行时钟SCLK、串行数据输出SDO、串行数据输入SDISPI总线可以实现多个SPI设备互相连接。

  • IIC总线用两条线(SDASCL)在总线和装置之间传递信息。

  • IIS则大部分是3线的(除了时钟和数据外,还有一个左右声道的选择信号),IIS主要用来传输音频信号。

  • UART总线是异步串口,一般由波特率产生器、UART接收器、UART发送器组成,硬件上由两根线连接,一根用于发送,一根用于接收 ,两个设备之间需要共地

  • CAN信号使用差分电压传送,抗干扰能力强,两条信号线被称为CAN_HCAN_L

  • GPIO是一种通用的数字输入/输出端口端口。

  • JTAG接口是4线:TMSTCKTDITDO,分别为模式选择、时钟、数据输入和数据输出线,测试复位信号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一般由VCCTXDRXDGND三根线组成,是一种异步传输协议。无论是主机还是从机,均可以自由发送数据,但是由于UART总线并没有时钟线,所以需要提前约定对应的波特率,这是一种很简单的传输协议。

3、通讯协议

3.1、UART

UART是一个大家族,其包括了RS232RS499RS423RS422RS485等。COM口是电脑上异步串行通信口的简写,由于历史原因,现在PC机的COM口均为RS232。UART用的TTL电平, 低电平为0=0V,高电平为1=3.3V或以上,这里由于篇幅有限仅写RS232

在使用时候,最少连接三根线,如图所示。

  1. 起始位:先发出一个逻辑0的信号,表示传输字符的开始。

  2. 数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。

  3. 奇偶校验位:数据位加上这一位后,使得1的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

  4. 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。

  5. 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

  6. 波特率:数据传输的速率。有通常使用的以下几个档位:30060012002400480096001920038400430005600057600115200、当然也可以自定义。在数据传输和接收双方,需要预先统一波特率,以便正确的传输数据。

3.2、IIC

I²C (Inter-Integrated Circuit)。SDASCL总线通过上拉电阻与电源相连接。每个接到I2C总线上的器件都有唯一的地址。其中,主动发起操作的一方为主机,另外一方为从机。

没有数据时:SCLSDA都为高电平

开始信号START:SCL为高电平,SDA的电平由高跳到低表示开始信号。

终止信号STOP:SCL为高电平,SDA的电平由低跳到高表示终止信号。

每8bit数据传输结束,都需要一个ACK。起止信号都有Master发出,而ACK则可能由Master或者SLAVE来发出。

写寄存器的标准流程为:

  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

读寄存器的标准流程为:

  1. Master发起START
  2. Master发送I2C addr(7bit)和r(读)操作1(1bit),等待ACK
  3. Slave发送ACK
  4. Slave发送data(8bit),即寄存器里的值
  5. Master发送ACK
  6. 第7步和第8步可以重复多次,即顺序读多个寄存器

3.3、SPI

SPI(Serial Peripheral Interface)四根硬脚引线,分别为 SDI(串行数据输入),SDO(串行数据输出),SCK(串行移位时钟),CS(片选)。因为一个主设备可以挂多个从设备,则通过片选引脚对从设备进行选择。

SPI在数据传输的时候,需要确定两件事情:

  1. 数据是在时钟的上升沿采集还是下降沿采集;

  2. 时钟的初始(空闲)状态是为高电平还是低电平。而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通信过程中,主从设备之间会形成一个数据环形链路,通俗的将就是主设备向从设备写一次数据,从设备就会回一次数据(至于该从设备回复的数据是否有效,如果有效,主设备就把它读入;如果无效,则丢弃即可)。

评论