<!--[toc]-->

IIC,I2(方)C ,利用总线SCL、SDA,写时序读取数据

时序图:datasheet

总线的概念

总线占两线:SCL、SDA

为什么是总线:可以在总线上连接很多IIC设备,这样可以节省2个io口

从机地址

从机地址:身份证、与生俱来,生产厂家规定

当总线发送IIC的从机地址后,此IIC设备将返回一个应答信号

从机地址是IIC设备独有的,可以可能被自己定义。

从机地址一般为7位,通常情况下(24C02举例):

  • 前四位固定
  • 后三位自定义
  • 最后一位:方向位 控制读写

    • 为0:主机写设备操作
    • 为1:主机读设备操作

以上8位构成了寻址字节

寻址字节

单片机是怎么发送寻址字节

IIC只有一位的数据接口,他只能一位一位的发送,所以IIC是串行发送

  1. 首先建立通信需要向总线发送一个从机地址,并且最后一位方向位为0
  2. 等待设备的应答信号,就能继续发送代码

观察时序 写代码 24C02


上图红框中为寻址字节。

  • 中间的存储单元地址为存储器存放数据的地址
  • 后方的数据为设备向单片机发送的数据


上图红框部分与下图绿框部分一致。

  • MSB意为数据 字节最高位
  • ACK意为应答信号

启动START函数

带有参数的时序图

首先分析启动部分(START CONDITION):

SCL:保持一段时间的高电平

SDA

如图意思为,使SDA保持高电平一段时间(tCHDX)

这样写代码即可。

接下来继续分析SDA:

以上一个START启动阶段就写完了。

tCHCL:高时钟脉冲宽度

寻址字节发送

每经过一个SCL的方波周期,SDA就要发送一个数据

其SCL经过一个高脉冲信号(由低电平转为高电平),IIC设备都会检测SDA信号

那么就要先将SCL从高变为低,这样才会向设备发送一个高脉冲信号

  • 发送时,需要在SCL发送高脉冲信号前改变SDA的值后,才能有效的正确的发送读取。
  • 也就是当SCL处于低电平时改变SDA信号直至信号改变成功后,再将SCL调整到高电平。

SCL从低电平转换为高电平结束的时间成为时钟周期


上图中tCLDX表明:当SCL变为0后,SDA电平转换的时间

上图中tDXCX为:输入转换到时钟转换 意思为:SDA电平转换后需要经过一段时间才能让SCL电平置为高电平

因为tCHCL:低时钟脉冲宽度 中的时间包含 tDXCX,所以我们只需要考虑前者的时间间隔即可。

应答信号

当到达第九个时钟周期时,需要将SDA置为高电平,用于准备接受应答信号。

  • 当设备发送了应答信号后,就将SDA引脚的电平拉低,置为低电平。
  • 那么当SDA为0时,设备就回应了单片机的寻址地址指令,如图循环判断即可做到等待。


等待应答,不是应该先把SCL拉低,然后SDA拉高,然后再拉高SCL读取SDA信号是否被拉低,因为在SCL为高电平的时候SDA电平不能变化

STOP停止函数

观察时序图,初始都为0,SCL为1 SDA需要在一段时间后调整至高电平即可。