APP下载

I2C通信协议应用及其注意事项

2015-07-09叶敬昌

家电科技 2015年1期
关键词:低电平高电平字节

叶敬昌

(珠海格力电器股份有限公司 广东珠海 519070)

1 概述

I2C总线只要求2条双向通信线路SDA(串行数据)和SCL(串行时钟)。每个器件都有一个唯一的地址,而且都可以作为一个发送器或接收器。如常用的存储器既可以接收又可以发送数据。除了发送器和接收器外器件在执行数据传输时也可以被看作是主机或从机。主机初始化总线的数据传输并产生允许传输的时钟信号,此时任何被寻址的器件都被认为是从机。

I2C总线是一个多主机的总线,这就意味着可以连接多个能控制总线的器件到总线。SDA和SCL都是双向线路,都通过一个电流源或上拉电阻连接到正的电源电压,因此当总线空闲时,SDA和SCL都是高电平,同时连接到总线的器件输出级必须是漏极开路或集电极开路。I2C总线上数据的传输速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s,但总线电容不能超过400pF。

2 I2C时序基础

SDA为数据信号(数据口)、SCL为时钟信号(高电平有效)。每次时钟信号SCL有效(高电平)时,表示此时数据信号有效,从机可以读取SDA数据信号;当时钟信号SCL无效(低电平)时,SDA数据信号无效,此时数据口(SDA)可以翻转电平、改变IO口(输入输出翻转等)等。见图1。

数据通信需要有起始位(S)和结束位(P)。I2C规定:在时钟有效时(高电平)数据口产生上升沿表示停止位(P位),产生下降沿表示开始位(S位)或重复开始(Sr位)。见图2。

I2C规定:通信以字节为单位,即一次通信需要发送8位数据,从机每收到一个字节数据后需要反馈一个低电平应答信号ACK;若主机需要改变原来的主从关系、读取关系,则必须由新主机产生一个开始位(S)或重复开始位(Sr)。下面以连续通信数据包为例解析一下I2C标准协议,见图3。

通信开始,由主机置位数据口、时钟口,在时钟信号有效时,数据口产生一个下降沿,表示通信开始(S位)。之后在时钟信号有效期间主机连续发送8位数据,这8位数据中前7位表示选中的从机地址,第8位表示操作指令。至此主机翻转数据口(由输出口翻转为输入口),准备读取被选中的从机的应答信号ACK。从机收到8位数据后,在下一个时钟信号有效前(从机输出),翻转IO口(由输入口翻转为输出口)输出一个低电平应答信号ACK,并输出有效的时钟信号给主机,表示一切就绪,准备好了下一字节的数据发送或接收。至此通信信道建立,以后主机可以和该选中的从机连续通信,直到主机产生一个停止位(P位)。

当通信过程中需要改变通信的方向,如,主机向从机写数据后,需要读取从机的数据,则需要在主机向从机写完数据后,在停止位(P位)之前,再产生一个开始位(此S位叫Sr重复开始位)。从机接收到Sr位后释放总线等待指令,这时主机就可以重新寻址并发送操作指令(读或写)。寻址过程中可以选择不同的从机也可以选着同一个从机,通信直到主机发送停止位(P位)后所有从机结束本次通信。

为了规范通信格式,I2C协议详细规定了:高低电平保持时间、上升、下降沿斜率等时间要求及其在不同通信速率下的标准值。如:在普通模式下(100K速率以下),开始位的下降沿,必须在时钟信号有效4uS之后产生才有效;在快速模式下为(400K速率)0.6uS;高速模式下(3.4M速率)为160nS。

3 I2C通信的应用及其注意事项

在家电领域,使用到I2C协议的地方很多,如:传感器通信、数据存储等。但对于低成本产品来说,由于使用的MCU等器件受成本限制,不会含有太多片上资源,IO口复用成为这些低成本产品的首先,因而不依赖芯片硬件资源,通过普通IO口用软件模拟I2C协议通信是软件工程师必修的一门课程。

下面以MCU和记忆芯片通信为例,简要说明一下,软件模拟I2C的应用及使用中的注意事项。

普通MCU和记忆芯片数据交换的通信电路,如图4所示(为了方便说明这里以IC24C02记忆芯片为例且强制其地址拉地,即地址为“1010000X”,其中X代表操作指令,“0”为写指令,“1”为读指令)。

通信过程如下:

(1)主机(MCU)发送第一个字节A0H,表示选择记忆芯片,操作为写;

(2)主机读取从机(记忆芯片)发送的应答信号ACK;

(3)主机发送第二个字节00H,告诉记忆芯片将要操作内部00H的存储地址;

(4)主机读取从机发送的应答信号ACK;

(5)主机发送第三个字节A1H,表示选择记忆芯片,操作为读,(读取的起始地址为上一字节的00H)。

(6)从机发送一个字节数据后,等待主机的应答信号ACK;

(7)主机读取一个字节数据后,发送应答信号ACK给从机;

(8)从机收到主机的应答信号后,发送下一个字节数据;

(9)重复(6)、(7)、(8)通信,直到通信结束,主机发送停止位P;

(10)从机收到停止位P后,结束通信。

在这个通信过程中,特别要注意主机使用软件模拟I2C协议,读取应答信号ACK时需要翻转IO口(由输出口变为输入口),翻转IO口过程中输入、输出寄存器必须先清零,同时需要在时钟信号SCL无效时翻转,否则将出现莫名的高电平,如图5所示。

究其原因,是主机翻转IO口为输入口读取从机应答信号后再次翻转为输出口准备下一字节数据发送时,输出寄存器没有清零(输出高电平“1”),因而,主机发送了一个莫名的高电平,经电阻分压后,就如图5所示的波形。

软件模拟I2C通信协议时,时序问题尤为重要,按照I2C标准协议,数据要在时钟信号无效时才能改变。若在时钟为高电平时产生上升沿则表示停止,产生下降沿表示开始(或重新开始)。

操作的流程为:开始(下降沿)——发送A0H(表示选择记忆芯片,操作为写)——读取应答信号ACK——发送00H(告诉记忆芯片将要操作内部00H的存储地址)——读取应答信号ACK——重新开始(改变操作)——发送A1H(表示选择记忆芯片,操作为读,读取的起始地址为上一字节的00H)。

但在“重新开始”的操作过程中,由于时序操作不当,产生了一个不应该的停止位,也就表示了前面的通信结束。将导致后面发送A1H,读取操作的时候,究竟读取记忆芯片存储器的哪个地址?是00H开始读还是11H开始读?I2C协议没有规定,将导致后面读取操作失败。如图6所示。

反应在源代码上就是程序先使时钟有效“PEEClock = 1”经延时“nop_1()”后IO口才输出高电平“PEEDataOut = 1”,这样就在时钟有效的前提下产生了一个上升沿,也就是停止位。

数据通信的高低电平,需要保持一定的时间,目的在于输入方能可靠检测到相应的电平,这就用到了软件上的延时,但延时并不是越长越好。如图7所示的通信波形,将导致通信失败。

主机向从机写入一个字节数据后,从机发送应答信号ACK(从机拉低数据口),主机读取应答信号后,准备继续写下一个字节数据。但在此时,从机已经释放了总线,并翻转为输入口,SDA数据被上拉电阻拉高,而时钟信号由于主机输出延时过长,导致从机接收到了一个停止位,后面主机发送的数据,从机不再响应,因此通信失败。

4 总结

I2C协议是一种灵活的、简单易用的、占用系统资源少的通信协议,因而受到广大工程师的喜好,应用非常广泛。即使使用片上的硬件资源实现I2C通信,时序上的配合、数据接收和发送,都需要和相关从机密切关联,切不可一刀切,因为各种从机对时序的要求、速率的要求均或多或少的有差别,因而不能一概而论。

使用软件模拟I2C协议,则更需要时序上的配合,IO的翻转、寄存器的操作、时钟信号保持的时间等等都需要通盘考虑,多一个NOP或许将导致整个通信失败。

[1]Philips.I2C Peripherals [J].Holand,2000.

猜你喜欢

低电平高电平字节
一种基于FPGA的PWM防错输出控制电路
No.8 字节跳动将推出独立出口电商APP
铁道车辆高/低电平信号智能发生器设计
TS-03C全固态PDM中波发射机开关机控制电路原理及故障分析
No.10 “字节跳动手机”要来了?
2017款凯迪拉克2.8L/3.0L/3.2L/3.6L车型低电平参考电压总线电路图
简谈MC7字节码
DM 50KW中波广播发射机欠推动故障分析
PDM 1kW中波广播发射机保护电路分析
15-MeV电子直线加速器的低电平系统