嵌入式 - 时序图写代码
<!--[toc]-->
IIC,I2(方)C ,利用总线SCL、SDA,写时序读取数据
时序图:datasheet
总线的概念
总线占两线:SCL、SDA
为什么是总线:可以在总线上连接很多IIC设备,这样可以节省2个io口
从机地址
从机地址:身份证、与生俱来,生产厂家规定
当总线发送IIC的从机地址后,此IIC设备将返回一个应答信号
从机地址是IIC设备独有的,可以可能被自己定义。
从机地址一般为7位,通常情况下(24C02举例):
- 前四位固定
- 后三位自定义
最后一位:方向位 控制读写
- 为0:主机写设备操作
- 为1:主机读设备操作
以上8位构成了寻址字节
寻址字节
单片机是怎么发送寻址字节
IIC只有一位的数据接口,他只能一位一位的发送,所以IIC是串行发送
- 首先建立通信需要向总线发送一个从机地址,并且最后一位方向位为0
- 等待设备的应答信号,就能继续发送代码
观察时序 写代码 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需要在一段时间后调整至高电平即可。