扫描二维码
随时随地手机看文章
引 言
在嵌入式系统设计中存在着大量的 IC 间通信,目前使用较多的为 I2C 通信。当前大部分单片机均可采用硬件方式的 I2C 模式进行通信,但也有少部分单片机为降低成本,并未设计硬件方式的 I2C 通信,因此只能采用软件方式来实现芯片间通信。目前已有大量文献讨论了 I2C 通信时主控方的软件编写,但作为通信的另一方,从控方的程序编写很少有相关资料涉及,特别是从控方的程序相较于主控方的程序更为复杂。因此从主机通信要求出发,总结了一套从机的通信软件编写流程[1-3]。
通过主机发出的信号请求,要求从控机采取相应应答信号。为了实现从机的实时性,要求从机的 SCL 线输入采用外部中断方式进行,可将中断方式设置为上升沿触发方式。
1 起始信号
图 1 所示为主控机发送I2C 起始信号的波形图。I2C 总线通过上拉电阻连接电源的正极,当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平都将使总线的信号变低,即各器件的 SDA及 SCL均为线“与”关系。进行 I2C通信时,首先要确认总线是否空闲。图 1中,主机先将数据线拉高,再将时钟线拉高,但需注意在拉高时钟线时从机的响应,其中时间 t1为从机响应时间。从机应立即释放时钟线,转为输入状态。主机只有检测到从机释放时钟线控制权时才能进行下一步操作。主机在拉高时钟线后,检测时钟线的状态,只有从机为输入,时钟线变高后,主机才可以发出起始命令 [4]。
图 1 主机发送起始信号波形
时钟信号线为高电平时,主机将数据线拉低以发送起始命令,此时从机检测到数据信号线产生由高到低的信号变化后,从机立即检测时钟信号线是否产生由高到低的变化, 如若产生,则说明通信起始信号已发出,主机准备与从机通信 [5]。从机控制流程如图 2 所示。
图 2 从机接收起始信号时的程序流程
2 停止信号
停止信号的产生比起始信号简单,从机对停止信号的要求也比起始信号简单。
图 3所示为主机停止信号波形图,对应从机在主机时钟信号进入中断服务程序后,通过检测主机在数据线上发出的由低到高的电平变化来确认通信结束。
图 3 停止信号波形
3 应答信号
主机发送 1 B 数据后,在第九个时钟(CLOCK)脉冲时必须释放数据线,由从机产生一个应答信号。从机回复低电平为有效应答(ACK),表示从机已成功接收到该字节 ;从机回复高电平为非应答信号(NACK),表示从机未成功接收该字节。如果是有效的应答信号位,要求从机在第九个时钟脉冲之前的低电平时间将数据线拉低,并确保在第九个时钟的高电平期间为稳定的低电平。如果主机从从机读取信息, 则在读完 1 B 数据后,主机向从机发送一个应答信号 ACK, 读完最后一个数据后,主机向从机发送一个 NACK 信号,通知从机结束数据发送,并在最后发送一个停止信号给从机。应答信号波形如图 4 所示。在每 8 位数据传送完成后,第九个时钟脉冲传送一个应答信号。向从机中写信息即由从机发出应答信号 ;从从机中读信息,即由主机发出应答信号。应答信号为低即为成功,为高则为失败。
图 4 应答信号波形
从机必须配合主机工作,从机在第九个时钟脉冲上升沿产生中断时,将根据自己的接收情况产生应答信号。从机工作程序流程如图 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所示。
图 8 从机读写数据程序流程
(2)主机从从机读数据
读取数据与写入数据时的格式存在一定区别,从机地址信息需写 2 次,且需发 2 次起始信息。数据框图如图 9所示。
由于接收数据时从机程序比较简单,在此不再讨论。
5 结 语
I2C 通信是单片机与单片机之间,或单片机与存储器之间的通信,对于经济型单片机而言,能有效节省单片机的I/O 口,因此 I2C 通信也在通信领域得到广泛应用。本文是长期编程过程中的经验总结,希望能给读者提供一定参考。