转载:关于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 ...
随机推荐
- 你竟然没用 Nuget 构建项目?
想写这篇文章缘起于公众号文章里的一条留言: 对于一个现代化的开发平台,建立一种让开发者创建,分享与使用可复用代码的机制是十分必要的.这种"可复用代码"被打包后的文件通常被称作&qu ...
- 理解OAuth2
目录 理解OAuth2 Oatuh2用来做什么 Oauth2具体做法 Oauth2的流程 授权码模式 第三方引导用户跳转至认证服务器的授权页面 用户选择是否给予授权 认证服务器生成code并且让用户重 ...
- Graylog 笔记
安装 基本上有3种方式,1 yum安装2 rpm安装3 docker安装 yum安装 yum安装,参照官方文档是最好的:http://docs.graylog.org/en/3.0/pages/ins ...
- Dubbo学习系列之十一(Dashboard+Nacos规则推送)
中国武术,门派林立,都是号称多少代的XXX传人,结果在面对现代武术时,经常被KO秒杀,为啥,光靠宣传和口号撑门面,终究是靠不住,必须得有真货 ,得经得住考验,所以不能只说Sentinel有多好,也得给 ...
- Spring基础——AOP通知
spring(AOP通知) 切面 切面是封装通用业务逻辑的组件,可以作用到其他组件上.是spring组件中的某个方法.无返回类型.参数类型与通知类型有关.一个切面 开启数据库 关闭数据库 开启事务 检 ...
- 为什么学习Python?
互联网高速发展的今天,很荣幸能够接触计算机这个专业,成为一名程序猿小白,本科期间学习了C.C++.Java.Pthon.C#,每门语言都了解那么一点,学的很杂,刚好遇到大学毕业的这个暑期,在继续读研之 ...
- JavaScript设计模式基础(一)
模式的起源 模式 起源于建筑学.20世纪70年代,哈佛大学建筑学博士Christopher Alexander和他的团队花大约20年,来研究为解决同一个问题而设计出的不同建筑结构,从中发现那些高质量设 ...
- Android Studio 3.0+ Record Espresso Test 自动化测试
准备工作 1.将android studio 版本升级到3.0+2.百度下载夜神模拟器 夜神模拟器的基本设置 PS:以上就是夜神模拟器的基本设置 Android Studio 连接夜神模拟器 //夜神 ...
- Centos7 下添加开机自启动服务和脚本
1.添加开机自启服务 #设置jenkins服务为自启动服务 systemctl enable jenkins.service #启动jenkins服务 systemctl start jenkins. ...
- [Go] 使用net包作为tcp客户端读取http
1.tcp的客户端,并且直接读取http协议的全部内容,每次读取4096字节,直到最后一个字节是\n并且读取的长度小于4096 conn, err := net.Dial("tcp" ...