转载:关于STM32硬件I2C读写EEPROM代码实现原理的理解与总结

三、以I2C读写EEPROM(AT24C02)为例进行说明
3.1 针对EEPROM的基本操作
①写操作
②读操作
针对EEPROM的写操作和读操作也可以细分,如:
写操作:
①往EEPROM中写入一个字节的数据;
②往EEPROM中批量写入数据;
读操作:
①从EEPROM中指定地址读取一个字节数据;
②从EEPROM中批量读取数据;
下面结合上面4种读写操作来具体说明:
1、往EEPROM中写入一个字节数据
1)写入时序

2)时序分析
①第一步:主机产生起始信号,开始传输;
②第二步:发送挂载在I2C总线下的从机设备地址(这里由于是针对EEPROM,其地址是7位),注意:EEPROM的地址高四位已经固定,为1010,低三位由自己的硬件设计决定,一般都将EEPROM的这三根地址线直接接地,所以低三位地址就为000,这样该EEPROM的设备地址就为1010 000。由于这里是写入数据,所以R/W位就为0,这一位与前面的7位地址组成一个字节,所以写入数据时,发送的从机地址就为0xA0;
③第三步:发送完从机地址后,主机会释放SDA线,等待从机给一个低电平应答信号ACK,主机收到ACK后,进行下一步;
④第四步:发送将要写入数据的地址,这里要搞清楚,这个地址不是上面的从机地址,而是我们要写入数据到EEPROM中具体地址;(两者的关系可以打个比方:我们假设I2C总线就是一条叫香樟大道的马路,EEPROM就是这条马路上某个地方的一栋大楼,地址是香樟大道99号,而写入数据的地址就是香樟大道99号这栋楼里的某个具体房间号。)
⑤发送完写入数据地址后,释放SDA总线并等待从机给一个低电平的应答信号ACK;
⑥主机收到应答信号ACK后,开始向指定的地址中写入一个字节数据,写完一个字节数据后释放SDA总线;
⑦从机接受到一个字节数据后,返回一个应答信号给主机,主机接受到应答信号后,发送一个结束信号来结束本次数据传输。

图4中我们要看的是7位主发送的序列图,下面结合图4的主发送器传送序列图来解释上面写一个字节数据到EEPROM函数:
①主机产生起始信号,起始信号发送后,会产生EV5事件,EV5即表示SB=1,SB是I2C状态寄存器I2C_SR1的bit0,如下图5:

看上面的图5可以知道,如果起始条件已发送,SB会被置“1”,即产生事件EV5,所以我们要检测该位确认起始条件已发送;
②发送从机设备地址,从机应答后,会产生EV6事件,即ADDR=1,ADDR是I2C_SR1寄存器的bit1,说明如下图6:

通过图6我们可以知道,当地址发送完成,主机收到从机的应答后,ADDR位被置“1”,我们通过检测EV6事件来判断地址已发送完成并清除相关位;
③发送要写入数据的地址(地址也是数据),从机收到数据后应答,通过图4传送序列图可以看出,在第一个数据(第一个数据是要写入数据的地址)发送完并收到应答后,EV8事件早已经产生,EV8表示TxE=1,移位寄存器非空,数据寄存器空,写入DR寄存器将清除该事件。数据寄存器空,移位寄存器非空说明我们要发送的数据已经由数据寄存器转入移位寄存器,数据一旦转入移位寄存器就会在时钟信号的驱动下自动一位一位的将数据发送出去,所以我们在发送完地址后检测EV6事件,确认数据已经由数据寄存器转移到移位寄存器中发送,可以向数据寄存器中写入新的数据;
④发送我们要写入到EEPROM中的数据,从机应答后,检测EV8_2,这里为什么是检测EV8_2而不是EV8?因为我们这个函数只向EEPROM中写入一个字节数据,所以这个字节数据就是最后一个要发送的数据,通过图4传送序列图可以看出,最后一个数据传输完成后产生事件EV8_2,表示TxE=1,BTF=1,请求设置停止位。至于为什么产生的是EV8_2而不是EV8,我们来看看图7中有关BTF的说明:BTF表示字节发送结束,在发送时,当一个新数据被发送且数据寄存器还未被写入新的数据(TxE=1)时,BTF会被置“1”,由于我们这个函数只向从机发送一个字节数据(不包括地址),所以在这个字节数据被发送后并没有新的数据写入到数据寄存器,因此符合了上面的条件,BTF被置“1”。在TxE=1、BTF=1的情况下,就产生EV8_2;

⑤检测到EV8_2后,主机就可以产生停止信号来结束本次传输了。
有关写入一个字节数据到EEPROM中函数的分析到这里就结束了,下面来说一些从EEPROM中读取一个字节数据的相关代码以及分析。

2)时序分析
①第一步:主机产生起始信号;
②第二步:主机发送从机设备地址,写选通(即R/W为‘0’),从机接收到地址后应答;
③第三步:主机发送要读取数据在EEPROM中的地址,从机接收到后应答;
④第四步:主机再次产生起始信号;
⑤第五步:主机发送从机设备地址,读选通(即R/W为‘1’),从机接收到后应答;
⑥第六步:从机发送数据,主机接收,接收到最后一个数据后非应答;
⑦第七步:主机产生停止信号结束传输。

问题说明:
问题1:为什么要加一句等待EEPROM准备好的函数:
EEPROM的写入是需要时间的,只有当前面的写入操作完成,它才能继续响应后面的读取操作,否则在它还没有准备好的情况下,进行读取肯定是不成功的。关于等待EEPROM函数准备好的函数,它的实现原理就是通过向EEPROM发送从机地址,看从机是否成功应答,如果应答了就表示EEPROM已经准备好,如果应答失败就说明EEPROM还没准备好,然后主机继续发送从机地址来呼叫EEPROM等待应答,直到从机应答成功就退出该函数执行下一步,其代码如下(这段代码是我在野火的工程代码上修改了一点点,大家可以直接去看野火的官方例程,一定会有所收获的):
转载:关于STM32硬件I2C读写EEPROM代码实现原理的理解与总结的更多相关文章
- STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ.写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要内容:I2C协议.模 ...
- STM32F10x_模拟I2C读写_硬件I2C读写
STM32F10x_模拟I2C读写EEPROM STM32F10x_硬件I2C读写EEPROM(标准外设库版本) STM32F10x_硬件I2C主从通信(轮询发送,中断接收)
- STM32 硬件I2C 到底是不是个坑?
/** ****************************************************************************** * @author Maox ...
- 第23章 I2C—读写EEPROM—零死角玩转STM32-F429系列
第23章 I2C—读写EEPROM 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...
- STM32F10x_模拟I2C读写EEPROM
Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...
- 浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)(转)
引子 STM32的硬件I2C很多人都对它望而却步.因为很多电工都说,STM32 硬件 I2C有BUG.不稳定.死机等等……最后都使用GPIO模拟I2C. 的确,模拟I2C好用.但是在我看来在一个72M ...
- 基于FPGA的I2C读写EEPROM
I2C在芯片的配置中应用还是很多的,比如摄像头.VGA转HDMI转换芯片,之前博主分享过一篇I2C协议的基础学习IIC协议学习笔记,这篇就使用Verilog来实现EEPROM的读写,进行一个简单的I2 ...
- I2C读写EEPROM—EEPROM简介
EEPROM 是一种掉电后数据不丢失的存储器,常用来存储一些配置信息,以便系统重新上电的时候加载之.EEPOM 芯片最常用的通讯方式就是 I 2C 协议,本小节以 EEPROM 的读写实验为大家讲解如 ...
- (转)stm32硬件IIC
cube与I2C:https://www.cnblogs.com/121792730applllo/p/5044920.html I2C官网:https://www.i2c-bus.org/stand ...
随机推荐
- java之枚举和注解
JDK1.5新增的enum关键字用于定义枚举类. 枚举类和普通类的区别: 使用enum定义的枚举类默认继承了java.lang.Enum类: 枚举类的构造器只能使用private修饰符: 枚举类的所有 ...
- webpack安装错误 ‘webpack : 无法加载文件’
- java 编译时注解框架 lombok-ex
lombok-ex lombok-ex 是一款类似于 lombok 的编译时注解框架. 编译时注,拥有运行时注解的便利性,和无任何损失的性能. 主要补充一些 lombok 没有实现,且自己会用到的常见 ...
- redis的介绍与操作及Django中使用redis缓存
redis VS mysql的区别 """ redis: 内存数据库(读写快).非关系型(操作数据方便) mysql: 硬盘数据库(数据持久化).关系型(操作数据间关系) ...
- SecureCRT登陆liunx 方向键失效
使用SecureCRT登陆liunx(CenterOS)系统,发现删除(backspace)键.和上下左右键不起作用,解决如下: 先打开Options–>Session Options–> ...
- GO汇总
1.基础 GO语言介绍以及开发环境配置 Go-包 Go-数据类型以及变量,常量 Go-获取变量数据类型 GO-数组与切片 GO-切片拷贝以及赋值 Go-函数 Go-闭包 GO-逻辑判断(if,else ...
- JVM运行时数据区-详细结构图
- iOS开发WKWebView 返回H5上级页面
#pragma mark ---- 点击事件 -(void)leftTapClick:(UITapGestureRecognizer *)sender{ //判断是否能返回到H5上级页面 if (se ...
- Vue-cli脚手架 安装 并创建项目--命令
检查是否有 node - v 安装Vue-cli npm install -g vue-cli 安装好后,执行 vue list可以看到很多实用的模板,我这里实用的webpack 初始化模板 vue ...
- 12.2 中的Data Guard Standby 密码文件自动同步 (Doc ID 2307365.1)
Data Guard Standby Automatic Password file Synchronization in 12.2 (Doc ID 2307365.1) APPLIES TO: Or ...