总线学习1--I2C

news2024/9/21 16:44:49

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

1 环境介绍

说实话,计算机的学习最好还是有个环境,裸学真的要难一些。硬件学习其实难就难在搭环境,之前很多设备都很贵,示波器几千上万,JTAG也得几万,开发板也要不少钱。全套装备动辄成千上万,后面还要不停地采购。不像软件,一台电脑就开搞,后续也没啥投入。感谢现在科技的进步,这次搭的环境总的来说非常便宜,用之前的祖国树莓派Pico搭配那个祖国版的saleae逻辑分析仪。设备用的是一个I2C驱动的OLED的屏。一个面包板和一些杜邦线。一共不超过50元。。。

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

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

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

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

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

接法如下:

2 I2C信号

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

回头看看代码:

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

发送的代码是:

self.addr = 0x3c

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

命令是:

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

从上面的代码可以看到,发送的最终是(0x3c,0x80,0xae)。再从对应的波形就可以看到,第一段就是地址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),对应的波形是和上面一样,第一段是地址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说话了,就把绳子往上甩两下。B就知道A要给他说话了。如果甩三下,就表示给C说话。B和C收到之后,也甩一下表示收到了。然后约定个时间1秒间隔,往上甩就是1,不甩就是0。一次8秒。8秒之后,B收到了就往上甩一下,没收到就不甩。好吧,总线,或者说I2C总线基本上就是这么回事。

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

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

通用异步收发器_百度百科

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

参考:

详解面试的必答题——I2C协议

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生物计算与纳米技术:交汇前沿的科学领域

在当今科技迅猛发展的时代,生物计算和纳米技术作为前沿科技领域的两个重要方向,正在逐渐融合并带来深远的影响。生物计算涉及使用生物系统进行计算和数据存储,而纳米技术则关注制造极小尺度的电子器件和材料科学。本文将深入探讨这两个领域的…

2.2 (1) 处理机调度

文章目录 处理机调度概念处理机调度层次高级调度(作业调度)中级调度(内存调度)低级调度(进程调度/处理机调度)三层调度的联系对比 进程调度的时机需要进行进程调度与切换的情况不能进行进程调度与切换的情况…

【Linux学习】文件系统 - 第一篇

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 📕文章目录 📚基础知识铺垫🍑重新使用C语言文件接口---对比重定向🎈fopen函数&#x1f30f…

[云原生]三、Kubernetes(1.18)

主要内容: 1、kubernetes 简介 2、kubernetes 集群搭建  方式搭建  二进制方式搭建 3、 kubeadm kubernetes 核心技术  YAML 文件详解  kubectl 命令工具  Pod  Label  Controller 控制器 …

node.js使用NodeMachineID 生成唯一UUID和注意事项

node-machine-id用于获取或生成唯一的机器ID 如何使用 const { machineId, machineIdSync } require(node-machine-id) JSON.stringify(machineIdSync({original: true})) ;方法: machineIdSync 此函数同步获取操作系统本机UUID/GUID,默认情况下进行哈…

深入理解 ReLU 激活函数及其在深度学习中的应用【激活函数、Sigmoid、Tanh】

ReLU(Rectified Linear Unit)激活函数 ReLU(Rectified Linear Unit)激活函数是一种广泛应用于神经网络中的非线性激活函数。其公式如下: ReLU ( x ) max ⁡ ( 0 , x ) \text{ReLU}(x) \max(0, x) ReLU(x)max(0,x) 在…

嵌入式Linux系统中pinictrl框架基本实现

1. 回顾Pinctrl的三大作用 记住pinctrl的三大作用,有助于理解所涉及的数据结构: * 引脚枚举与命名(Enumerating and naming) * 单个引脚 * 各组引脚 * 引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能 * 引脚配置(Configuration):比如上拉、下拉、open drain、驱…

Java中的五种线程池类型

Java中的五种线程池类型 1. CachedThreadPool (有缓冲的线程池)2. FixedThreadPool (固定大小的线程池)3. ScheduledThreadPool(计划线程池)4. SingleThreadExecutor (单线程线程池&#xff09…

CTFHUB-SSRF-DNS重绑定 Bypass

开启题目,页面空白,访问附件 附件是一个知乎的文章,翻到下面点击文中这个链接 跳转之后,进行设置 把得到的链接拼接到题目的后面进行访问,然后得到了本题的 flag

Leetcode3226. 使两个整数相等的位更改次数

Every day a Leetcode 题目来源:3226. 使两个整数相等的位更改次数 解法1:位运算 从集合的角度理解,k 必须是 n 的子集。如果不是,返回 −1。怎么用位运算判断,见上面的文章链接。 如果 k 是 n 的子集,…

Windows Batch Linux Shell

windows上使用unix,Linux的unix工具对应的windows的可执行exe程序,对于本来的windows用户也可以使用这些工具提高工作效率,特别地在windows的批处理中使用这些命令很方便 二 工具列表 agrep.exe ansi2knr.exe basename.exe bc.exe bison.exe…

图像生成技术的颠覆性进展——从GAN到Aura SR V2

欢迎来到我们的科技专栏!最近,文本到图像合成技术的成功引起了全球的轰动,激发了公众的无限想象力。从技术角度看,这也标志着在设计生成图像模型的架构上发生了巨大的变化。曾经,生成对抗网络(GANs&#xf…

【Material-UI】详解安装指南

文章目录 一、默认安装1.1 Peer Dependencies 二、使用styled-components三、Roboto字体3.1 使用Fontsource3.2 使用Google Web Fonts 四、图标4.1 使用Google Web Fonts 五、CDN安装六、总结 Material-UI是全球最受欢迎的React UI框架之一。它提供了丰富的组件和高度可定制的主…

CSDN 的 Markdown 编辑器图片居中对齐和设置图片大小的方法

图片对齐方式 加在文件格式后面 #pic_center #pic_left #pic_right例如: 居中对齐 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/eb16b0a5bc414b9888ab73f3c74a8acb.png#pic_center)左对齐 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direc…

AI答题应用平台相关面试题

目录 1、请介绍整个系统后端的架构设计,有哪些模块以及各模块之间的关系? 2、你在项目中是如何设计库表的?可以从字段、索引、关联等方面回答。 3、为什么使用策略模式来封装不同的应用评分算法?它有哪些好处?具体如…

Elasticsearch 的DSL查询,聚合查询与多维度数据统计

文章目录 搜索聚合高阶概念 搜索 即从一个索引下按照特定的字段或关键词搜索出符合用户预期的一个或者一堆cocument,然后根据文档的相关度得分,在返回的结果集里并根据得分对这些文档进行一定的排序。 聚合 根据业务需求,对文档中的某个或…

【源码+文档+调试讲解】营业厅宽带系统设计与实现

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

Action部署在线上写文章

原文:https://blog.c12th.cn/archives/32.html 前言 之前分别出了 Hexo 和 Hugo 的 Action搭建教程,相当于伪动态,可以在线上写文章了;不过对于喜欢魔改的同学就不太友好了qwq 教程 github.dev 确保在配置过程中能访问Github &…

学工系统学生家庭情况登记功能概述

智慧校园学工系统中的“学生家庭情况”模块主要用于收集和管理学生的家庭背景信息,以便学校更好地了解学生的情况,并据此提供相应的支持和服务。该模块通常包括以下几个方面: 基本信息录入:支持录入学生的家庭成员信息&#xff0c…

ocaml精解【1】

文章目录 概述简介一、基本概述二、开发工具三、语言特性四、应用场景五、未来展望 windows下安装基础 参考文献 概述 简介 OCaml(Objective Caml)是Caml编程语言的主要实现,由Xavier Leroy、Jrme Vouillon、Damien Doligez、Didier Rmy等人…