软件模拟I2C案例前提须知——EEPROM芯片之M24C02
引言
了解了I2C的基础知识后,我们将来使用一个I2C案例实践来深入理解I2C通讯,即软件模拟I2C。顾名思义,就是利用软件方式通过模拟I2C协议要求的时序或者说一些相关规定来实现一个I2C通讯协议,然后利用模拟出的I2C协议来实现两个设备模块间的数据传递。本次我们将借助一款EEPROM芯片——M24CO2,因其支持I2C通讯的方式进行数据的收发,与STM32进行数据的传递。
在这之前,我们本次需要先简单了解一下在案例中涉及到的关于这款芯片的基本知识点。
一、什么是EEPROM
由于这款芯片M24C02属于EEPROM芯片,那么首先我们要对EEPROM有一个最基本的认识。什么是EEPROM芯片呢?
EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦除可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。
简单来说,EEPROM就是一种存储器,可以用来存储数据的一种器件。当然,这里说是只读,但实际上当前的EEPROM既可以读取也可以写入数据了,然后可以通过电子的相关作用将数据擦除掉。
二、M24C02芯片介绍
知道什么是EEPROM后,我们紧接着就来说说某一款EEPROM芯片——M24C02,为什么要说这一款芯片呢?联系本次案例,也不难想到该芯片应该是能够支持I2C协议的,同时可以进行数据的读写操作。
我们先看看开发板上的芯片实物图如下:
我们直观地板上芯片,可以发现他是双列直插式两侧引脚封装的方式,一共有8个引脚。很明显,这款EEPROM芯片比较小,所以数据存储容量应该是不大的,只有256个字节,按位算的话就是2kbit。
我们本次就是要使用这款EEPROM芯片来与STM32芯片进行I2C通讯,实现两者之间数据的传递。
如果要了解关于M24C02芯片的详情,可以找到该芯片的手册进行查阅,我们这里简单看看吧
由芯片手册可以看出,该芯片支持I2C通讯协议,支持两种I2C总线模式,即快速模式400kHz和标准模式100kHz。当然,一般使用标准模式的100kHz就可以了。
由于该芯片手册不光是关于M24C02芯片的介绍,还有M24C01等的介绍,所以这里关于存储上有两种,分别是1kbit和2kbit,当然,我们的芯片内存时2kbit。
同时还可以发现,这里还划分了页,就是说数据擦除或者写入时的数据大小最大是16个字节,一个页就是16个字节。总共就256个字节,就相当于一共有16个页。
而且我们每一个数据都会有相应的地址,所以256字节的数据就是2^8,所以通过一个8位的地址就能找到每一个数据了;那么如何表示一个页呢?显然我们一个页16个字节,就是2^4,所以我们可以8位地址的四位表示一个页的数据地址,即低四位也称页内地址(Inner Address)。然后我们一共16个页嘛,所以剩下四位我们就表示每个页的地址,即高四位也称页地址(Page Address)。
然后还有关于电压的一些描述,以及写入时的说明:两种方式,一种是按字节写入,另一种是按页写入,需要使用的时间都是5ms,也就是说,我们每写入一次数据都需要经过5ms才能进行下一次的写入,否则就会出现写入不进去等无效情况。
然后后面还有一些相关的描述,这里先不一一介绍,到时候真正使用的时候在回过头来进行查阅即可。
三、相关硬件电路
对M24C02芯片有一个基本的了解以后,我们就来看看该芯片在我们开发板上的硬件电路设计,看看它对应的引脚分别是什么含义?在板上怎么连接的?
如下图是板子上M24C02芯片的电路原理图:
从左往右看,左边有三个E开头的引脚,分别是E1、E2、E3,这表示的是该芯片设备地址。大家可能疑惑为什么只有三位,不是最少都有7位吗?实际上是因为该设备地址另外的四位已经被固定下来了。也就是说,M24C02芯片的设备地址的高4位被固定为:1010,低3位则由E3/E2/E1信号线的电平决定E2PROM设备地址。
然后低3位我们自己把它全部跟着VSS接地,因为我们此时只有这一个设备与STM32进行I2C通讯,所以只需要固定一个EEPROM芯片设备地址就行了。简单起见,我们直接全部为0就行。也就是说低三位都是0。
然后看右边WC#引脚,这是Write Control写控制的缩写,有时候也叫写保护Write Protect,这里是低电平有效。当该引脚处于低电平时,可读可写;当处于低电平时,写入会被锁定,此时就不能进行写入,只读。
当然,这里我们默认给低电平就行,所以如原理图所示直接接地了。
接着还有两个引脚分别是SCL和SDA,显然就是连接两根总线的引脚。这两个引脚连接STM32芯片上的I2C模块的引脚I2C2-SCL和I2C2-SDA。我们看看原理图中这俩引脚的描述
很明显,这里是GPIO引脚复用I2C2模块功能,对应PB10和PB11端口。值得注意的是,本次案例使用的软件模拟I2C,所以我们并不会使用STM32芯片内部的I2C模块,只是借助软件去模拟I2C协议的时序状态。所以这里我们实际是使用对应GPIO引脚就完事了。
四、M24C02芯片相关要点
1、M24C02的SCL及SDA 引脚连接到了STM32对应的I2C引脚中,结合上拉电阻,构成了I2C通讯总线,它们通过I2C总线交互。
2、E2PROM芯片的设备地址一共有7位,其中高4位固定为:1010,低3位则由E3/E2/E1信号线的电平决定E2PROM设备地址。
3、R/W是读写方向控制位,与地址无关。
在我们电路图中由于E1/E2/E3均是接的低电平,所以它的地址是1010000即0x50。
关于设备地址的描述图如下图所示
I2C通讯时常常是地址跟读写方向连在一起构成一个8位数。当R/W位为0 时,表示写方向,所以加上7位地址,其值为“0xA0”,常称该值为I2C设备的“写地址”;当R/W位为1时,表示读方向,加上7位地址,其值为“0xA1”,常称该值为“读地址”。
值得注意的是,这里说的设备地址和我们前面说的8位的数据地址是不同的。这里的设备地址是进行数据传递之前就要先知道的设备码,之后才会根据需要去传输对应的EEPROM存储器中对于的内存单元,也就是那个8位的数据地址。换句话说,我们进行I2C通讯时的大致步骤就是【发出起始信号】 -> 【传输设备地址】 -> 【传输读去/写入的内存单元】 -> ... -> 【停止信号】。
以上便是本次文章的所有内容,欢迎各位朋友在评论区讨论,本人也是一名正在学习的小白,愿大家共同努力,一起进步吧!
鉴于笔者能力有限,难免出现一些纰漏和不足,望大家在评论区批评指正,谢谢!
相关文章:

软件模拟I2C案例前提须知——EEPROM芯片之M24C02
引言 了解了I2C的基础知识后,我们将来使用一个I2C案例实践来深入理解I2C通讯,即软件模拟I2C。顾名思义,就是利用软件方式通过模拟I2C协议要求的时序或者说一些相关规定来实现一个I2C通讯协议,然后利用模拟出的I2C协议来实现两个设…...

GIS教程:全国数码商城系统
文章目录 注册高德地图API普通网页中测试地图加载地图添加标记地图配置点标记 Marker添加弹框创建vue项目并添加高德地图创建项目加载高德地图项目首页布局封装axios和配置代理服务器获取城市热门信息获取城市区县信息获取区县商城信息获取指定城市区县的经纬度坐标将地图缩放到…...

BroadCom-RDMA博通网卡如何进行驱动安装和设置使得对应网口具有RDMA功能以适配RDMA相机
BroadCom-RDMA博通网卡如何进行驱动安装和设置使得对应网口具有RDMA功能以适配RDMA相机 BroadCom-RDMA 博通网卡Baumer-RDMA 万兆网相机Baumer工业相机RDMA功能的技术背景BroadCom-RDMA博通网卡如何进行驱动安装和设置具有RDMA功能一、安装ZVA-BroadCom-RDMA网卡二、设备管理器…...

分布式微服务系统架构第90集:现代化金融核心系统
#1.1 深化数字化转型,核心面临新挑战 1、架构侧:无法敏捷协同数字金融经营模式转型。 2、需求侧:业务需求传导低效始终困扰金融机构。 3、开发侧:创新产品上市速度低于期望。 4、运维侧:传统面向资源型监控体系难以支撑…...

进阶数据结构——双向循环链表
目录 前言一、定义与结构二、特点与优势三、基本操作四、应用场景五、实现复杂度六、动态图解七、代码模版(c)八、经典例题九、总结结语 前言 这一期我们学习双向循环链表。双向循环链表不同于单链表,双向循环链表是一种特殊的数据结构&…...

记录一次,PyQT的报错,多线程Udp失效,使用工具如netstat来检查端口使用情况。
1.问题 报错Exception in thread Thread-1: Traceback (most recent call last): File "threading.py", line 932, in _bootstrap_inner File "threading.py", line 870, in run File "main.py", line 456, in udp_recv IndexError: list…...

安装anaconda3 后 电脑如何单独运行python,python还需要独立安装吗?
安装anaconda3 后 电脑如何单独运行python,python还需要独立安装吗? 电脑第一此安装anaconda用于jupyter notebook使用。 但是在运行cmd的时候,输入python --version 显示未安装或跳转商店提示安装。 明明我可以运行python但是为什么cmd却说我没安装呢…...

电子电气架构 --- 汽车电子拓扑架构的演进过程
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...

ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务
目录 一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务 1. app.Services 2. GetRequiredService() 3. Init() 二、应用场景 三、依赖注入使用拓展 1、使用场景 2、使用步骤 1. 定义服务接口和实现类 2. 注册服务到依赖注入容器 3. 使用依赖注入获取并…...

leetcode——验证二叉搜索树(java)
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入…...

搜索引擎快速收录:关键词布局的艺术
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/21.html 搜索引擎快速收录中的关键词布局,是一项既精细又富有策略性的工作。以下是对关键词布局艺术的详细阐述: 一、关键词布局的重要性 关键词布局影响着后期页面…...

VLN视觉语言导航基础
0 概述 视觉语言导航模型旨在构建导航决策模型 π π π,在 t t t时刻,模型能够根据指令 W W W、历史轨迹 τ { V 1 , V 2 , . . . , V t − 1 } \tau\{V_1,V_2,...,V_{t-1}\} τ{V1,V2,...,Vt−1}和当前观察 V t { P t , R t , N ( V t ) } V_…...

4 Hadoop 面试真题
4 Hadoop 面试真题 1. Apache Hadoop 3.0.02. HDFS 3.x 数据存储新特性-纠删码Hadoop面试真题 1. Apache Hadoop 3.0.0 Apache Hadoop 3.0.0在以前的主要发行版本(hadoop-2.x)上进行了许多重大改进。 最低要求的Java版本从Java 7增加到Java 8 现在&…...

java练习(2)
回文数(题目来自力扣) 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整…...

vscode命令面板输入 CMake:build不执行提示输入
CMake:build或rebuild不编译了,弹出:> [Add a new preset] , 提示输入发现settings.jsons设置有问题 { "workbench.colorTheme": "Default Light", "cmake.pinnedCommands": [ "workbench.action.tasks.configu…...

Java中对消息序列化和反序列化并且加入到Spring消息容器中
--- 参考项目:苍穹外卖。 在对没有Java中的数据序列化时,比如说时间格式: 时间的格式是这种没有格式化的效果,因为在给前端返回数据时,返回的结果并没有序列化。 所以,需要对返回的数据序列化。 首先需…...

FFmpeg源码:av_base64_decode函数分析
一、引言 Base64(基底64)是一种基于64个可打印字符来表示二进制数据的表示方法。由于log2 646,所以每6个比特为一个单元,对应某个可打印字符。3个字节相当于24个比特,对应于4个Base64单元,即3个字节可由4个…...

【后端面试总结】mysql的group by怎么用
GROUP BY 是 SQL 中的一种用于对结果集进行分组的子句,常与聚合函数(如 COUNT()、SUM()、AVG()、MAX() 和 MIN() 等)一起使用。GROUP BY 的作用是基于一个或多个列对查询结果进行分组,然后可以对每个分组执行聚合操作。 以下是 G…...

计算机视觉和图像处理
计算机视觉与图像处理的最新进展 随着人工智能技术的飞速发展,计算机视觉和图像处理作为其中的重要分支,正逐步成为推动科技进步和产业升级的关键力量。 一、计算机视觉的最新进展 计算机视觉,作为人工智能的重要分支,主要研究如…...

一文读懂Python之random模块(31)
random模块是Python的内置标准库,用于生成各类随机数,可以用作生成网站初始登录密码和随机验证码。 一、random模块简介 random模块可以生成随机数,包括随机整数、浮点数、随机元素等。 二、random模块相关概念 随机数: 是指在…...

p1044 栈
两种递推细节不同 1,将1和n在序列末尾的情况单独放出来处理,因为dp[0]0; 2,将所有情况统一处理,这种情况就要要求dp[1]1; 这里的n在解题中可以看做是元素数量 思路是,根据出栈最后一个元素,统计它前面的元素数量的输出序列数和…...

吴恩达深度学习——超参数调试
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 超参数调试调试选择范围 Batch归一化公式整合 Softmax 超参数调试 调试 目前学习的一些超参数有学习率 α \alpha α(最重要)、动量梯度下降法 β \bet…...

SQL NOW() 函数详解
SQL NOW() 函数详解 引言 在SQL数据库中,NOW() 函数是一个常用的日期和时间函数,用于获取当前的时间戳。本文将详细介绍 NOW() 函数的用法、参数、返回值以及在实际应用中的注意事项。 函数概述 NOW() 函数返回当前的日期和时间,格式为 Y…...

【JAVA基础】双亲委派
双亲委派可以简单理解为, 当收到加载请求时, 会依次向上加载 ; 只有当父类加载器无法完成加载请求时,子类加载器才会尝试自己去加载。 工作原理 类加载请求传递:当应用程序需要加载一个类时,比如通过ClassLoader.loadClass()方法࿰…...

刷题记录 HOT100回溯算法-6:79. 单词搜索
题目:79. 单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻…...

JavaScript系列(52)--编译优化技术详解
JavaScript编译优化技术详解 🚀 今天,让我们深入探讨JavaScript的编译优化技术。通过理解和应用这些技术,我们可以显著提升JavaScript代码的执行效率。 编译优化基础概念 🌟 💡 小知识:JavaScript引擎通常…...

Ollama+DeepSeek本地大模型部署
1、Ollama 官网:https://ollama.com/ Ollama可以干什么? 可以快速在本地部署和管理各种大语言模型,操作命令和dokcer类似。 mac安装ollama: # 安装ollama brew install ollama# 启动ollama服务(默认11434端口…...

在 WSL2 中重启 Ubuntu 实例
在 WSL2 中重启 Ubuntu 实例,可以按照以下步骤操作: 方法 1: 使用 wsl 命令 关闭 Ubuntu 实例: 打开 PowerShell 或命令提示符,运行以下命令: wsl --shutdown这会关闭所有 WSL2 实例。 重新启动 Ubuntu: 再次打开 Ubuntu&#x…...

【ts + java】古玩系统开发总结
src别名的配置 开发中文件和文件的关系会比较复杂,我们需要给src文件夹一个别名吧 vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({pl…...

机器学习周报-文献阅读
文章目录 摘要Abstract 1 相关知识1.1 WDN建模1.2 掩码操作(Masking Operation) 2 论文内容2.1 WDN信息的数据处理2.2 使用所收集的数据构造模型2.2.1 Gated graph neural network2.2.2 Masking operation2.2.3 Training loss2.2.4 Evaluation metrics 2…...