UART,I2C通信协议分析

一 、UART

UART:通用异步收发器,用它来传输串行数据。最精简3根线连接,全双工传输数据。如图1,TxD用于发送数据,RxD用于接收数据,Gnd给双方提供参考电平。

                            UART,I2C通信协议分析

                                                                       图1  UART连线图

数据线上以bit为最小单位传输数据。一帧数据由不可分割的若干位组成,包含起始位、数据位、校验位(不是必须)、停止位。

发送数据前双方需要约定好数据的传输速率,即发送一位数据所需的时间(波特率的倒数),还要约定好数据发送的格式,起始位,多少个数据位、是否有校验位、奇校验还是偶校验、多少个停止位。

奇校验和偶校验:

校验依据:判断传输的一组二进制数据中"1"的个数是奇数还是偶数(包含判断位)

奇校验:如果以二进制数据中1的个数(包含判断位)是奇数为依据,则是奇校验,若数据位中1的个数为奇数,则校验位是0

偶校验:如果以二进制数据中1的个数(包含判断位)是偶数为依据,则是偶校验,若数据位中1的个数为偶数,则校验位是0

如:发送一组8位二进制数,假定第一位为奇偶校验位,后七位为数据位,采用奇校验,则:

1>当发送数据是b'0000111时,发送数据中的1有3个,为奇数,此时校验位则为0,实际发出去的数据就是b'000000111;

2>当发送数据是b'000110时,发送数据中的1有2个,为偶数,此时校验位则为1,实际发出去的数据就是b'10000110;


下面以发送7个位数据(A = 0b1000001)、奇校验、2个停止位。为例说一下数据传输流程:

                                    UART,I2C通信协议分析

1.空闲时,数据线处于“空闲”状态,为高电平

2.开始位,要发送数据时,先发送低电平并保持一个位的时间T(T双方事先约定好,即设置波特率,PC端可通过界面手动设置,s3c2440需配置相关寄存器),表示要开始发送数据了。

3.一位一位发送数据,首先发送最低位,接收端在收到开始信号后,经过0.5T开始读取数据。

4.接收校验位,7个数据位中有2个1,故奇校验位为0。

5.最后有两个停止位,数据线恢复到空闲状态高电平,并保持2个T的时间表示停止位。

最后,在编写代码时,需要根据具体的芯片手册来配置串口控制器的相关寄存器。


二、I2C

        I2C总线又称IIC,是飞利浦公司开发的串行总线,用于连接微控制器及其外围I2C设备,主要特点如下:

只有两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;

串行8位双向数据传输,位速率标准模式下可达100Kbit/s,快速模式下400Kbit/s,高速模式下3.4Mbit/s;

可连多个从机,也是真正的多主机总线,两个或多个主机同时发起数据传输时,可以通过冲突检测和仲裁来防止数据被破坏  。

                                            UART,I2C通信协议分析


        相关术语介绍:

UART,I2C通信协议分析

 I2C的信号类型:总线空闲状态、开始信号、结束信号、响应信号

总线空闲状态 :I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

开始信号 :在时钟线SCL保持高电平期间(空闲状态),数据线SDA上的电平由高电平向低电平跳变(即负跳变),它标志着一次数据传输的开始。开始信号是一种电平跳变时序信号,而不是一个电平信号。开始信号是由主机主动建立的,在建立该信号之前I2C总线必须处于空闲状态。

结束信号 :在时钟线SCL保持高电平期间,数据线SDA被释放,使得SDA返回高电平(即正跳变),称为I2C总线的停止信号,它标志着一次数据传输的终止。停止信号也是一种电平跳变时序信号,而不是一个电平信号,结束信号也是由主机主动建立的,建立该信号之后,I2C总线将返回空闲状态。停止信号一般是在接收器反馈一个应答信号后发出。

                                       UART,I2C通信协议分析

响应信号 :I2C总线上的所有数据都是以8位字节传送的,按位传输,发送器每发送一个字节,就在时钟脉冲9期间释放数据线SDA,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 接收到NACK时,主机要么产生产生STOP信号来放弃本次传输,或者重复START条件来发起一个新的传输。

UART,I2C通信协议分析

        对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在第9个脉冲的高电平期间为稳定的低电平。 如果接收器是主机,则在它收到最后一个字节后,需要终止本次数据传输时,则会发送一个NACK信号给从机,以通知从机发送器结束数据发送,并释放SDA线,以便主机发送一个停止信号P。

以下几种情况会产生NACK,而不是产生ACK:

1.主机选中的地址在总线上没有对应的从机;

2.从机不能响应主机,例如从即在执行其他事情而无法响应I2C操作;

3.从机接收器不能接收更多数据时;

4。主机作为接收器,收到当前8位数据后本次数据传输就要救赎时,主机会发送一个NACK信号给从机,以通知从机发送器结束数据发送,并释放SDA线,以便主机发送一个停止信号P。

SDA上的数据传输:在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据,从高位开始传输。进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定,低电平为数据0,高电平为数据1。只有在SCL为低电平期间,才允许SDA上的电平改变状态。逻辑0的电平为低电压,而逻辑1的电平取决于器件本身的正电源电压VDD(当使用独立电源时)。

传输有用的数据位时(数据有效性规定),SDA上传输的数据必须在SCL为高电平期间保持稳定(接收器在SCL高电平期间读取数据),SDA上的数据只能在SCL为低电平期间变化。这个有区别于之前说的开始信号和停止信号,开始信号和停止信号都是在SCL为高电平期间有一个信号跳变。它们是信号跳变,不遵守这个数据有效性规定。

UART,I2C通信协议分析


插入等待时间  

  如果从机需要延迟下一个数据字节开始传送的时间,则可以通过把时钟线SCL电平拉低并且保持,使主控器进入等待状态。一旦被控器释放时钟线,数据传输就得以继续下去,这样就使得从机得到足够时间转移已经收到的数据字节,或者准备好即将发送的数据字节。带有CPU的从机在对收到的地址字节做出应答之后,需要一定的时间去执行中断服务子程序,来分析或比较地址码,其间就把SCL线钳位在低电平上,直到处理妥当后才释放SCL线,进而使主机继续后续数据字节的发送。

完整数据传输:

UART,I2C通信协议分析

I2C上几种总线数据传输格式:

  UART,I2C通信协议分析


I2C只是负责传输数据,具体的数据代表什么含义还是要去查看相应的I2C设备芯片手册,以s3c2440与AT24cxx存储芯片通信为例:

下图为随机读流程分析:

UART,I2C通信协议分析

1.START信号后是7位设备地址,然后一个读写位是写(0),表示s3c2440要向AT24cxx写数据,一个ACK回应表示总线上有AT24cxx这个I2C设备

2.接着的是发送一个7位地址WORD ADDRESS,即s3c2440向AT24cxx写入的数据,表示数据要从AT24cxx的WORD ADDRESS地址读取,ACK表示写成功。

3.(前面两步目的是明确从哪个设备的哪一个地址开始读取数据)接着又是一个START信号+设备地址+READ位,表示s3c2440要向AT24cxx读数据了,ACK表示该设备已就绪,接下来是连续8个数据,即读取到的数据,读取数据完毕后停止本次传输,一个NACK+STOP。

下图为按字节写流程分析:

UART,I2C通信协议分析

1.START信号+7位地址+写,表示向该I2C设备写入数据,ACK表示该I2C设备就绪。

2.接着写7个地址位(WORD ADDRESS)给AT24cxx,ACK表示写成功

3.8个数据位,即向地址(WRODADDRESS)写入DATA(8个数据位),ACK表示本次按字节写成功。随后停止结束本次传输。

参考:https://blog.****.net/ce123_zhouwei/article/details/6882221

参考:《嵌入式Linux应用开发完全手册》