一.硬件连接
I2C必须使用开漏(或集电极开路)的引脚,其引脚框图如下所示。
SCL0对应78K0的P6.0引脚,SDA0对应78K0的P6.1引脚。
在使用开漏引脚通信时,需注意如下事项:
1)两条总线须外接上拉电阻;
2)通信前须设置引脚的I/O模式:
①输出信号时,PM6.0/PM6.1=0;
②输入信号时,PM6.0/PM6.1=1;。
3)开漏输出属于“线与”逻辑。故此,将总线置1即为释放总线,而总线上任一引脚置0,总线即为0。
二.I2C协议
I2C总线协议定义如下:
1)只有在总线空闲时才允许启动数据传送;
2)在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有跳变。时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。
2.1 总时序图
I2C总线串行数据传送时序如下图所示:
①起始信号:SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号。
②停止信号:SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
③应答信号:每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。在第9个时钟信号的高电平期间:若SDA为0,则为应答;若SDA为1,则为非应答。
2.2 各信号时序图
(1)起始和停止信号
起始和终止信号都是由主机发出的(从机均能检测到),在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。
为什么在SCL高电平期间不允许SDA数据变动?
因为,时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。
(2)应答信号(第9个时钟)
SCL线上的时钟脉冲信号由主机产生。
①当产生第9个时钟脉冲低电平时,发送器件释放SDA线,接收器把SDA线拉低,以给出一个接收确认位;
②第9个时钟脉冲高电平时,发送器检测到这个确认位,然后开始下一字节的传送,下一字节的第一个时钟脉冲低电平期间接收器释放SDA(刚才确认信号为低电平)。