最近一段时间工作上比较忙,一直没有抽出空来写文章与大家分享,这两天腾出些时间静下心来沉淀一番。看标题大家已经知道了是来总结I2C总线,我相信大家或多或少的都接触过I2C总线,这篇文章我们就由浅入深的仔细来研究研究,看看能不能挖掘些新东西,加深一下理解。

先说概念

I2C英文全称Inter-Integrated Circuit,字面意思是集成电路之间,也就是我们常说的I方C总线—I2C bus。它是一种串行通讯总线,使用多主从架构,由飞利浦公司(恩智浦NXP的母公司)在80年代开发,用于主板、嵌入式系统连接周边低速设备。

I2C由两条双向开漏线组成,这是一个很大的优势,接线简单。两条线利用上拉电阻将电位上拉。典型电位为+3.3V或+5V。标准传输速率为100Kb/s,低速模式10Kb/s。

物理层

下图为I2C总线的物理拓扑图,大家可以看到一共只有两条总线,一条SDA(serial data)数据线用来承载数据、一条SCL(serial clock line)时钟线用来控制数据收发时序。所有I2C设备的SDA都接到了总线的SDA上,SCL都接到了总线的SCL上。每个设备都有自己的唯一地址,以保证设备之间访问的准确性。

I2C总线的物理拓扑图

I2C在物理层的连接可以说是非常简单,这也是它最大的优势,原理就是通过控制SDA和SCL线的高低电平时序,来产生I2C总线协议所需要的信号进行数据传输。在总线处于空闲状态时SCL和SDA被上拉电阻拉高,保持高电平。

需要注意的是I2C的通讯方式为半双工,因为只有一条数据线,某一时刻只可能单向通讯。这也说明了I2C不适合大数据量的传输应用。

对于主机、从机的区分很简单,发布主要命令的就是主机,接受命令的就是从机,同一条I2C总线允许多个主机的存在。

协议层

作为基础我们先来了解几个重要的小概念。

1、初始状态(即空闲状态):SDA与SCL均为上拉电阻所致的高电平时为初始状态;
2、开始信号:当SCL为高电平的时候,SDA被拉低,此为开始信号,表明通讯开始。
3、终止信号:当SCL为高电平的时候,SDA被拉高,此为终止信号,表明本次通讯结束。

到这里大家有没有发现点什么?当SCL处于高电平的时候,SDA电平一旦变化就会是一种信号,要么开始要么是终止。所以在数据传输过程中SCL处于高电平时,SDA必须保持状态稳定,只有SCL处于低电平时SDA才可以变化。

4、应答信号:当发送器向接收器发送完一个字节/8位数据后,第9个时钟周期内,接收器必须给发送器一个应答信号,这样数据才算传输成功。高电平表非应答,低电平表应答。

我们了解这几个信号状态后,来一步一步看看数据是如何传输的。

1、向从机设备的某一个寄存器写一个字节数据:开始信号+设备地址(7位)+读/写(1位)+等待从机应答+寄存器地址(8位)+等待从机应答+要写的数据(8位)+等待从机应答+终止信号。下图为24C02 EEPROM存储器写数据的时序图。

2、写我们见识了,那读一个试试:下图为读取24C02当前地址一个字节数据的时序图,是不是一目了然了。值得注意的是当读的时候地址7位后的读写状态位为1。这里说一下为什么最后是NO ACK,在“读”这个操作下,主机为接收器,主机的NO ACK表示停止接收24C02的数据,不然24C02会继续发。

3、我们再读一个长一点的:下图为读取24C02任意地址一个字节数据的时序图。开始信号+设备地址(7位)+写(1位)+等待从机应答+数据地址(8位)+等待从机应答。前面这一步为假写,目的是告诉24C02要读哪个地址的数据。继续,开始信号+设备地址(7位)+读(1位)+等待从机应答+读到的数据(8位)+等待主机(接收机)应答+终止信号

补点干货

1、设备的地址。I2C设备的地址为8位,但是时序操作时最后一位不属于地址,而是读or写状态位。这就是为什么arduino的SH1106库里操作的地址不是0x7-而是0x3-,因为有用的是前7位,地址整体右移一位处理了。再一个设备地址的前四位是固定死的,是厂家用来表示设备类型的,比如接口为I2C的温度传感器类设备地址前四位一般为1001即9X、EEPROM存储器地址前四位一般为1010即AX、oled屏地址前四位一般为0111即7X等等。

2、I2C接口的致命缺点就是传输距离近同时速度慢。大家在使用I2C总线接口的时候切记不要长线传输,尽量只在PCB板内传输,不然偶尔丢数据甚至读不到数据会让人崩溃,不要问我是怎么知道的,问只有眼泪。

3、关于两线为什么设计成开漏,这个问题我记得我之前在写《STM32单片机I/O的8种工作模式》时给大家埋下过伏笔。今天就来说一下具体原因。主要有两点①防止短路:大家想想如果不设为开漏,而设为推挽,几个设备连在同一条总线上,这时某一设备的某个IO输出高电平,另有一台设备的某一个IO输出低电平,这时你会发现这两个IO的VCC和GND短路了;但是开漏就不会有这个问题,如下图示:

第二个原因是“线与”,我们想个场景:如果总线上的一个A设备将SDA拉高,这时总线上另一个B设备已将SDA拉低,这时由于1&0=0,所以A设备检查SDA的时候会发现不是高电平而是低电平,这就表明总线上已经有其他设备占用总线了,A只好放弃,如果检测是高电平那就可以使用。如下图示为24C02芯片内部图,可以看到状态检测脚。

总结

I2C总线作为一个常见的总线协议,是非常值得我们来仔细研究琢磨的,通透以后我们再使用任意I2C接口的设备时就可以信手拈来了。我一直觉得在学习的过程中,“会使用”不一定就是我们追求的终点,会用的同时把一些更深的东西搞懂搞透会收获意想不到的喜悦。

PS.近期会有开源项目推出,敬请期待~

「创作不易」

希望大家随手点个赞

这是对我最大的支持和鼓励你们的支持就是我继续创作的动力

总线全称_一篇文章讲透I2C总线协议相关推荐

  1. 百度排名批量查询_一篇文章讲透百度霸屏引流细节思路与极其简单的操作玩法...

    点评:百度霸屏引流现在常规的操作套路大部分都是挖掘关键词铺文章,核心就是拼文章内容,文章数量和平台,平台有了,文章有了,内容不行,上首页也很难转化,还是要在内容上多下功夫. 废话不多说,我们今天来聊聊 ...

  2. 【密码学】 一篇文章讲透数字证书

    [密码学] 一篇文章讲透数字证书 数字证书介绍   数字证书是一种用于认证网络通信中参与者身份和加密通信的证书,人们可以在网上用它来识别对方的身份.   我们在上一篇博客中介绍了数字签名的作用和原理, ...

  3. 一篇文章讲透控制反转和依赖注入

    https://www.jianshu.com/p/07af9dbbbc4b 转载链接:http://blog.xiaohansong.com/2015/10/21/IoC-and-DI/# http ...

  4. 一篇文章讲透线上应用监控

    "线上服务停了,要重启一下"?久经职场做研发的程序员,视线会逐渐转移到线上应用的运行状态.设想一下,如果你在半夜两点正在酣眠美梦时,微信群里突然炸开锅:"服务停了,先重启 ...

  5. 一篇文章讲透单片机的RAM和FLASH

    作为单片机内部一个重要组成部分,存储器占有很重要的地位,今天就来聊聊我对于单片机的内部存储器RAM和FLASH的一些认识和理解. 1.先聊聊存储器 存储器是单片机结构的重要组成部分,存储器是用来存储编 ...

  6. 一篇文章讲透yolo v1-v7

    YOLO V7出来的时候,有朋友跟我吐槽:V5还没闹明白呢,又来个V7,太卷了. 我找来了深耕目标检测的朋友张老师,从V1到V7,给各位做一次YOLO的系统分享. 张老师在辅助驾驶领域深耕多年,主要研 ...

  7. 10自带sftp服务器_一文讲透FTP和SFTP的区别

    阅读本文约需要10分钟,您可以先关注我们或收藏本文,避免下次无法找到. FTP和SFTP都是文件传输协议,我们知道FTP使用的是20和21端口,SFTP使用的是22端口.另外,SFTP前面的S应该是S ...

  8. c++ socket线程池原理_一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题...

    编辑:业余草来源:https://www.xttblog.com/?p=4946 一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题. ThreadLocal 相信不 ...

  9. 双线macd指标参数最佳设置_一文讲透双线MACD指标及其实战运用

    原标题:一文讲透双线MACD指标及其实战运用 船长的舍得交易体系技术理论模型中,我们要用到两大指标,分别是均线系统和双线MACD指标. 很多小伙伴都喜欢用双线MACD这个指标,但是90%的人都不知道其 ...

最新文章

  1. vscode 补全功能,和函数跳转
  2. bootstrap 多选框
  3. aria2下载工具命令行和图形化界面使用
  4. MATLAB实用知识,如何对函数的输入进行检查和解析?
  5. python 多进程共享变量manager_python 进程间共享数据 multiprocessing 通信问题 — Manager...
  6. NoSQL(1)之 Redis的五大数据类型使用方法的详细介绍
  7. 开通qq邮箱的smtp服务的流程详情
  8. 开源数据库这么香,为什么我们还要下功夫自研?
  9. Active Diretory 全攻略(一)--目录服务
  10. 一个优质的课堂直播软件需要具备哪些功能?
  11. 惯性矩如何计算机械转动惯量,[转载]ug中的惯性矩与转动惯量
  12. office2019初体验与kms服务器搭建
  13. 本学期计算机课总结,大学生计算机基础学期总结
  14. [杂谈]金克木:《与小说对话:不败求败》
  15. 2022当代科学技术前沿知识 课后测试
  16. 用这个方法解决Python多版本共存问题,简单粗暴
  17. rrpp协议如何修改_H3C 中低端以太网交换机 可靠性典型配置指导-6W100
  18. eclipse代码检查工具-FindBugs介绍
  19. Fastapi + deta 部署一个简单的笔记应用
  20. Powershell + HTA

热门文章

  1. python何时用list,dict,set
  2. 8.22 NOIP模拟测试29(B) 爬山+学数数+七十和十七
  3. Mybatis 开发 dao 的方法
  4. wordpress标签或者固定地址中文404错误解决插件
  5. 《面向对象程序设计》课程作业 (三)
  6. 设计模式 笔记 解释器模式 Interpreter
  7. CALayer 简单的使用
  8. Oracle 数据库管理脚本 命名规范
  9. 使用layer的弹窗时,出现layer引入成功,触发成功,控制台无报错,但是页面无变化或者仅出现遮罩层的问题的解决思路
  10. 使用fastJson把对象转字符串首字母大小写问题的解决