软件模拟I2C案例前提须知——EEPROM芯片之M24C02

server/2025/2/2 22:40:55/

引言

        了解了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通讯时的大致步骤就是【发出起始信号】 -> 【传输设备地址】 -> 【传输读去/写入的内存单元】 -> ... -> 【停止信号】。    


以上便是本次文章的所有内容,欢迎各位朋友在评论区讨论,本人也是一名正在学习的小白,愿大家共同努力,一起进步吧!

鉴于笔者能力有限,难免出现一些纰漏和不足,望大家在评论区批评指正,谢谢!


http://www.ppmy.cn/server/164446.html

相关文章

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…

基于STM32的数字多重仪表教学

引言 数字多重仪表是一种可用于测量和显示多种电气参数的设备,广泛应用于实验室、工业和家庭电气工程中。本项目将使用STM32微控制器构建一个简单的数字多重仪表,能够测量电压、电流和功率,并通过LCD显示模块实时显示这些信息。 环境准备 硬…

redis缓存和springboot缓存包冲突怎么办

如果Redis缓存与Spring Boot缓存包发生冲突&#xff0c;可以采取以下几种解决方案&#xff1a; 排除Spring Boot缓存包&#xff1a;在pom.xml文件中排除Spring Boot的缓存依赖&#xff0c;以避免与Redis缓存冲突。例如&#xff1a; <dependency><groupId>org.spr…

ChatGPT 搜索测试整合记忆功能

据 TestingCatalog 报道&#xff0c;OpenAI 正在测试 ChatGPT 搜索的整合记忆功能&#xff0c;被命名为 “Memory in search”2。以下是关于该功能的具体情况123&#xff1a; 功能特点 个性化搜索&#xff1a;启用该功能后&#xff0c;ChatGPT 能利用存储的记忆数据&#xff0…

Graylog采集MySQL慢日志实战

文章目录 前言一、MySQL慢日志0. 慢查询相关语句1. 检查MySQL是否开启慢日志及慢查询保存位置2. 检查慢查询阈值3. 未使用索引是否开启记录慢查询日志4. 查看mysql.slow_log表结构及字段含义5. 慢查询记录两种情况示例 二、graylog采集慢查询日志1. 采集思路2. 创建Sidecar配置…

【力扣】15.三数之和

AC截图 题目 思路 这道题如果简单的用暴力三重遍历去做&#xff0c;会超时。所以我们思考假如有三个下标&#xff0c;i&#xff0c;l&#xff0c;r 其中i0&#xff08;初始&#xff09;&#xff0c;li1 rnums.size()-1 我们固定nums[i]的值&#xff0c;那么就转换为两数之和…

Vue.js组件开发-如何实现异步组件

在Vue中&#xff0c;异步组件允许在需要的时候才加载组件&#xff0c;而不是在应用初始化时就加载所有组件&#xff0c;这有助于提高应用的性能&#xff0c;特别是对于大型应用。 步骤 创建异步组件&#xff1a;使用defineAsyncComponent函数来定义异步组件。在父组件中使用异…

Java动态代理:原理与实现

在Java编程中&#xff0c;代理模式是一种常见的设计模式&#xff0c;它允许我们通过一个代理对象来控制对另一个对象的访问。代理模式的主要目的是在不改变原始类代码的情况下&#xff0c;增强或修改其行为。Java中的代理分为静态代理和动态代理两种。本文将重点介绍动态代理&a…