IIC简介及建议



I2C数据格式如下:
空闲:SCL=1SDA=1
Start
:当SCL=1时,SDA10跳变;
Stop
:当SCL=1时,SDA01跳变;
数据:SCL高时,数据稳定有效;SCL为低是,SDA可以改变数据;

ACK
SDA = 0
NACK
SDA = 1

 

传输格式:目前大多接触的都是7位寻址的。下面了解一下10位寻址或是混合类型的,具体如下描述:

1、主机发送器将10位从机地址发送到从机接收器

传输的方向不改变见图1当起始条件后有10位地址时每个从机将从机地址第一个字节的头711110XX与自己的地址比较并测试看第8R/W方向位是否为0此时很可能超过一个器件发现地址相同并产生一个响应(A1),所有发现地址相同的从机将从机地址第2个字节的8XXXXXXXX与自己的地址比较,此时只有一个主机发现地址相同并产生一个响应(A2),匹配的从机将保持被主机寻址,直到接收到停止条件P或从机地址不同的重复起始条件Sr

2、主机接收器用10位的从机地址读从机发送器

传输方向在第2R/W位改变(图2),整个过程直到并包括响应位(A2)都与主机发送器寻址,从机接收器的相同.在重复起始条件Sr后匹配的从机成员记得它之前被寻址这个从机,然后检查Sr后第一个字节的头7位是否和起始条件S后的相同并检查第8R/W是不是1,如果匹配从机会认为它作为发送器被寻址然后产生响应(A3)。从机发送器保持寻址直到接收到停止条件(P)或从机地址不同的另一个重复起始条件Sr,重复起始条件Sr后所有其他从机器件也用从机地址第一个字节的头711110XX与自己的地址比较并检查第8R/W。但是没有一个会被寻址,因为R/W=110位寻址)或11110XX从机地址(7位地址器件)不能匹配

3、组合格式:主机发送数据到从机然后从相同的从机读数据(图3)。相同的主机始终占用着传输方向在第二个R/W位后改变 ;

4、组合格式:主机发送数据到一个从机然后发送数据到另一个从机(图4)相同的主机始终占用着总线 ;

5、组合格式:在一个串行传输中组合了10位和7位寻址(图5)在每个起始条件S或重复起始条件Sr后发送10位或7位的从机地址。图5显示了主机如何发送数据到一个7位地址的从机然后发送数据到另一个10位地址的从机.相同的主机始终占用着总线 。

1 主机--发送器用10位地址寻址从机--接收器

2 主机--接收器用10位地址寻址从机--发送器

 

IIC简介及建议_第1张图片

3 主机用10位地址寻址从机,发送数据到该从机,并从该从机读取数据

IIC简介及建议_第2张图片

4 主机发送数据到两个都有10位地址的从机

IIC简介及建议_第3张图片

5 主机发送数据到两个从机。一个7位地址,一个10位地址

 

看完后发现和7位寻址大同小异,只是再多发一个地址比较了。

 

如下为之前在自己做项目中遇到的问题:

在触摸按键中,不断地快速切换按键,会出现iicSCL一直保持一个电平的情况。使用的是模拟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口使用),直接把主机接的SCLSDA都设置为输入,通过配置其接口的上拉,下拉电阻的大小来达到输出高、低电平的效果。

你可能感兴趣的:(协议)