启动条件:在SCL为高电平时,SDA出现一个下降沿则启动I2C总线。
停止条件:在SCL为高电平时,SDA出现一个上升沿则停止使用I2C总线。
稳定状态:除了启动和停止状态,在其余状态下,SCL的高电平都对应SDA的数据稳定状态。
I2C总线可以用89C51单片机的I/O端口来模拟,用指令操作来模拟时序过程。假设采用89C51单片机普通I/O端口P1.0、P1.1模拟I2C总线,各种操作子程序设计如下:
(1)I2C总线启动子程序STAT
(2)停止子程序STOP
(3)发送应答信号0子程序MACK
(4)发送非应答信号1子程序NACK
(5)应答位检测子程序CACK(www.xing528.com)
当主控器发送完一字节,在被控器收到该字节的8位数据后,向主控器发送一个应答位,表示该字节接收完毕。
(6)发送一字节数据子程序WRBYT
把要发送的数据放在累加器A中,需要占用R0和C进位标志。若资源有冲突,应加现场保护指令。
(7)接收一字节数据子程序RDBYT
从被控器上读出一字节数据并保存在R2中。
用I2C总线传输的每一个数据位都由SDA线上的高电平和低电平表示,对应在SCL线上产生一个时钟脉冲。在时钟脉冲为高电平期间,SDA线上的数据必须稳定,否则会被认为是控制信号。SDA只能在时钟脉冲为低电平期间改变。启动后总线状态为“忙”,在结束信号过后的一定时间内,总线状态才被认为是“空闲”的。在启动和停止之间可传输的数据不受限制,但每字节必须为8位。数据传输时,从高位开始依次按串行方式传送,在每个字节传送完后必须跟一个响应位。主器件收发每个字节后产生一个时钟应答脉冲,在此期间,发送器必须保证SDA为高电平,由接收器将SDA拉低,称为应答信号(ACK)。主器件为接收器时,在接收最后一字节后不发应答信号,也称为非应答信号(ACK)。当从器件不能再接收其他字节时也会出现这种情况。
I2C总线中每个器件都有自己唯一确定的地址。启动条件开始后,主机要先给器件发送1字节地址,其中最低位(D0)为方向位。方向位为0表示主器件发送(W);方向位为1表示主器件接收(R)。总线上每个器件在启动条件开始后都把自己的地址与前7位相比较,如相同则器件被选中,产生应答,并根据读/写位决定在数据传输中是接收还是发送。无论是主发、主收还是从发、从收都由主器件控制。在主发送方式下,由主器件先发出起始信号(S),接着发出从器件的7位地址(SLA)和表明主器件发送的方向位0(W),即这一字节内容为SLA+W,被寻址的从器件在收到该字节后,返回一个应答信号(A),在确定主从握手应答正常后,主器件向从器件发送字节数据,从器件每收到一字节数据后都要返回一个应答信号,直到全部发送完为止。在主接收方式下,主器件先发出起始信号(S),接着发出从器件的7位地址(SLA)和表明主器件接收的方向位1(R),即这一字节内容为SLA+R,在发送完这一字节后,SCL继续输出时钟,通过SDA接收从器件发来的串行数据。主器件每接收到一字节数据后都要发送一个应答信号(A)。当全部数据都发送或接收完毕后,主器件应发出结束信号(P)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。