周首杰
摘 要:以I2C通信主控方的要求为基础,讨论I2C通信从动方的程序编写。内容包括I2C通信的起始部分(握手部分)、数据传送部分以及停止部分的程序编写,以三部分通信波形要求为准,总结软件编写流程。I2C通信的数据格式灵活多样,可以一次传送8位二进制数据,也可以一次传送8的倍数的二进制数据,从机在通信中必须按照主机的要求进行数据传送。总结从机的数据传送程序流程,以期满足主机的通信要求,从而得出I2C通信从动模式的详细总结。
关键词:I2C通信;主控模式;从动模式;起始信号;停止信号;数据格式;数据传送
中图分类号:TP39文献标识码:A文章编号:2095-1302(2019)11-00-02
0 引 言
在嵌入式系统设计中存在着大量的IC间通信,目前使用较多的为I2C通信。当前大部分单片机均可采用硬件方式的I2C模式进行通信,但也有少部分单片机为降低成本,并未设计硬件方式的I2C通信,因此只能采用软件方式来实现芯片间通信。目前已有大量文献讨论了I2C通信时主控方的软件编写,但作为通信的另一方,从控方的程序编写很少有相关资料涉及,特别是从控方的程序相较于主控方的程序更為复杂。因此从主机通信要求出发,总结了一套从机的通信软件编写流程[1-3]。
通过主机发出的信号请求,要求从控机采取相应应答信号。为了实现从机的实时性,要求从机的SCL线输入采用外部中断方式进行,可将中断方式设置为上升沿触发方式。
1 起始信号
图1所示为主控机发送I2C起始信号的波形图。I2C总线通过上拉电阻连接电源的正极,当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平都将使总线的信号变低,即各器件的SDA及SCL均为线“与”关系。进行I2C通信时,首先要确认总线是否空闲。图1中,主机先将数据线拉高,再将时钟线拉高,但需注意在拉高时钟线时从机的响应,其中时间t1为从机响应时间。从机应立即释放时钟线,转为输入状态。主机只有检测到从机释放时钟线控制权时才能进行下一步操作。主机在拉高时钟线后,检测时钟线的状态,只有从机为输入,时钟线变高后,主机才可以发出起始命令[4]。
时钟信号线为高电平时,主机将数据线拉低以发送起始命令,此时从机检测到数据信号线产生由高到低的信号变化后,从机立即检测时钟信号线是否产生由高到低的变化,如若产生,则说明通信起始信号已发出,主机准备与从机通信[5]。从机控制流程如图2所示。
2 停止信号
停止信号的产生比起始信号简单,从机对停止信号的要求也比起始信号简单。
图3所示为主机停止信号波形图,对应从机在主机时钟信号进入中断服务程序后,通过检测主机在数据线上发出的由低到高的电平变化来确认通信结束。
3 应答信号
主机发送1 B数据后,在第九个时钟(CLOCK)脉冲时必须释放数据线,由从机产生一个应答信号。从机回复低电平为有效应答(ACK),表示从机已成功接收到该字节;从机回复高电平为非应答信号(NACK),表示从机未成功接收该字节。如果是有效的应答信号位,要求从机在第九个时钟脉冲之前的低电平时间将数据线拉低,并确保在第九个时钟的高电平期间为稳定的低电平。如果主机从从机读取信息,则在读完1 B数据后,主机向从机发送一个应答信号ACK,读完最后一个数据后,主机向从机发送一个NACK信号,通知从机结束数据发送,并在最后发送一个停止信号给从机。应答信号波形如图4所示。在每8位数据传送完成后,第九个时钟脉冲传送一个应答信号。向从机中写信息即由从机发出应答信号;从从机中读信息,即由主机发出应答信号。应答信号为低即为成功,为高则为失败。
从机必须配合主机工作,从机在第九个时钟脉冲上升沿产生中断时,将根据自己的接收情况产生应答信号。从机工作程序流程如图5所示。
4 数据传送
4.1 字节传送与应答格式
数据传送时先高位后低位,9位为一帧。如果从机未应答主机信号,如从机正在进行其他工作而无法接收总线上的数据,则此时从机在应答时必须将数据线置于高电平,产生一个非应答信号,主机产生一个终止信号以结束总线的数据传送。每传送完一个8位数据,主机都要与从机通过应答与非应答信号进行沟通以确定是否继续进行数据传送。
在主机从从机中读取数据时,主机收到最后一个数据字节后,必须向从机发出一个非应答信号(此时的应答信号由主机发出)作为线束标志。从机释放SDA线,允许主机产生终止信号。
4.2 数据帧格式
从机地址为7位,分别占据一个字节的D7~D1位。D0位为读写标志位,D0=0为写入从机操作;D0=1,为从从机读取数据操作。从机地址格式与读写格式如图6所示。
(1)主机向从机写数据,以8位数据加一位应答为一帧,从机负责应答。主机先写入从机地址,再写入从机存储器地址,后面为要写入的数据,以一个字节加一个应答位(非应答位)为一帧写入。如果只写一个字节,写完后主机可发停止信号,如果继续写入数据,则主机继续写入数据即可,不必再次输入存储器地址,从机会在上一地址上自动加1进行数据存储。此时要特别注意的是:从机一定要有应答信号(ACK),否则主机将终止数据的继续传送。从机无论是产生非应答信号还是在规定时间内未产生应答信号,主机都视为无应答,将终止数据传送。写数据格式如图7所示。
从机接收数据时程序较简单,只要在CLOCK时钟线上升沿产生的中断中依次接收数据,并在接收完8位数据后产生应答信号即可。然后对数据进行判断,如果为从机地址数据,则判断此数据是否与己方地址相同,相同则继续接收,不同则放弃接收。然后接收存储器地址,并接收数据,在接收数据时将所接收的数据依次存储。从机程序流程如图8所示。
(2)主机从从机读数据
读取数据与写入数据时的格式存在一定区别,从机地址信息需写2次,且需发2次起始信息。数据框图如图9所示。
由于接收数据时从机程序比较简单,在此不再讨论。
5 结 语
I2C通信是单片机与单片机之间,或单片机与存储器之间的通信,对于经济型单片机而言,能有效节省单片机的I/O口,因此I2C通信也在通信领域得到广泛应用。本文是长期编程过程中的经验总结,希望能给读者提供一定参考。
参 考 文 献
[1]赖麒文. 8051单片机C语言彻底应用[M].北京:科学技术出版社,2002:289-311.
[2]张毅刚.单片机原理及接口技术(C51编程)[M].北京:人民邮电出版社,2011.
[3]邹益民.单片机C语言教程[M].北京:中国石化出版社,2010.
[4]孙余凯,吴鸣山.I2C总线数控彩色电视机维修技能与数据大全[M].北京:电子工业出版社,2010.
[5]张军才,茹伟,赵腊才,等. I2C总线测试系统的设计与实现[J].仪表技术与传感器,2016(12):118-120.
[6]桑任仲,蔡艳波,徐萌,等. I2C总线在强干扰环境下的应用[C]// 2018中国汽车工程学会年会,2018-11.
[7]李荫珑,丘珊珊. I2C总线设计技术及其死锁的探讨[J].家电科技,2018(7):65-67.
[8]黄淑蓉.通过I2C总线接口的MCU固件升级方法[J].单片机与嵌入式系统应用,2018(7):20-24.
[9]陈春行,林春生,翟国君.基于MSP430的模拟I2C串口通信的实现[J].计算机与数字工程,2018(5):1029-1032.
[10]林倩. I2C协议解析及实测波形[J].数字技术与应用,2016(11):57-58.