总线①I2C

很久以前就听说总线这个词了,一直不懂,所以觉得很牛叉。。。这次有机会学习,就干脆一起看看吧。

1 环境介绍

说实话,计算机的学习最好还是有个环境,裸学真的要难一些。这次搭的环境总的来说还是用之前的树莓派Pico搭配那个祖国版的saleae逻辑分析仪。设备用的是一个I2C驱动的OLED的屏。

逻辑分析仪的使用可以看这篇:逻辑分析仪小试-CSDN博客

电路的基本原理可以参考这篇:显示学习1(基于树莓派Pico) -- 基础_树莓派pico ssd1315-CSDN博客

因为确实没啥硬件经验,在中间遇到了两个坑。

第一个是抓信号的线应该怎么接。如果是软件,这个直接wireshark,或者命令啥的。处理硬件时候顿时傻眼了,本来我以为是串联,先接到逻辑分析仪in,逻辑分析仪一个out再出去。结果找半天都没看到这功能。后面找了半天,原来直接并联就可以了。

第二个问题是接上去之后,I2C上有信号,但是数据异常了。也是一头懵。查了半天,后面看到有GND,有个视频也说要接地。所以多插了一个GND口。好了,虽然偶尔还有点问题(并联的口不能挨着,不知道原因),但是基本能用了。

接法如下:

2 I2C信号

用了逻辑分析仪,信号就很直白了。开始的是这样的。

回头看看代码:

第一行是这个。这个是或操作,对结果没影响,所以还是0xAE。

发送的代码是:

self.addr = 0x3cdef write_cmd(self, cmd):self.temp[0] = 0x80  # Co=1, D/C#=0self.temp[1] = cmdself.i2c.writeto(self.addr, self.temp)

命令是:

SET_DISP = const(0xAE)
SET_DISP | 0x00,  # off

对应的波形就是,可以看到,第一段就是地址0x3c,第二段固定是0x80,第三段就是命令0xAE。每一段都有一个ACK,这是就是屏幕发的。

为什么地址是0x3C。查了一下资料,SSD1315的默认I2C地址通常是0x3C或0x3D。这里说一下地址这个词,真的很容易迷惑人,和我们一般理解的地址毛关系没有,其实就是一个设备ID。。。

那0x80又是什么鬼?只有去手册或者资料。这个是SSD1315/SSD1306的通信规定(不是所有的I2C设备)。这里有两个,0x80和0x40。如果是0x80,表明后面传输的是命令。如果是0x40,表明后面传输的是数据。

最后是一个0xAE,这个是代码里面的。就不用多说了。

再看后面的代码

SET_MEM_ADDR,
SET_MEM_ADDR = const(0x20)

对应的波形是和上面一样,第一段是地址0x3c,第二段固定是0x80表示命令,最后那段就是实际命令0x20。每段也有一个屏幕设备发的ACK。

3 协议解析

有了这个实验,再看看I2C协议。

I2C有两根线。

SDA(Serial Data Line):串行数据线,用于传输数据。

SCL(Serial Clock Line):串行时钟线,用于同步数据传输。每一个时钟周期大概是5.375us。

对应图中,上面的就是SDA,下面的就是SCL。

I2C信号的开始:

SDA拉低,SCL维持高位。

跟着就是数据包:

一个包是9个bit,前面8个是发送者发出,最后会再附加一个bit是接收者发ACK,表示设备收到,将SDA拉低。可以看到,上面的包最后一个都是低位。

怎么看数据是0还是1呢?查了一下资料,说是SCL上升中,看SDA的电平,如果是高就是1,如果是低就是0。那么翻译一下上面的图。

就是0111 1000 0,一共9个bit位。前面7个是0111 100。正好就是0x3C。第8个是读写位,1为写读作,0为写操作。这里的就是写。最后的第9位就是ACK,0表示响应了,1就是没响应。这里也是响应了。

从协议来看,地址有7个bit,也就是十进制的127。看来正常状态下一个I2C总线可以挂127个设备。感觉正常也是够了,不过挂多了可能影响速度,而且可能设备地址会冲突。

最后是结束包。

主设备在 SCL 保持高电平的情况下,将 SDA 线从低电平拉高。

一段完整的波形如下:

4 小结

这里只是简单介绍一下,其实I2C还有很多一些细节,比如冲突解决,协商之类的,这次就不写了。

从上面分析终于可以明白什么是总线。本质就是一根线传信息(真的就是总的来说一根或几根线)。假如说有两个人,都拉着一根线,这根线只能上下摆动,不能说话或者别的,只能通过这根线传递信息。总线协议,就是约定大家怎么甩绳子而已,本质上就是这么回事。

比如说,绳子默认都是放下面。A要说话了,就把绳子往上甩一下。B就知道A要说话了,然后约定个时间1秒间隔,往上甩就是1,不甩就是0。一次甩8下。B收到了就往上甩一下,没收到就不甩。好吧,总线,或者说I2C总线基本上就是这么回事。

从上面的分析看看,I2C协议还是相对简陋,基本上就是物理层的东西,很多实际内容都要设备定义,比如上面的0x80和0x40。至于为什么用两根线,说是为了确保数据传输的同步性和可靠性,尤其是在多主多从的复杂总线系统中。没详细研究了。

那么像上面说的只用一根线的有吗?还真有,如下:

FPGA - 单总线协议(one-wire)_单总线通信协议-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/389212.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标题:组合式API:优化Vue代码结构的艺术

摘要: 在Vue 3中,引入了组合式API,它提供了一种新的方式来组织组件逻辑。虽然组合式API带来了更高的灵活性和可维护性,但开发者也面临着代码组织和可读性的挑战。本文将探讨如何有效地利用组合式API,优化Vue代码结构&a…

gpio的使用,---->使用sysfs 控制gpio(第二节)

目的: 在 linux 文件系统上使用 sysfs 来控制 ,gpio的高低的变化。 逻辑;我只在 内核中是能 gpio 的pinctr&#xff4…

FPGA开发——状态机的使用

一、概述 我们在使用FPGA进行开发的过程当中,实现一个东西用得最多的实现方法就是状态机的实现方法,用一句话总结就是万物皆可状态机,这和我们在学习Linux时常说的在Linux中万物都是文件差不多,这里就主要就是突出状态机的应用范…

使用模版完成不同数据类型的数组的选择排序

目录 6.模版(167-263) 6.1函数模板 6.1.1函数模版注意事项 6.1.2函数模版案例--选择排序 1. 比较排序的基本概念 2. 决策树 3. 决策树的深度 4. 结论 5.选择排序示例: 6.模版(167-263) (项目先跳过) 模板不能直接使用,它只是一个框架. 模板不是万能的. 6.1函数模板…

JNPF全新V5.0版本!重磅升级——APP篇

尊敬的JNPF用户们: 我们非常高兴地宣布,经过团队数月的辛勤努力和不断的技术创新,JNPF快速开发平台终于迎来了里程碑式的全新升级——V5.0版本!这一版本的更新发布,不仅代表着我们技术实力的进一步提升,是…

Office Tool Plus部署、激活

1、下载安装,安装图片红色数字操作步骤 2、安装完成,激活,点击新手教程 找到相关教程 复制链接,在Office Tool Plus激活

Prometheus 监控 Nginx

作者:琉璃 一、Nginx_exporter安装 下载链接: https://github.com/discordianfish/nginx_exporter 下载nginx_exporter的docker镜像。 ocker pull fish/nginx-exporter先run一下,执行之后,会hold住,先不要关闭窗口…

THS6011容器版docker使用说明(by why+lqw)

THS6011容器版有分x86和arrch64两种安装包,主要是针对ths节点,本身并没有控制台的安装包,请根据自己的系统的cpu架构进行选择,本次使用的是x86的安装包作为演示。 下图是arrch64的镜像(PDMP-4980)&#xf…

Codeforces Round 962 (Div. 3)

前言 势必要拿下的一场比赛,最后结果也算如愿。 Standings:300 重新回到蓝名了,也完成了之前 “ 早日在比赛切掉 6 题 ” 的期望。 题目链接:Dashboard - Codeforces Round 962 (Div. 3) - Codeforces A. Legs 第一次在第一分钟就…

Segment Anything Model 2:使用Ultralytics框架进行SAM2图像分割

Segment Anything Model 2:使用Ultralytics框架进行SAM2图像分割 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行SAM2图像分割参考文献 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容…

Vue进阶之Vue无代码可视化项目(九)

Vue无代码可视化项目—补充内容 背景介绍、方案设计Canvas Table创建一个新的vue项目普通表格的效果Canvas上手Canvas画表格-画基本表格CanvasTable处理事件系统CanvasTable表格滚动Vue组件封装思想拖拽组件 —smooth-dndDndDemo1.vueDndContainer.jsCanvasTable封装CanvasTabl…

运维工作中的事件、故障排查处理思路

一、运维工作中的事件 https://www.51cto.com/article/687753.html 二、运维故障排查 一)故障排查步骤 1、明确故障 故障现象的直接表现故障发生的时间、频率故障发生影响哪些系统故障发生是否有明确的触发条件   故障举例:无法通过ssh登录系统 影响…

nginx 离线版本升级-停机

1. 最新版本下载 地址:https://nginx.org/en/download.html 2. 查看当前安装信息: which nginx (我获取的地址为/usr/local/nginx,之后用nginx-path代替) 2. 备份nginx执行文件 cp nginx-path/sbin/nginx nginx-path/sbin/nginx.bak …

redis的性能管理、主从复制和哨兵模式

redis的性能管理、主从复制和哨兵模式 一、redis的性能管理 redis的数据时缓存在内存中的 查看系统内存情况 info memory used_memory:853688 redis中数据占用的内存 used_memory_rss:10522624 redis向操作系统申请的内存 used_memory_peak:853688 redis使用内存的峰值 …

你看不上的“垃圾”——别人的赚钱“利器”

首先说一点,你认为是常识性的东西,也许还有4亿中国人不知道。 其次,你认为是遍地都有的、你看不上的、你瞧不起的这些“破烂玩意”,别人也许正拿来赚钱! 不可思议吧,事实就是如此。 我在老家,…

word打印---doc转html后进行打印,window.print、print-js、vue-print-nb

提示&#xff1a;word预览方式—插件 文章目录 [TOC](文章目录) 前言一、vue-office-docx把docx转换html二、调取window.print三、print-js四、vue-print-nb总结 前言 word预览 一、vue-office-docx把docx转换html npm install vue-office-docx -S-DofficeDocx.vue <templ…

Python爬虫知识体系-----Selenium

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用二、元素定位三、访问元素信息四、自动化交互五、PhantomJS六、Chrome headless 一、安装和基本使用…

html+css 实现左平移背景按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

计网面试题

OSI七层模型 物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层&#xff0c;应用层 应用层&#xff08;Application Layer&#xff09;&#xff1a;这是网络体系结构中的最顶层&#xff0c;提供用户接口和应用程序之间的…

Mosh|SQL教程第六弹

一、视图 1、创建视图CREATE VIEW viewname AS 这样就可以在左侧导航栏看到新增的view了&#xff0c;如果没有的话刷新一下就好了 可以把视图当表格使用 或者 注意&#xff1a;视图不存储数据&#xff0c;数据存储在表中 练习&#xff1a;创建一个视图&#xff0c;叫做客户结…