本文主要讨论串行通信协议uart、spi和i2c,串行接口标准rs232、rs422和rs485.
串行通信协议分为同步串行通信协议(spi、i2c)和异步串行通信协议(uart)。同步和异步传输的区别在于是否包含有时钟信号线,如果包含有时钟信号线为同步传输,否则为异步传输。
spi是一种同步、全双工的通信协议。spi通信由四根信号线构成:时钟信号线(sclk)、数据输入线(sdi)、数据输出线(sdo)和片选信号线(cs)。其中片选信号线可以实现一对多的通信方式。
(1)SDO – 主设备数据输出,从设备数据输入;
(2)SDI – 主设备数据输入,从设备数据输出;
(3)SCLK – 时钟信号,由主设备产生;
(4)CS – 从设备使能信号,由主设备控制。
注意:SCLK信号是由主spi设备提供的,从spi设备不能控制时钟信号线(sclk)。因此在一个基于spi的通信系统中至少包含一个主spi设备,同样因为数据的发送和接受是基于时钟信号来进行采样,因此同步串行通信不同于异步串行通信的固定格式传输方式(7位、8位、10位),同步串行通信每次传输的数据位数可以是任意的,只要在传输数据的同时传输时钟信号即可。
I2C是一种同步、半双工的通信协议。工作速率有低速100kbits、快速400kbits(常用的)和高速3.4Mbits(未曾使用过,只是听闻);i2c通信由两根信号线构成:数据线(sda)和时钟线(scl),因为信号线比较少,要实现双工通信就要使用比较复杂的数据通信协议(通信命令:开始、读、写、停止)。
写通讯过程:
1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
2. 发送一个地址字节(包括7位地址码和一位R/W);
3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
4. 主控收到ACK后开始发送第一个数据字节;
5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;
6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;
读通讯过程:
1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
2. 发送一个地址字节(包括7位地址码和一位R/W);
3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
4. 主控收到ACK后释放数据总线,开始接收第一个数据字节;
5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束;
6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;
1. 总线空闲状态
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
2. 启动信号START
时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态;
3. 停止信号STOP
时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。
4. 数据传送
SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为地电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。
5. 应答信号ACK
I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
6. 无应答信号NACK
在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途:
a. 一般表示接收器未成功接收数据字节;
b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。
uart是一种异步、全双工通信协议。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。uart通信由至少3根信号线完成,分别是txd、rxd和gnd。
数据协议:以PC机A给单片机B发数据为例(1为高电平,0为低电平):A.TX to B.RX。刚开始B.RX的端口保持1,当A.TX发来一个0作为起始位告诉B我要发数据了!然后就开始发数据,发多少呢?通常一次是5位、6位、7位、8位,这个双方事先要用软件设置好。PC机一般会用串口助手设置,单片机会在uart的驱动中设置。一小帧数据发送完了以后,A.TX给个高电平告诉B.RX我发完了一帧。如果还有数据,就再给个0然后重复上一步。如果双方约定由校验位,还要在发停止位1之前发送个校验位,不过现在一般都不需要校验位了,因为出错的概率太小了,而且一般用于调试。
一般在串口助手上还有个RTS/CTS流控选项,也叫握手,我从来没用过。搬一段我能理解的介绍:RTS(请求发送),CTS(清除发送)。如果要用这两个功能,那就至少要接5根线:RX+TX+GND+RTS+CTS。当A要发送数据时,置RTS有效(可能是置1),告诉B我要发送数据了。当B准备好接受数据后,置CTS有效,告诉A你可以发了。然后他们就实现了两次握手!挺耽误时间是不是?这个RTS还可以当电源使用,如果你不用它的握手功能,且电源电流在50mA以下时,就可以把它置为高电平可以当电源用喔~!
三种常用的串行接口标准按照发展的先后顺序分别是:rs232、rs422和rs485.这三种串口标准一般使用的通信协议为uart(数据传输协议)。rs232和rs422为全双工,而rs485为半双工。含有时钟的信号线为同步,不含为异步。
rs232
rs232主要包含9种信号线:
1 DCD 载波检测
2 RXD 接收数据
3 TXD 发送数据
4 DTR 数据终端准备好
5 SGND信号地线
6 DSR数据准备好
7 RTS 请求发送
8 CTS 清除发送
9 RI 振铃提示
rs232的通信逻辑电平:
在TxD和RXD上:逻辑1(MARK)=-3V ~ -15V,逻辑0(SPACED=+3~+15V在RTS、CTS、D SR、DTR和DCD等控制线上:信号有效(接通,ON状态,正电压)=+3V ~ +15V;信号无效(断开,OFF状态,负电压)=-3V ~ -15V。
数据传输以10bit格式传输(异步传输,数据格式固定):1bit起始位、数据位(5-8)、校验位、1bit停止位构成。
rs422
rs422是一种全双工通信接口。由发送差分线(TX+、TX-)和接受差分线(RX+、RX-)构成。使用差分线可以抑制共模干扰,提升传输距离。
rs422和rs485的逻辑电平差值相同,逻辑0(-6V ~ -2V),逻辑1(+2V ~ +6V)。
rs422的接收器最小输入电阻为4kΩ,同一总线最多可接10个节点,终端匹配电阻为100Ω,因此最大负载为10x4kΩ+100Ω。
rs485
rs485是一种半双工通信接口。由一对差分线来发送和接受数据。
rs485和rs422的逻辑电平差值相同,逻辑0(-6V ~ -2V),逻辑1(+2V ~ +6V)。
rs485的接收器最小输入电阻为12KΩ,同一总线最多挂32个节点,终端匹配电阻100Ω,因此最大负载为32x12kΩ+100Ω。
rs232、rs422和rs485类比
都是 串口通信,应用场合不同
RS232 -3线全双工,点对点通信,传输距离 25米以内
RS485 -2线半双工,点对多主从通信,传输距离可达 1200米以上
RS422 -4线全双工,主从通信,传输距离可达 1200米以上