[DAY 9] _I²C协议介绍

现在有不少的sensor传输都是用I2C协议在做传输的,在教学用I²C如何撰写前,我认为要先了解协议会比较好,不然遇到困难会看不懂错哪,明明照手册写但数值却跑不出来,这时候通常需要1个逻辑分析仪去看I²C的时序有没有符合手册上的时序,或有没有符合你想要写入的时序。

1.介绍:

I²C 是Inter-Integrated Circuit的缩写,I²C 只是用两条双向的线
一条 Serial Data Line (SDA) ,另一条Serial Clock (SCL)
I²C(Inter-Integrated Circuit)字面上的意思是积体电路之间,它其实是I²C Bus简称,中文可说成积体汇流排电路,它是一种串列通讯汇流排,使用多主从架构,由飞利浦公司在1980年代为了让主机板、嵌入式系统或手机用以连接低速周边装置而发展。I²C的正确读法为「I平方C」("I-squared-C"),而「I二C」("I-two-C")则是另一种错误但被广泛使用的读法。

2.I2C 的实体界面:

I2C 的实体界面只有两根讯号,分别称之爲 SCL(serial clock)与 SDA(serial data),而由於 I²C 是一个 bus,在这个 bus 上所有的装置都得透过这两个讯号相连,也就是说 I²C 只需要两根讯号线,就可以让很多装置彼此之间互相通讯。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979ow8RnEZzGT.png
上图是一个典型的 I²C bus 电路,bus 上的所有装置都透过 SCL/SDA 这两根线相连。I²C 允许 bus 上可以有多个 master、多个 slave 存在,只要彼此的 address 不冲突、装置数量没有超过 bus 的电气特性上限就没有问题。
在这个电路中,有两个上拉电阻,分别将 SCL 和 SDA 拉到 VCC。这两颗电阻称之爲 I²C bus 的「上拉电阻」(pull-ups),它们是 I²C bus 能正常运作的关键。

3.Wired-AND:

I²C bus 上所有的装置都是透过 open-drain 或 open-collector 的方式来驱动 SCL 或 SDA。一般 push-pull 的数位逻辑输出电路会有 high/low 两颗电晶体,各自负责把输出拉到 high 或 low 的工作,但 open-drain 或 open-collector 的输出则只有 low-side 一颗电晶体。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979bsPDEvJmRG.png
从上面的电路可以看出,因爲 open-drain 输出电路只有 low-side 一颗电晶体,它只能把输出拉到 low,无法把输出变成 high,因此当 open-drain 输出的 low-side 电晶体不导通时,它就会呈现 high-Z 的高阻抗状态,就好像它没有接到任何东西一样,所以设备与主机之间都需要接个上拉VDD的电阻以确保设备空闲时为High。

Wired-AND(线与)的重点:

当所有的装置都输出 high 时,bus 上的状态才会是 high
只要有任何一个装置输出 low,bus 上的状态就会是 low
https://ithelp.ithome.com.tw/upload/images/20210922/201419793hLWw3Ydhj.png
这样的电路称之爲「Wired-AND」逻辑,它的意思是用电路连接(wired)构成的 AND 逻辑,I²C bus 上的所有装置,就是靠着 Wired-AND 的逻辑连接在一起的。

至於上拉电阻的大小,是 I²C bus 电路设计上一个很重要的参数。这个电阻放得太大的话拉 high 的速度会很慢,影响到 bus 高速运作的稳定性;放的太小,又会担心装置的驱动能力不够,无法把 bus 拉得够地

4.基本时序:

I²C bus 上的逻辑讯号有几个重要原则要记得(一定要了解):

  1. 当I²C bus 上没有任何活动时,SCL 和 SDA 都维持在 high
  2. SCL 为 high 时, SDA 上的资料为有效,此时 SDA 的状态不能改变,以确保接收方可以取样到正确的 SDA 状态(绿色部分)
  3. SCL 为 low 时,SDA 的状态可以改变(蓝色部分)
  4. 当 SCL 为 high 时,如果 SDA 变动,有两种特殊状况:(下图黄色部分)
    SCL high、SDA 下降—START (开始信号)
    SCL high、SDA 上升—STOP (停止信号)

https://ithelp.ithome.com.tw/upload/images/20210922/20141979cdQItwtOr9.png

4-1.基本时序-Acknowledge(ACK)

每一个 8-bit 的资料传输结束後,会跟着一个 acknowledge bit。这个 acknowledge bit 固定由接收方产生,有两种用法:
1.当 master 是传送方、slave 是接收方,也就是说这个传输是 master 写入资料到 slave 时,这个acknowledge bit 是用来让 slave 告诉 master「收到!了解!正确!」
2.当 master 是接收方、slave 是传送方,也就是说这个传输是 master 从 slave 读取资料时,这个 acknowledge bit 是用来让 master 告诉 slave「我还要接着读,请继续准备下一笔资料」或者是「够了,我读完了」。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979FFfTl9pShp.png
Acknowledge bit 的状态定义是:
low -0 是「好、OK、收到、请继续」
high -1 是「出错了、没有人在家、不要继续」

4-2.基本时序-设备地址点名 (Address)

I²C 是一个多装置的 bus,因此每当 master 发起传输时,它得先点名,就像老师叫特定座号的同学回答问题一样,而这个座号就是I²C address。master不需要 I²C address,因为没有人会点名老师起来回答问题。
因此所有的 I²C 传输周期,第一个 byte 都是用来点名的,它的内容就是被点到装置的 address。
https://ithelp.ithome.com.tw/upload/images/20210922/20141979K0olgOvW4q.png
上图黄色的部份是呼叫从机的地址

4-3.基本时序-读or写资料基本格式

下面是 I²C master 对 slave 写入或读取一个 byte 资料的格式:
https://ithelp.ithome.com.tw/upload/images/20210922/20141979fXlK8sfSbV.png
由於这是PPT做的,我就直接用截图的方式,上图可以看的很清楚传输过程,我红框起来的是重要的地方这是根据你读或写来决定资料来去方向,左下角的部分是在说明MCU就像是主机,Sensor是从机在I²C是双向传输资料的。

我附上我参考的网站,我做了重点整理
参考网站:https://makerpro.cc/2020/05/i2c-interface-part2/

明天我就开始讲说我如何用软件去写协定吧,再来会接着ADXL345的Datasheet看法。
我提一下I²C有两种方式可以实现

1.硬体方式实现

利用官方写好的I²C函式去使用,只能选择有I²C复用功能的脚位。

2.软件方式实现

直接用GPIO口去达成I²C协议,任何IO口都可以用,我用的就是这个方式,我当初会选择这方式是因为我想真正弄懂I²C协议是在干嘛的!!,对了解有很大的用处,还有1个好处因为我只需要用到两个函式HIGH跟LOW组成各个的I²C协议部分,这样不管移植到哪个MCU都不会有困难,可以说是0修改移植!!!-,讲了那麽多好处,当然也讲不好的部分,理论上这软件定义的方式会比官方订好硬体的脚位上升速度和下降速度还来的慢,稳定度也是硬体方式的会较好。


<<:  Day09_插班车~风险评估的概念应用在日常工作上~XD"

>>:  Day7:终於要进去新手村了-Javascript-新手开始

[DAY29]番外篇-使用fetch传送表单资料

昨天我们介绍fetch用get方式来请求资料,并将取得的资料转为JSON格式做运用,今天要来介绍fe...

Day25 建立角色功能

首先建立装载角色资料的 ViewModel,因为接下来的权限会以角色判断,ASP.NET Core ...

op.29 《全领域》-全域开发实战 - 居家植物盆栽 Mvt IV (Flutter)

op.29 //今天脑袋暂时想不出干话 铁人赛也要来到尾声了,今天就来将之前在 Flutter 里...

Day17-选取器_单选+多选

暂时没有什麽小物件的想法 今天写一个简单的多选+一键取消的超简单选取器 首先先写HTML <f...

OpenStack Nova 介绍 2

本系列文章同步发布於笔者网站 上一篇文章我们介绍了 Nova 的功能与其使用方法,本篇文章将会继续介...