电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
STM32 I2C通信操作24C02写数据、读数据
分 享
扫描二维码分享
STM32 I2C通信操作24C02写数据、读数据
E2PROM
24C02
i2c
嵌入式从0到1
关注
发布时间: 2020-08-06
丨
阅读: 3221
串行EEPROM 24CXX是基于I2C总线的存储器件,遵循二线制协议,IIC总线上可以外挂多个器件,每个器件多应不同的地址,通过地址将不同器件进行分开,保证不同芯片之间数据传输的独立性。 由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。 **24C02的应用:** * 存储硬件的默认参数,这样开机上电之后读取就可以按照默认参数运行了;比如存储PID自校准之后的参数; * 保存计费计量的一些应用的余额; * 类似血压计、血糖仪之类保存一定次数的检测结果,实现历史回溯功能。 24CXX系列EEPROM为I2C总线的掉电存储数据芯片。对于I2C总线的介绍可以参考下面网文: [**4位数码管显示模块驱动**](https://mp.weixin.qq.com/s/x20sKW1_2Mb_limIeD91hA) I2C总线主要注意以下几点: 1. 数据有效性要求 ![](https://cf02.ickimg.com/bbsimages/202008/9e2d016adacb6340dab0cb060f22f301.png) 在输入数据时,当SCL是高电平时,SDA上的信号必须保持不变;只有SCL上的时钟信号为低电平时,SDA上的信号才能改变。 2. 数据的开始和结束条件 ![](https://cf02.ickimg.com/bbsimages/202008/f1dfa3c61ae68399cb5cd3be097dd3ed.png) SDA、SCL默认为高电平,表示总线处于空闲状态。 数据输入的开始条件是SCL为高电平时,SDA由高变低; 结束条件是SCL为高电平时,SDA由低电平变为高电平,即SDA出现一个上升沿的跳变,即为终止信号。 3. I2C的应答信号ACK ![](https://cf02.ickimg.com/bbsimages/202008/20736c2020f0eaf53d2248eac2f015c1.png) 数据传输带有应答信号ACK,在传输数据的过程中,在时钟线SCL的第九个脉冲时,从机芯片内部会产生一个应答信号ACK将SDA管脚拉低。 ### 引脚定义 ![](https://cf02.ickimg.com/bbsimages/202008/dc4ce2446ac3348be4bb1553b4c9e8a9.png) | 引脚 | 功能描述 | | :---: | :---: | | **A0-A2** | 器件地址定义引脚,通过高低电平对应的二进制代表不同的地址 | | **SDA** | 串行数据 | | **SCL** | 串行时钟输入 | | **WP** | 写保护,接地:可读可写;接Vcc只读,即写保护 | | **GND** | Ground | | **Vcc** | Power Supply | ### 24C02模块的原理图 ![](https://cf02.ickimg.com/bbsimages/202008/85d68801ba65be45f84037bfa8a17b47.png) **注:** 1. 本文对应实例,CON1跳线短接,24C02取地址0。 2. 24C02,尾数02代表着内部有256\*8(2K bits)空间。故,24C02的写地址为0xA0,读地址为0xA1。 3. 上拉电阻必需有,否则可能无法对24C02进行正确读写。 ### 24C02器件操作流程 #### 单字节写 ![](https://cf02.ickimg.com/bbsimages/202008/468bd3459f58580fdc343cd4a0090d6c.png) ##### 单字节写流程 在字节写模式下,主器件发送起始命令和从器件地址信息、(R/W)位(此处为0)发给从器件,在从器件产生应答信号后,主器件发送24C02的地址信息,然后等待从器件返回的另一个应答信号后,再发送数据到24C02,然后再接收一次Ack应答信号后,主芯片产生一个停止信号,从器件收到停止信号后,开始内部数据的擦写,在内部擦写过程中,24C02不再应答主器件的任何请求,从而完成整个单字节的写流程。 **注:** 当上一个数据写完之后,若发送停止信号,则至少延时10ms以上,才能再发送下一次写操作的起始信号。 #### 读操作 ![](https://cf02.ickimg.com/bbsimages/202008/1dd5f4dc533e27a7f8883fb0a8e77172.png) **1. 单字节读** 读操作允许主器件对24C02的任意字节进行读操作。主器件首先通过发送起始信号、从器件地址和**写操作**(写地址)的标志位0。 在从器件应答之后,主器件发送目标地址,并等待返回应答信号。 主器件重新发送起始信号和从器件地址,此时R/W位置1(读操作,读数据),从器件响应应答信号,然后主器件获取一个8个字节数据,主器件不用发送应答信号但需要产生一个停止信号,即完成单字节读过程。 **2. 多字节连续读** 在从机给主机发送完一个8位字节数据后,主器件产生一个应答信号来响应,告诉从机主器件要求更多的数据,对应每个主机产生的应答信号,从机将发送一个8位数据字节。当主器件不发送应答信号而发送停止位时结束操作。 ![](https://cf02.ickimg.com/bbsimages/202008/1bbc2d5169ddbeb71c33adc0e84909d6.png) ```C const u8 TEXT_Buffer[]={"0123456789ABCDEF"}; #define SIZE sizeof(TEXT_Buffer) // 写入16个字节数据 AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE); memset(arrDataTemp, 0, sizeof(arrDataTemp)); // 读取280个字节的数据 AT24CXX_Read(0,arrDataTemp,280); // 将读取到的数据串口打印输出 USART_OUT(arrDataTemp,280); ``` 输出结果如下所示: ![](https://cf02.ickimg.com/bbsimages/202008/0b19cbf70b1f9204810a7f279d44e3f7.png) 从上面截图,我们可以看出来,两个红色圈选部分的内容是一样的,即当读取的字节数超过N(对于24C02,N=255),读取的数据将返回0,从头往后输出剩余字节。 紫色的55,就是程序初始化的时候,检查24C02芯片是否存在时,AT24CXX_Check()函数中写入的数据: ```C while(AT24CXX_Check()) //检测不到 24C02 { printf("24C02 Check Failed!\r\n"); delay_ms(500); printf("Please Check! \r\n"); delay_ms(500); } ``` ### 资料获取 ![](https://cf02.ickimg.com/bbsimages/202008/6ab7c43885ead19d01916371cd8db6f9.png) 代码工程中有两个文件,其中myiic为IIC总线相关操作函数所在文件,24cxx为24C02操作函数所在文件。 微信公众号后台回复“**24C02**”,可以下载本文对应的工程源码。 **注:** 代码工程使用的Keil版本为:V5.20 我用的PCB设计软件版本为:Altium Designer 14.2 如果没有特殊说明,软件环境都为以上两个版本。 有问题可以加我微信:**chengxuyuanxiaoha**(程序员小哈的全拼),我可以拉你进技术交流群,有问题随时交流。 ---- ![](https://cf02.ickimg.com/bbsimages/202008/f11b29a49df3b7e9dcb8dea34e9ea402.png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
嵌入式从0到1
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交