!!

一段时间接触后,对IIC又有了新的认识,请移步新文章 IIC协议及ADuc7126使用GPIO模拟IIC

概述

公司有一个需求,原来硬件IIC的位置被占用了,需要使用GPIO口来模拟IIC。

介绍

IIC介绍

IIC仅仅需要两根线:SDA, SCL;(未验证)SCL仅可由主机产生,而且主从机之间的SCL,SDA分别是线与的关系,且都默认开漏。

IIC主机模式基本的操作有:产生开始信号(S),产生开始信号(S),产生重复开始信号,产生应答信号(ACK),接收应答信号,产生非应答信号(NACK)。读一个字节,写一个字节。

器件地址

一般器件地址为8个字节,其中器件地址最后一位表示读(1)或者写(0)。

基本动作时序

下述中, 1即为高电平, 0即为低电平。

开始信号(S)
SCL为1,SDA由1变为0;

停止信号(P)
SCL为1,SDA由0变为1;

应答信号(ACK)
单个位,SCL为1,且SDA为0;

非应答信号(NACK)
单个位,SCL为1,且SDA为1;
对于NACK信号,要说明一下,很多资料及手册将其称之为“无应答”、“非应答”等等,容易让人望文生义,很具有迷惑性。个人认为,当发送给从机时,称之为“应答非信号”可能更加合适,因为其作用就是相对于应答信号(ACK)的另一种应答回应。
典型应用在多字节读取的时候,一般若主机要继续读下一字节,便发送ACK通知从机,从机则继续发送下一字节数据;若想要停止,便发送NACK通知从机,从机便不在发送下一字节数据,主机便可以产生P释放总线。
但若是从另一个角度去理解,若SDA在主机进行完读、写操作后,主机SDA默认拉高、从机SDA也默认拉高,这样来看,若是未回应,则就表现为非应答。若是回应(即主机或从机将SDA拉低),则表现为应答。

操作时序

一般存储类的从器件,其支持的操作模式有:指定地址单字节写,指定地址多字节写;当前地址单字节读,当前地址多字节读,指定地址单字节读,指定地址多字节读。

相关的主机IIC的操作顺序是(对于存储从器件,且存储目标地址为单字节)
写模式(指定地址单字节写)

  1. 产生S
  2. 写器件地址(写模式)。
  3. 接收从机ACK
  4. 写单字节的存储目标地址
  5. 接收从机ACK
  6. 写单字节数据
  7. 接收从机ACK
  8. 产生P;结束;
    指定地址单字节写时序图

写模式(指定地址多字节写)

  1. 产生S
  2. 写器件地址(写模式)
  3. 接收从机ACK
  4. 写单字节的存储目标地址
  5. 接收从机ACK
  6. 写单字节数据
  7. 接收从机ACK
  8. 写单字节数据(写入的地址会较上一次自动+1字节)
  9. 接收从机ACK
  10. 若要继续写,则重复步骤8、9;若要停止,产生P,结束

读模式(当前地址单字节读)

  1. 产生S
  2. 写器件地址(读模式)
  3. 接收从机ACK
  4. 读一个字节
  5. 产生NACK
  6. 产生P

读模式(指定地址单字节读)

  1. 产生S
  2. 写器件地址(写模式)
  3. 接收从机ACK
  4. 写单字节的存储目标地址
  5. 接收从机ACK
  6. 重复产生S,但是不放弃总线控制权。
  7. 写器件地址(读模式)
  8. 接收从机ACK
  9. 读取单字节
  10. 产生NACK
  11. 产生P,放弃总线控制权。

读模式(指定地址多字节读)

  1. 产生S
  2. 写器件地址(写模式)
  3. 接收从机ACK
  4. 写单字节的存储目标地址
  5. 接收从机ACK
  6. 重复产生S,但是不放弃总线控制权。
  7. 写器件地址(读模式)
  8. 接收从机ACK
  9. 读取单字节
  10. 产生ACK
  11. 读取单字节
  12. 若要继续,重复10、11;若要停止,产生NACK,产生P,放弃总线控制权。