IIC协议编程要点,24C04为例

对于IIC编程来说,以下几点最为重要:

1、SCL和SDA必须用硬件或者软件上拉(也即“位与逻辑”,空闲时为1,只有总线上所有设备均为空闲1,总线才呈现为1,只要有一个设备为忙0,则总线就呈现为0)。

2、接收方总是在SCL为高电平期间采样bit位,等价于:发送方必须在SCL高电平期间保持SDA不变;

3、Ack的本质上就是发送1个bit的数据,它发生在接收完一个字节后(接收方可能是主机也可能是从机),也即第9个SCL的高电平期间。在SCL高电平期间,若SDA为0,就称为ACK,若SDA为1(默认上拉),称为NoAck。一般,在发完/收完第8个bit后,主机会把SCL拉低,此时接收方如果打算ACK的话,此刻就应该把SDA拉低,主机把SCL拉高后,SDA需要保持不变,以供接收方采集(这与上面第2条不谋而合)。也即,对于waitAck的一方,应该在SCL拉高后查询SDA的值。

4、Ack和NoAck都是是由接收方发出的,也即:
若主机在接收数据,那么Ack或者NoAck将由主机发出,典型场景如主机接收到从机传回的字节后;
若从机在接收数据,那么Ack或者NoAck将由从机发出,典型场景如从机接收到主机发起的片选字节后,又如从机接收到主机发起的寄存器选字节后;

实际应用中的IIC从机,只要收到了主机发来的字节,就必须向主机回复Ack,我至今都没见过从机向主机回复NoAck的从机。

而主机,有时会向从机发ACK,有时会向从机发NoAck。

也即:ACK这个概念,对于主机编程来说,涉及到4个函数(或者直接写成代码片段也行):①检查从机发来的是ack吗?②检查从机发来的是NoAck吗?③要向从机发Ack吗?④要向从机发NoAck吗?

5、SCL全程只被主机控制,从机无权控制SCL;

6、IIC器件地址有7bit和10bit之分,最低bit代表读(=1)或写(=0)。读写位会和器件地址合在一起发送。以7bit地址为例:BBBB_BBBX,其中X代表读写位,一般把最低位X设为0,也即相当于把IIC的写地址作为IIC的器件的地址,也即地址为BBBB_BBB0。

举一个24C04的例子:

(大多数IIC从机都是7bit的地址,第8bit指示读/写,主机发送芯片地址,这一过程称为片选)

1、单字节写

主机发出start ---> 主机发出片选字节(写) ---> 主机检测从机是否回复了Ack ---> 主机发送字节地址 --->  主机检测从机是否回复了Ack --> 如果上一步从机Ack了,主机发送一个数据字节 ---> 主机检测从机是否发出了Ack ---> 主机发出stop。

PS:“主机检测从机是否回复了Ack”,这一过程本质上就是:主机把SDA拉高,然后发出一个SCL高脉冲,并检测在高脉冲期间SDA是否被从机给拉低了,如果被拉低了,就意味着从机回复了Ack信号。

2、页内连续写多个字节(24C04不支持跨页写,如果本页写满了,则会返回本页的页首覆盖写)

主机发出start ---> 主机发出片选字节(写) ---> 主机检测从机是否回复了Ack---> 主机发送字节地址 ---> 主机检测从机是否回复了Ack --> 循环{ 主机发送数据字节 -->  主机检测从机是否回复了Ack } ---> 主机发出Stop

3、单字节读

主机发出start ---> 主机发出片选字节(写) ---> 主机检测从机是否发出了Ack---> 主机发送字节地址---> 主机检测从机是否回复了Ack --->  主机发出start ---> 主机发出片选字节(读) ---> 主机检测从机是否回复了Ack ---> 主机接收从机的单字节数据 ---> 主机向从机发出NoAck信号  --->  主机发出Stop

4、连续读出多个字节(24C04支持跨页连读)

主机发出start ---> 主机发出片选字节(写) ---> 主机检测从机是否回复了Ack---> 主机发送字节地址---> 主机检测从机是否回复了Ack --->  主机发出start ---> 主机发出片选字节(读) ---> 主机检测从机是否回复了Ack -> 循环{ 主机读取从机发出的一个字节 ---> 主机向从机回复Ack信号}  ---> 主机读取从机发出的一个字节 ---> 主机向从机回复NoAck信号 ---> 主机发出Stop。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先简单的说明以下I2C总线,I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。在 I2C总线上传送的一个数据字节由八位组成。总线对每次传送的字节数没有限制,但每个字节后必须跟一位应答位。数据传送首先传送最高位(MSB),数据传送按图1所示格式进行。首先由主机发出启动信号“S”(SDA在SCL高电平期间由高电平跳变为低电平),然后由主机发送一个字节的数据。启动信号后的第一个字节数据具有特殊含义:高七位是从机的地址,第八位是传送方向位,0表示主机发送数据(写),1表示主机接收数据(读)。被寻址到的从机设备按传送方向位设置为对应工作方式。标准I2C总线的设备都有一个七位地址,所有连接在I2C总线上的设备都接收启动信号后的第一个字节,并将接收到的地址与自己的地址进行比较,如果地址相符则为主机要寻访的从机,应在第九位答时钟脉冲时向SDA线送出低电平作为应答。除了第一字节是通用呼叫地址或十位从机地址之外第二字节开始即数据字节。数据传送完毕,由主机发出停止信号“P”(SDA在SCL高电平期间由低电平跳变为高电平)。   AT24C系列串行E2PROM具有I2C总线接口功能,功耗小,宽电源电压(根据不同型号2.5V~6.0V),工作电流约为3mA,静态电流随电源电压不同为30μA~110μA,AT24C系列串行E2PROM参数如下 型 号 容 量 器件寻址字节(8位) 一次装载字节数 AT24C01 128×8 1010A2A1A0 R/W 4 AT24C02 256×8 1010A2A1A0 R/W 8 AT24C04 512×8 1010A2A1P0 R/W 16 AT24C08 1024×8 1010A2P1P0 R/W 16 AT24C16 2048×8 1010P2P1P0 R/W 16   由于I2C总线可挂接多个串行接口器件,在I2C总线中每个器件应有唯一的器件地址,按I2C总线规则,器件地址为7位数据(即一个I2C总线系统中理论上可挂接128个不同地址的器件),它和1位数据方向位构成一个器件寻址字节,最低位D0为方向位(读/写)。器件寻址字节中的最高4位(D7~D4)为器件型号地址,不同的I2C总线接口器件的型号地址是厂家给定的,如AT24C系列E2PROM的型号地址皆为1010,器件地址中的低3位为引脚地址A2 A1 A0,对应器件寻址字节中的D3、D2、D1位,在硬件设计时由连接的引脚电平给定。   对AT24C系列 E2PROM的读写操作完全遵守I2C总线的主收从发和主发从收的规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值