介绍
IIC是一种 同步 半双工 串行 总线
同步
指的是同一根时钟线(SCL)
半双工
可以进行双向通信,但是收发不能同时进行,发的时候禁止接收,接的时候禁止发送
串行
数据是一位一位发送的
总线
两根线(SCL SDA)可以接多个IIC类型器件,如AT24CXX,四针OLED,SHT30,AHT10
如何识别每个器件?
通过从机地址与每个器件通信 IIC玩的就是地址
不过实际开发中 我使用的是模拟IIC 两个IO口对应一个IIC器件
协议详解一 看懂时序图
献上一张让人懵逼的时序图 时序图来自AT24C02手册 需要手册的可以在评论区获取
SDAIN表示单片机给AT24C02发送数据
现在我们先去掉符号 是不是舒服了一些?
现在我们把他拆分成三部分
详解开始部分
SCL保持高电平
SDA从高电平到低电平(下降沿)
详解数据发送部分
SCL为高电平的时候 SDA数据不允许变化 (时钟线的上升沿 发送了一位有效数据)
SCL为低电平的时候 SDA数据允许变化
详解结束部分
SCL保持高电平
SDA从低电平到高电平(下降沿)
协议详解二 对照代码看时序图
对照开始时序图看代码
通过以上代码 可以看出
1 SDA SCL一开始都是高
2 SDA从高变成了低 (下降沿)
那么他是符合时序图的
但是可以看到 SDA SCL都为高电平期间 经过4us的延时 SDA才变为低电平 带着这个问题引出没有去掉符号的开始时序图
SCL和SDA想要改变电平 并不是一瞬间就能改变的 需要延时
tCHCL表示 SCL的高电平保持时间至少4us
tDLCL表示 SDA高电平保持时间(开始部分)至少4us
tCHDX表示 SDA拉低后 经过至少4us数据才能开始改变
看完上面三个参数 再看启动时序的代码 就能对应上了
对照结束时序图看代码
TCHDH SCL和SDA同时拉低后 经过至少4.7us SDA才能拉高 考虑SCL的低电平保持 这里应该取5us (停止部分)
TDHDL SDA的高电平至少保持(数据发送部分) 4.7us 才表示结束信号
代码里面是4us 这里考虑芯片厂家手册的延时差异 那么他是符合时序图的
对照数据发送代码看时序图
SCL拉低 经过TCLDX段时间 SDA可以进行数据改变 由于这个时间段手册值为0 所以SCL拉低 SDA可以马上改变
SDA数据保持稳定后 经过至少250ns 时钟线才能置高
且SCL的低电平保持时间是TCLCH 和TDXCX存在包含关系 所以取TCLCH段时间即可 也就是5us
代码取自正点原子的IIC例程 时序图来自ST官方手册 可以看到除了延时时间 其它是符合时序的 这里考虑各家芯片的延时存在差异