I2C数据格式如下:
空闲:SCL=1,SDA=1;
Start:当SCL=1时,SDA由1向0跳变;
Stop :当SCL=1时,SDA由0向1跳变;
数据:SCL高时,数据稳定有效;SCL为低是,SDA可以改变数据;
ACK:SDA = 0;
NACK:SDA = 1。
传输格式:目前大多接触的都是7位寻址的。下面了解一下10位寻址或是混合类型的,具体如下描述:
1、主机发送器将10位从机地址发送到从机接收器
传输的方向不改变见图1当起始条件后有10位地址时每个从机将从机地址第一个字节的头7位11110XX与自己的地址比较并测试看第8位R/W方向位是否为0此时很可能超过一个器件发现地址相同并产生一个响应(A1),所有发现地址相同的从机将从机地址第2个字节的8位XXXXXXXX与自己的地址比较,此时只有一个主机发现地址相同并产生一个响应(A2),匹配的从机将保持被主机寻址,直到接收到停止条件P或从机地址不同的重复起始条件Sr。
2、主机接收器用10位的从机地址读从机发送器
传输方向在第2个R/W位改变(图2),整个过程直到并包括响应位(A2)都与主机发送器寻址,从机接收器的相同.在重复起始条件Sr后匹配的从机成员记得它之前被寻址这个从机,然后检查Sr后第一个字节的头7位是否和起始条件S后的相同并检查第8位R/W是不是1,如果匹配从机会认为它作为发送器被寻址然后产生响应(A3)。从机发送器保持寻址直到接收到停止条件(P)或从机地址不同的另一个重复起始条件Sr,重复起始条件Sr后所有其他从机器件也用从机地址第一个字节的头7位11110XX与自己的地址比较并检查第8位R/W。但是没有一个会被寻址,因为R/W=1(10位寻址)或11110XX从机地址(7位地址器件)不能匹配
3、组合格式:主机发送数据到从机然后从相同的从机读数据(图3)。相同的主机始终占用着传输方向在第二个R/W位后改变 ;
4、组合格式:主机发送数据到一个从机然后发送数据到另一个从机(图4)相同的主机始终占用着总线 ;
5、组合格式:在一个串行传输中组合了10位和7位寻址(图5)在每个起始条件S或重复起始条件Sr后发送10位或7位的从机地址。图5显示了主机如何发送数据到一个7位地址的从机然后发送数据到另一个10位地址的从机.相同的主机始终占用着总线 。
图1 主机--发送器用10位地址寻址从机--接收器
图2 主机--接收器用10位地址寻址从机--发送器
图3 主机用10位地址寻址从机,发送数据到该从机,并从该从机读取数据
图4 主机发送数据到两个都有10位地址的从机
图5 主机发送数据到两个从机。一个7位地址,一个10位地址
看完后发现和7位寻址大同小异,只是再多发一个地址比较了。
如下为之前在自己做项目中遇到的问题:
在触摸按键中,不断地快速切换按键,会出现iic的SCL一直保持一个电平的情况。使用的是模拟IIC,应该不存在iic互锁的情况。而且主机输出高,测到的还是低电平状态,割断线后才能测到输出为高。智能说是触摸芯片内部出了问题,把其拉低了。后咨询芯片厂家,说可能是触摸芯片内部iic出现了error,需要腹围才能解决。最终通过读iic的状态,知道是里面的iic一个错误,导致一直停留在某个状态。具体什么原因导致,厂家最终也没给出一个合理的解释
对于该问题,处理办法就是IO口连接至触摸芯片的复位脚,当出现应答错误,或者数据校验错误时,复位其从机,便可解决。
至此,也提一下硬件IIC互锁的情况。硬件iic互锁,一般是在从机准备发送应答信号给主机,此时主机的SCL还为高电平状态,还没等到SCL拉低,主机产生了复位,此时SCL一直拉高,从机在等SCL拉拉低读取应答,而主机等待从机出现电平变化,所以两个互相等待,导致锁住了。
互锁解决方法:①使用模拟iic②想办法在硬件电路上连接,使得主机复位时,从机也复位
iic模块程序建议:
建议使用宏来写管教,其他的用一个函数封装起来,方便以后移植。
列如:#define IIC_SCL P01
#define IIC_SDA P00
以后管教改变后直接更改引脚即可。
一般IIC选用具有开漏结构的IO口。因为需要具有输入输出功能。
只有输入功能的管脚,在一定条件下也可使用。之前调试一个FM,由于管脚不够用,复用了SD卡管脚(使用SD功能推出12M时钟给FM。由于该芯片选用了SD卡功能后,SD功能的所有IO口就不能作为其他普通IO口使用),直接把主机接的SCL,SDA都设置为输入,通过配置其接口的上拉,下拉电阻的大小来达到输出高、低电平的效果。