目录
1、常用通讯协议汇总
2、常见的电平信号及其电气特性
2.1、TTL电平
2.2、CMOS电平标准
2.3、RS232标准
2.4、RS485标准
3、UART(通用异步收发器)协议
3.1、UART定义
3.2、UART作用
3.3、UART与USART
3.4、UART通信协议
4 RS232
4.1 RS232物理层
4.2 RS232协议层
5 RS485
5.1 RS485物理层
5.1.1 RS485收发器
5.1.2 RS-485电平
5.1.3 接口定义
5.2 RS485协议层
5.3 RS-232和RS-485转换
5.4 RS-485和CAN的区别
5.5 RS-485常用电路
5.6 拓扑结构
6 RS422
7 SPI总线协议
7.1 接口定义
7.2 数据传输协议
7.2.1 时钟极性和时钟相位
7.2.2 传输时序
7.2.3 数据传输
7.4 SPI优缺点
8 I2C串行总线
8.1 I2C总线简介
8.2 I2C物理层
8.3 I2C协议层
8.3.1 起始和停止条件
8.3.2 目标地址和读写位
8.3.3 应答 (ACK) 和无应答 (NACK)
8.3.4 数据传输
8.4 有多个从设备及多个主设备
8.5 地址扩展
8.6 I2C的优点和缺点
表1-1
协议 | 最大传输速率 | 最大传输距离 | 节点数 | 连接方式 | 接线数 | 电气特性 | 工作方式 |
RS232 | 20kbit/s(用新的UART 芯片16C550 等,波特率可达到115.2Kbps) | 最大传输距离标准值为50 米,实际上也只能用在15米左右 | 点对点通讯(1发1收) | 全双工 | 3线 | -3V ~ -15V表示逻辑1,3V ~ 15V表示逻辑0 | 单端(非平衡) |
RS422 | 10Mbit/s | 4000ft ( 4000 * 0.3048= 1219.2m) | 点对多通讯(1发10收) | 四线制,全双工 | 4线 | 2V ~ 6V表示逻辑1,-2V ~ -6V表示逻辑0 | 差分(平衡) |
RS485 | 10Mbit/s | 4000ft ( 4000 * 0.3048 = 1219.2m) | 点对多通讯(1发32收) | 两线制,半双工;四线制,全双工 | 2线/4线 | 2V ~ 6V表示逻辑1,-2V ~ -6V表示逻辑0 | 差分(平衡) |
SPI | 一般几百Kbps,高的可达10Mbps,取决于从设备 | 传输距离短,一般只适合板内信号传输 | 点对多通讯 | 全双工、同步通讯 | 4线 | ||
IIC | 100Kbps 400Kbps 3.4Mbps 5Mbps |
传输距离短,一般只适合板内信号传输 | 多主多从 寻址地址7bit,可连接128个从器件 |
串行、半双工总线 | 2线 | ||
CAN | ISO11898:1Mbps ISO11519-2:125Kbps |
40m/1Mbps 1km/40kbps |
多主多从 | 串行、半双工 | 2线 | CAN_H=3.5V和CAN_L=1.5V表示逻辑0 CAN_H=2.5V和CAN_L=2.5V表示逻辑1 |
差分 |
概念解释:
图1.1 全双工、半双工、单工对比图
同步通信:要求通信双方以相同的时钟频率进行,而且准确协调,通过共享一个单个时钟或定时脉冲源保证发送方和接收方的准确同步,效率较高;
异步通信:不要求双方同步,收发方可采用各自的时钟源,双方遵循异步的通信协议,以字符为数据传输单位,发送方传送字符的时间间隔不确定,发送效率比同步传送效率低。
简单的区分同步通信和异步通信就是同步通信的主器件会发送时钟信号。
异步通信和同步通信的比较:
(1)异步通信简单,双方时钟可允许一定误差。同步通信较复杂,双方时钟的允许误差较小。
(2)异步通信只适用于点<--> 点,同步通信可用于点<--> 多。
(3)通信效率:异步通信低,同步通信高。
电平是一个连续变化的电压范围,为了用这种模拟量的电压来表示数字量的逻辑1和逻辑0,
TTL电平规定:
对于输出电路:电压大于等于(≥)2.4V为逻辑1;电压小于等于(≤)0.4V为逻辑0;
对于输入电路:电压大于等于(≥)2.0V为逻辑1;电压小于等于(≤)0.8V为逻辑0;
TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限(噪声容限是指在前一极输出为最坏的情况下,为保证后一极正常工作,所允许的最大噪声幅度 [1] 。噪声容限越大说明容许的噪声越大,电路的抗干扰性越好 [1] 。)就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。
输出 L:<0.1*Vcc ; H:>0.9*Vcc;
输入 L:<0.3*Vcc ; H:>0.7*Vcc。
由于CMOS电源采用12V,则输入低于3.6V为低电平,噪声容限为1.8V,高于3.5V为高电平,噪声容限高为1.8V。比TTL有更高的噪声容限。
CMOS电平能够驱动TTL电平;TTL电平不能驱动CMOS电平,需要加上拉电阻
逻辑1的电平为-3~-15V,逻辑0的电平为+3~+15V,注意电平的定义反相了一次。
RS485采用差分信号负逻辑,逻辑"1”以两线间的电压差为-(2~6)V表示;逻辑"0"以两线间的电压差为+(2~6)V表示。
TTL接口电平常见的有3.3V和5V的。通过在0和TTL电平之间摆动,来传输数据。需要通讯双方“约定”好速率。也就是说,通过TTL电平传输的UART接口是一种不传输时钟的"异步通讯"方式。而RS485接口,简单说就是把TTL的“0-3.3V/5V之间摆动”的信号,转换为“5V压差颠倒反转的AB线信号”,并且扩流驱动电缆电容。所以可以理解为,RS485是以TTL数据源的总线驱动芯片。RS485采用差分信号逻辑,更适合长距离、高速传输。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL电路连接。
UART 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种通用的串行异步全双工数据收发传输器(总线)。
UART的作用是:把“要传输的数据”在串行通信与并行通信之间转换。在嵌入式领域,作为把并行信号转成串行信号的硬件设备,UART通常被集成于MCU内部。
UART:universal asynchronous receiver and transmitter 通用异步收/发器,即串行异步全双工收发器。
USART:universal synchronous asynchronous receiver and transmitter 通用同步/异步收/发器,即串行异步/同步全双工收发器。
从名字上可以看出,USART在UART基础上增加了同步功能,即USART是UART的增强型。其实当我们使用USART在异步通信的时候,它与UART没有什么区别,但是用在同步通信的时候,区别就很明显了。大家都知道同步通信需要时钟来触发数据传输,也就是说USART相对UART的区别之一就是能提供主动时钟。
UART管脚定义:TX、RX、GND; USART管脚定义:TX、RX、GND、SCLK。
(1)波特率:此参数容易和比特率混淆,其实他们是由区别的。具体可以百度更清楚。但是我认为uart中的波特率就可以认为是比特率,即每秒传输的位数(bit)。一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数(bit)。
(2)起始位:先发出一个逻辑”0”的信号,表示传输数据的开始。
(3)数据位:可以选择的值有5,6,7,8这四个值,可以传输这么多个值为0或者1的bit位。这个参数最好为8,因为如果此值为其他的值时当你传输的是ASCII值时一般解析肯定会出问题。理由很简单,一个ASCII字符值为8位,如果一帧的数据位为7,那么还有一位就是不确定的值,这样就会出错。
(4)校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。就比如传输“A”(01000001)为例。
a、当为奇数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数(奇校验)。图-1的波形就是这种情况。
b、当为偶数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数(偶校验)。
c、此位还可以去除,即不需要奇偶校验位。
(5) 停止位:它是一帧数据的结束标志。可以是1bit、1.5bit、2bit的空闲电平。可能大家会觉得很奇怪,怎么会有1.5位~没错,确实有的。所以我在生产此uart信号时用两个波形点来表示一个bit。这个可以不必深究。。。
(6) 空闲位:没有数据传输时线路上的电平状态。为逻辑1。
(7) 传输方向:即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。比如传输“A”如果是MSB那么就是01000001(如图-2),如果是LSB那么就是10000010(如下图的图-4)
(8) uart传输数据顺序:如图3.1所示,刚开始传输一个起始位,接着传输数据位,接着传输校验位(可不需要此位),最后传输停止位。这样一帧的数据就传输完了。接下来接着像这样一直传送。
(9) 帧间隔:即传送数据的帧与帧之间的间隔大小,可以以位为计量也可以用时间(知道波特率那么位数和时间可以换算)。比如传送”A”完后,这为一帧数据,再传”B”,那么A与B之间的间隔即为帧间隔。
图3.1 uart传输数据顺序图
RS232是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家、计算机终端生产厂商共同指定的用于串行通讯的标准该标准此规定采用一个标准的连接器,标准中对连接器的每个引脚的作用加以规定,还对信号的电平加依规定;标准规定采用一个25引脚的DB-25连接器,标准中对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定;后来IBM的PC机将RS232简化为一个DB-9的连接器,后来成为事实标准;现在工业控制的RS-232接口一般只使用RXD、TXD、GND三条线。
图4.1 RS232物理层连接结构图
图4.1为RS232物理层连接结构图,控制器的UART口输出一般为TTL电平,需要转换芯片转换成RS232电平。转换后经过DB9接口输出RS232信号。DB9接口定义如图4.2所示。 图4.3 为RS-232通过电平转换芯片与MCU通讯数据传输动态图,图中的DB9接口连接到电脑的DB9接口或通过USB转串口线连接到电脑USB口即可实现电脑与单片机通讯。
图4.2 RS232的DB9接口定义
图4.3 RS-232通过电平转换芯片与MCU通讯数据传输动态图
图4.4 串口转RS232 电路图
如图4.5所示:RS232数据包主要包括起始位、数据位、校验位、停止位四部分组成,而且通信双方必须以约定的通信协议和通信速率进行通信。数据位采用小端传输模式,即低位在前,高位在后。
图4.5 串口数据包构成
UART和RS232异同:
(1) 逻辑电平不同:UART是TTL电平;RS232是RS232电平,不能直接相连,需要电平转换芯片(MAX3232等)。
(2) 协议层完全相同:UART和RS232的协议层可以共享,没有较大区别。
特性总结:
工作方式:单端(非平衡);
节点数:点对点通讯(1收1发);
最大传输距离:50ft ( 50 * 0.3048 = 15.24m);
最大传输速率:20kbit/s;
连接方式:点对点(全双工);
电气特性:-3V ~ -15V表示逻辑1,3V ~ 15V表示逻辑0;
常用芯片有max232、SP232等
缺点:通信距离短,速率低,而且只能点对点通信,无法组建多机通信系统,且容易受外界电气干扰导致信息传输错误。
针对RS-232串口标准的局限性,人们又提出了RS-422,RS-485接口标准。RS-485/422采用平衡发送和差分接收方式实现通信:发送端将串行口的TTL电平信号转换成差分信号A、B两路输出,经过线缆传输之后在接收端将差分信号还原成TTL电平信号。由于传输线通常使用双绞线,又是差分传输,所以又极强的抗共模干扰的能力,总线收发器灵敏度很高,可以检测到低至200mV电压。故传输信号在千米之外都是可以恢复。
图5.1 RS485物理层连接结构图
如图5.1所示,主机发送给从机或者从机发送给主机,都会占用到A和B线,所以RS-485多用在半双工模式。主机的GPIO会控制RS-485收发器的DE管脚,设置发送模式,从UART_TXD线向RS-485收发器的数据(D或DI)线发送一个字节,收发器将在A和B线上将单端UART位流转换为差分位流,数据离开收发器后,主机立即将收发器的模式切换为接收模式。从机和主机是类似的,从机控制RS-485收发器的/RE管脚,设置为接收模式,接收主机发送的比特流,将其转换为单端信号,通过从机的UART RXD线接收,当从机准备好响应时,它按主机原来的方式进行发送,而主机变为接收。
RS-485是差分传输,因此当用单片机控制RS-485接口的设备时,需要用到收发器,这一点和CAN总线是类似。收发器内部是一个接收器(上半部分)加一个发送器(下半部分),下面简单说说收发器的原理,便于理解MCU是如何和485设备通信。
图5.2 RS-485收发器内部结构
图5.2为RS-485收发器内部结构图,介绍如下:
A和B为总线;
R为接收器输入;
RE为接收器使能信号;
DE为发送器使能信号;
D为发送器输出;
对于使能信号,字母上面加一横的为低电平有效(如上图RE),不加的为高电平有效(如DE)。
MCU的UART口的TTL电平经RS485收发器转换成RS485信号。RS485信号为差分信号,由于长距离布线会有信号衰减,而且引入噪声和干扰的可能性更大,在线缆A和B上的表现就是电压幅度的变化,但是,采用差分线的好处就是,差值相减就会忽略掉干扰依旧能输出正常的信号,把这种差分接收器忽略两条信号线上相同电压的能力称为共模抑制。
标准规定了,逻辑1:+2V to +6V;逻辑0:-6V to -2V。
图5.3 RS485信号发送接收说明
RS-485不需要使用特定的总线电压,只看最小差分电压。如图5.3所示,在较长的电缆上,电压衰减,接收器接收到的电压可能会降低到+/- 200 mV,这对于RS-485仍然是完全可以接受的,这也是RS-485的优点之一。
现在很多的RS-485转换器都是兼容RS-422的,所以看到很多转换器上面的信号都是T/R+、T/R-,即对应RS-485的A+和B-。
图5.4 RS485的DB9接口定义
对于DB9针型的母头,RS-485有如下的接线定义示意,Pin6~Pin9为N/A不接
现在典型的串行通讯标准有RS232和RS485,它们定义了电压,阻抗等,但不对软件协议给予定义。软件协议可参照UART协议说明。
RS-232和RS-485之间可以转换,一个方法是RS-232转换成TTL,再由TTL转换为RS-485,当然也有芯片支持将RS-232直接转换成RS-485,网上有很多模块。
图5.5 RS-232和RS-485转换模块
虽说RS-485没有标准的数据协议格式,但和CAN总线在很多地方是有相似的,比如A&B和CANH&CANL都是差分信号,通信都需要收发器,都需要120欧姆的匹配电阻等等。
表5-1 RS485和CAN总线对比表
总线特性 | CAN总线 | RS-485总线 |
硬件成本 | 稍高 | 低廉 |
总线利用率 | 优先级自动仲裁,利用率高 | 采用轮询,利用率低 |
数据传输率 | 高 | 低 |
错误检测机制 | 控制器带校验机制,保证底层数据传输正确 | 只有物理层规范,无数据链路层规定 |
单节点故障影响 | 总线无影响 | 总线瘫痪 |
开发成本 | 软件开发灵活,时间成本低 | 开发难度较大 |
系统成本 | 较低 | 高 |
图5.6 RS-485电路图
(1)使能信号RE和DE可采用一个GPIO控制,节省资源,GPIO25输出高电平,RE=DE=0V,进入接收模式;GPIO25输出低电平,RE=DE=3.3V,进入发送模式。
(2)有一些电路中会在A上加上拉,B上加下拉电阻,主要原因是:RS-485总线在idle状态,电平是不固定的,即电平在-200mV~+200mV之间,收发器可能输出高也可能输出低,UART在空闲时需要保持高电平的,如果此时收发器输出一个低电平,对UART来说是一个start bit,会导致通信异常。
其它应用电路:
图5.7 RS-485电路图2
RS-485总线同I2C,也是主从模式,支持点对点单从机模式,也支持多从机模式,一般不支持多主机模式。
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线拓扑结构。RS-485总线网络拓扑一般采用终端匹配的总线型结构。即采用一条总线将各个节点串接起来,不支持环形或星型网络。如果需要使用星型结构,就必须使用485中继器或者485集线器才可以。RS-485/422总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。
图5.5 RS485拓扑结构图
图5.6 RS485一主多从效果图
由于RS-485总线支持点对多点通信模式,而其没有数据冲突检测解决机制,所以数据冲突的问题都是依靠主机来解决,通过主机对整个系统进行全方位的控制,避免数据冲突的产生。主机需要能够识别下位多个从机设备,所以从机设备必须具备一个在485网络中的唯一的地址码。485通信主机下发指令是以广播形式发送,485通信从机接收到相关指令,将指令中的地址码与自己的地址码对应,发现是下发给自己的指令则立即执行相关指令,执行完相关指令之后发送相应的状态代码给485通信主机,示意其可以继续下一条指令。否则丢弃该指令,静默等待485通信主机的下一条指令。
一般而言,由于必须通过主机进行控制以避免数据冲突,基于RS-485总线通信只能支持一主多从的通信方式。在485通信网络中,也有可能存在多个RS-485通信主机共存于同一个RS-485通信网络中,在这种情况下,深圳市国科伟业通信技术有限公司开发出相应的485共享器用于满足这些需求。
特性总结:
RS422目前用的比较少。其电气性能与RS-485近似一样。主要的区别在于:
(1)RS-485 有2 根信号线:发送和接收都是A 和B。由于RS-485 的收与发是共用两根线,所以不能够同时收和发(半双工)。
(2)RS-422 有4 根信号线:两根发送(Y、Z)、两根接收(A、B)。由于RS-422 的收与发是分开的,所以可以同时收和发(全双工)。
(3)支持多机通信的RS-422将Y-A 短接作为RS-485 的A、将RS-422 的Z-B 短接作为RS-485 的B可以这样简单转换为RS-485。
很多人往往都误认为RS-422串行接口是RS-485串行接口的全双工版本,实际上,它们在电器特性上存在着不少差异,共模电压范围和接收器输入电阻不同使得该两个标准适用于不同的应用领域。RS-485串行接口的驱动器可用于RS-422串行接口的应用中,因为RS-485串行接口满足所有的RS-422串行接口性能参数,反之则不能成立。对于RS-485串行接口的驱动器,共模电压的输出范围是-7V和+12V之间;对于RS-422串行接口的驱动器,该项性能指标仅有±7V。RS-422串行接口接收器的最小输入电阻是4KΩ;而RS-485串行接口接收器的最小输入电阻则是12KΩ。
特性总结:
工作方式:差分(平衡);
节点数:点对多通讯(1发10收);
最大传输距离:4000ft ( 4000 * 0.3048 = 1219.2m);
最大传输速率:10Mbit/s;
连接方式:一点对多点(四线制,全双工);
电气特性:2V ~ 6V表示逻辑1,-2V ~ -6V表示逻辑0;
缺点:连接的设备少,抗干扰能力不强,无法完全满足工业需求。
常用芯片有max232、SP232等
SPI总线首次推出是在1979年,Motorola公司将SPI总线集成在他们第一支改自68000微处理器的微控制器芯片上。SPI总线是微控制器四线的外部总线(相对于内部总线)。与IIC不同,SPI没有明文标准,只是一种事实标准,对通信操作的实现只作一般的抽象描述,芯片厂商与驱动开发者通过data sheets和application notes沟通实现上的细节。SPI接口采用主从模式(MasterSlave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSBfirst);SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。
总线结构如图7.1所示,SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。
图7.1 SPI线路连接图
信号定义:
(1)MOSI:主器件数据输出,从器件数据输入
(2)MISO:主器件数据输入,从器件数据输出
(3)SCLK:时钟信号,由主器件产生
(4)/CS:从器件使能信号,由主器件控制
在SPI操作中,最重要的两项设置就是时钟极性(CPOL或UCCKPL)和时钟相位(CPHA或UCCKPH)。时钟极性设置时钟空闲时的电平,时钟相位设置读取数据和发送数据的时钟沿。主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。所以为了保证主从机正确通信,应使得它们的SPI具有相同的时钟极性和时钟相位。
SPI接口时钟配置心得:在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。
如图7.2所示,SPI接口在内部硬件是两个简单的移位寄存器,传输的数据为8位。如图7.3所示,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。在SCLK的下降沿上数据改变,上升沿一位数据被存入移位寄存器。
图7.2 器件内部SPI结构图
图7.3 SPI数据传输时序图
在一个SPI时钟周期内,会完成如下操作:
1)主机通过MOSI线发送1位数据,从机通过该线读取这1位数据;
2)从机通过MISO线发送1位数据,主机通过该线读取这1位数据。
如图7.4所示,主机和从机各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。
图7.4 SPI数据传输动态图
图7.5 SPI数据传输动态图2
优点:
a、全双工,高速率传输 ,比如比I2C 传输速率更高
b、推免输出接口,推挽输出接口能够减少走线分叉
c、信号完成性强,通信协议灵活
d、消息帧可任意调节
e、功耗低,电路简单 ,不需要上拉电阻,功耗可以更低
f、软件配置简单
缺点:
a、单一主设备号通常只能支持一个主设备号
b、传输距离短,一般只适合板内信号传输
c、缺少硬件检查协议,没有硬件级别的错误检查协议
d、无法内部寻址,多从设备时需要额外的片选信号线
IIC 开发于1982年,当时是为了给电视机内的CPU和外围芯片提供更简易的互联方式。电视机是最早的嵌入式系统之一,而最初的嵌入系统是使用内存映射(memory-mapped I/O)的方式来互联微控制器和外围设备的。要实现内存映射,设备必须并联入微控制器的数据线和地址线,这种方式在连接多个外设时需大量线路和额外地址解码芯片,很不方便并且成本高。
为了节省微控制器的引脚和和额外的逻辑芯片,使印刷电路板更简单,成本更低,位于荷兰的Philips实验室开发了 ‘Inter-Integrated Circuit’,IIC 或 IIC ,一种只使用二根线接连所有外围芯片的总线协议。最初的标准定义总线速度为100kbps。经历几次修订,主要是1995年的400kbps,1998的3.4Mbps。
IIC结合了SPI和UART的优点。使用IIC,您可以将多个从设备连接到单个主设备上(如SPI),并且可以让多个主器件控制单个或多个从器件。当您希望有多个微控制器记录数据到单个存储卡或将文本显示到单个LCD时,这非常有用。
如图8.1所示,与UART通信一样,I2C仅使用两条线在设备之间传输数据,上拉电阻一般采用4.7KΩ。
图8.1 IIC线路连接图
信号说明:
SDA(串行数据) - 主站和从站发送和接收数据的线路。
SCL(串行时钟) - 承载时钟信号的线路。
(1)I2C是一种串行通信协议,因此数据沿着单线(SDA线)逐位传输。与SPI一样,I2C是同步的,因此位输出通过主机和从机之间共享的时钟信号与位采样同步。时钟信号始终由主机控制。
(2)总线上的设备都有唯一的地址,主机可以通过唯一的地址访问不同的设备。
(3)总线上通过上拉电阻接到电源,I2C设备空闲时,输出高阻态。所有设备都空闲时,都输出高阻态上拉电阻会把总线拉成高电平。
(4)多个主机同时使用总线时,为防止数据冲突,会利用仲裁方式决定哪个设备使用总线。
表8-1 I2C特性列表
Wires Used |
2(SDA、SCL) |
Maximum Speed |
Standard mode = 100kbps |
Fast mode = 400kbps |
|
High speed mode = 3.4Mbps |
|
Ultra fast mode = 5Mbps |
|
Synchronous or Asynchronous |
Synchronous |
Serial or Parallel |
Serial |
Maximum of Masters |
Unlimited |
Maximum of Slaves |
127 |
使用I2C时,数据被转换成messages,messages则被分解为数据帧。每条messages都有一个地址帧,其中包含从站的二进制地址,以及一个或多个包含正在传输的数据的数据帧。该消息还包括每个数据帧之间的启动和停止条件,读/写位和ACK / NACK位:
图8.2 I2C数据构成
图8.2为I2C总线数据构成,可以看出通过I2C总线完成一次数据传输的通信过程如下:
(1)主机发送起始信号启用总线;
(2)主机发送一个字节数据指明从机地址和后续字节的传送方向;
(3)被寻址的从机发送应答信号回应主机;
(4)发送或接收一个字节数据;
(5)如果是发送数据,则从设备产生应答信号;若是读取数据,则主设备产生一个应答;
(6)........ (循环步骤4、5);
(7)通信完成后主机发送停止信号释放总线;
启动条件:在SCL线路从高电平切换到低电平之前,SDA线路从高电平切换到低电平。
停止条件:SCL线路从低电平切换到高电平后,SDA线路从低电平切换到高电平。
图8.3 I2C启动停止时序
起始和停止条件始终由控制器生成。在起始条件之后,总线被视为忙碌状态。在停止条件之后的一段时间内,总线被认为是再次空闲的。
数据传输遵循图8.4 所示的格式。 在 START 条件 (S) 之后,将发送一个目标地址。由于I2C没有像SPI这样的从选择线,因此它需要另一种方法让从器件知道数据正在发送给它,而不是另一个从器件。它通过地址来做到这一点。地址帧始终是新消息中起始位之后的第一帧。主设备将与其通信的从设备的地址发送给与其连接的每个从设备。然后,每个从设备将从主设备发送的地址与其自己的地址进行比较。如果地址匹配,则将低电压ACK位发送回主机。如果地址不匹配,则从器件不执行任何操作,SDA线保持高电平。
一般这个地址有7位长,后跟第八位,即数据方向位(R/W)——“0”表示传输(WRITE),“1”表示数据请求(READ) 。地址是每个从站唯一的序列,用于在主站识别从站。一般地址为7位,也有10位的地址。
图8.4 I2C数据传输时序图
图8.5 I2C地址匹配过程
应答发生在每个字节之后。应答位允许接收器向发送器发出信号,表明该字节已成功接收,并且可以发送另一个字节。控制器生成所有时钟脉冲,包括确认第九个时钟脉冲。
应答信号定义如下:发送器在应答时钟脉冲期间释放SDA线,因此接收器可以将SDA线拉低,并在该时钟脉冲的高电平期间保持稳定的低电平。可以根据从设备的时序说明设置保持时间的长度。
当 SDA 在第九个时钟脉冲期间保持高电平时,这被定义为“无应答”信号。然后,控制器可以生成停止条件以中止传输,或生成重复的 START 条件以启动新的传输。有五个条件会导致 NACK 的生成:
(1)总线上没有具有对应传输地址的接收器,因此没有设备确认以进行应答。
(2)接收器无法接收或发送,因为它正在执行某些实时功能,并且尚未准备好开始与控制器通讯。
(3)在传输过程中,接收方收到它不理解的数据或命令。
(4)在传输过程中,接收方无法再接收任何数据字节。
(5)控制器-接收器必须向目标发送器发出传输结束的信号。
在主设备检测到来自从设备的ACK位之后,准备好发送第一个数据帧。数据帧始终为8位长,并以最高有效位先发送。紧接着每个数据帧的ACK / NACK位以验证帧已被成功接收。在发送下一个数据帧之前,主机或从机必须接收ACK位(取决于发送数据的人)。
在发送了所有数据帧之后,主设备可以向从设备发送停止条件以停止传输。停止条件是SCL线上从低电平到高电平转换后,SDA线上从低电平变为高电平,SCL线保持高电平。
多个主设备可以连接到单个从设备或多个从设备。当两个主设备尝试通过SDA线同时发送或接收数据时,同一系统中出现多个主设备的问题。为了解决这个问题,每个主设备需要在发送消息之前检测SDA线路是低还是高。如果SDA线为低电平,则表示另一个主控制器已控制总线,主控制器应等待发送消息。如果SDA线路很高,那么传输信息是安全的。要将多个主设备连接到多个从设备,请使用下图,使用4.7K欧姆上拉电阻将SDA和SCL线路连接到Vcc。
图8.6 多主多从接线图
任何IIC设备都有一个7位地址,理论上,现实中只能有127种不同的IIC设备。实际上,已有IIC的设备种类远远多于这个限制,在一条总线上出现相同的地址的IIC设备的概率相当高。为了突破这个限制,很多设备使用了双重地址——7位地址加引脚地址(external configuration pins)。IIC 标准也预知了这种限制,提出10位的地址方案。
10位的地址方案对 IIC协议的影响有两点:
图8.7
与其他协议相比,I2C听起来很复杂,不容易在程序中实现而导致数据丢失、无应答、“死等”等问题。但却有很多优点:
优点:
(1)只使用两根电线
(2)支持多个主服务器和多个从服务器
(3)ACK / NACK位确认每个帧都已成功传输
(4)硬件没有UART那么复杂
(5)众所周知且广泛使用的协议
缺点:
(1)数据传输速率比SPI慢
(2)数据帧的大小限制为8位
(3)实现比SPI更复杂的硬件
本章节参考:
I2C详解(2) I2C总线的规范以及用户手册(1) I2C 总线协议_fafuwxm的博客-CSDN博客_i2c总线规范