24c02芯片中文手册_24c128芯片引脚图及功能

24c02芯片中文手册_24c128芯片引脚图及功能(1)在嵌入式开发中,EEPROM的实际场景比闪存flash少很多

1、前言

(1)本文主要是通过24c02芯片来讲解I2C接口的EEPROM操作方法,包含底层时序和读写的代码;
(2)大部分代码是EEPROM芯片通用的,但是其中关于某些时间的要求,是和具体芯片相关的,和主控芯片和外设芯片都有关系,需要具体分析,但是逻辑顺序是不变的;

2、EEPROM介绍

(1)在嵌入式开发中,EEPROM的实际场景比闪存flash少很多。EEPROM芯片容量小,flash容量大,并且flash价格便宜;
(2)EEPROM的读写速度一般比flash慢;
(3)EEPROM大多是I2C接口,占用的引脚比flash少;
(4)EEPROM比flash掉电保存数据的时间更久,总体来说就是更稳定;
(5)参考博客:《嵌入式开发——EEPROM和FLASH的区别和优劣势》;

3、实际产品中EEPROM的使用场景

(1)使用场景:在嵌入式设备中,添加一块EEPROM,用于存放产品型号;
(2)使用的原因分析:
<1>首先可以做到一个程序兼容好几种产品,所以在程序的早期会需要知道当前的产品型号;
<2>将产品型号保存到EEPROM中,程序保存到flash中,升级的时候只会去重写flash而不会重写EEPROM,这样能保证升级失败也不会导致产品型号的丢失;
<3>EEPROM一般是在产品出厂的时候进行烧录,当然在程序正常运行后也会提高重写EEPROM的方式来进行设备的改制,读写EEPROM的方式都是研发人员或者设备生产人员才知道,不会对客户提供;

4、I2C时序分析

参考博客:《I2C通信协议详解和通信流程分析》;

5、根据I2C时序编写I2C通信代码

5.1、I2C通信开始和结束

在这里插入图片描述

/******************************************************************************* * 函 数 名 : I2C_Start() * 函数功能 : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿 * 输 入 : 无 * 输 出 : 无 * 备 注 : 起始之后I2C_SDA和I2C_SCL都为0 *******************************************************************************/ void I2C_Start() { 
    I2C_SDA = 1; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us I2C_SDA = 0; I2C_Delay10us();//保持时间是>4us I2C_SCL = 0; I2C_Delay10us(); } /******************************************************************************* * 函 数 名 : I2C_Stop() * 函数功能 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿 * 输 入 : 无 * 输 出 : 无 * 备 注 : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲 *******************************************************************************/ void I2C_Stop() { 
    I2C_SDA = 0; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//建立时间大于4.7us I2C_SDA = 1; I2C_Delay10us(); } 

5.2、I2C主设备读从设备函数

在这里插入图片描述

/******************************************************************************* * 函 数 名 : I2cSendByte(uchar num) * 函数功能 : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间, * * 保持发送信号I2C_SDA保持稳定 * 输 入 : num ,ack * 输 出 : 0或1。发送成功返回0,发送失败返回-1 * 备 注 : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0 ******************************************************************************/ uchar I2C_SendByte(uchar dat, uchar ack) { 
    uchar a = 0,b = 0 I2C_SCL = 0; //保证在开始发送数据前时钟线是低电平 for(a=0; a<8; a++)//要发送8位,从最高位开始 { 
    I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号 dat = dat << 1; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//建立时间>4.7us I2C_SCL = 0; I2C_Delay10us();//时间大于4us  } I2C_SDA = 1; // 主设备释放SDA线给从设备去操作 I2C_Delay10us(); I2C_SCL = 1; // 主设备开始了第9个周期 while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低 { 
    b++; if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束 { 
    I2C_SCL = 0; I2C_Delay10us(); return -1; } } I2C_SCL = 0; I2C_Delay10us(); return 0; } 

(1)每次向数据线上发送一个bit,先发送字节的高位再发送字节的低位;
(2)发送的时序:时钟线保持低电平时,将数据发送到数据线上;拉高时钟线一段时间,这段时间是从设备从数据线上读数据;将时钟线拉低,进行下一个周期;

5.3、I2C主设备写从设备函数

/******************************************************************************* * 函 数 名 : I2cReadByte() * 函数功能 : 使用I2c读取一个字节 * 输 入 : 无 * 输 出 : dat * 备 注 : 接收完一个字节I2C_SCL=0 *******************************************************************************/ uchar I2C_ReadByte() { 
    uchar a = 0,dat = 0; I2C_SDA = 1; //主设备释放SDA线给从设备去操作  I2C_Delay10us(); // 按道理这里应该有一个SCL = 0的 I2C_SCL = 0; for(a=0; a<8; a++)//接收8个字节 { 
    I2C_SCL = 1; // 通知从设备我要开始读了,可以放1bit数据到SDA了 I2C_Delay10us(); dat <<= 1; // 读取的时候是高位在前的 dat |= I2C_SDA; I2C_Delay10us(); I2C_SCL = 0; // 拉低,为下一个bit的周期做准备 I2C_Delay10us(); } return dat; } 

(1)从设备已经将数据发送到数据线上;
(2)将时钟线由低变成高电平,在高电平期间读取数据线上的数据;
(3)将时钟线拉低,进行写一个读取周期;
总结:无论是主设备读/写从设备,时钟线都是主设备进行控制,所以整个I2C通信都是主设备在进行主导;

6、单片机和嵌入式设备的I2C通信区别

(1)单片机是利用GPIO模拟I2C协议进行通信。I2C时序的控制是编写单片机程序的人进行控制,不仅要考虑逻辑上的I2C协议,还需要阅读数据手册,关心时序图中高低电平的持续时间;
(2)嵌入式设备的Soc中集成了I2C控制器,由控制器来产生I2C通信时序,编写程序的人配置好I2C控制器,调用接口进行收发;如果有linux系统,则还会提高I2C驱动框架,软件开发人员基于I2C驱动框架进行编程;
总结:单片机开发需要考虑I2C通信的所有细节;而嵌入式Soc集成I2C控制器,向软件开发人员屏蔽了产生I2C通信时序的细节;

7、24c02的原理图分析

7.1、引脚介绍

24c02芯片中文手册_24c128芯片引脚图及功能

引脚名称 引脚作用
SCL I2C的时钟线
SDA I2C的数据线
E0、E1、E2 决定从地址
WE 写保护引脚,当引脚为高电平时不允许写,当引脚为低电平时允许写

7.2、从地址确定

在这里插入图片描述

(1)在发送从地址的一字节数据中,高7bit是从设备地址,最后一位表示本次主设备是要读还是写从设备;查阅24c02的数据手册可知,最低位为1表示读,最低位0表示写;
(2)7bit的从地址中,其中高4bit是固定的,最后3bit数据A0、A1、A2对应E0、E1、E2引脚的值,可以在硬件上通过接高/低电平来决定低3bit的值;
(3)查阅原理图可知,E0、E1、E2三个引脚都是接地,所以A0、A1、A2的值都是0;
总结:24c02芯片的从地址是0x,读24c02芯片得命令是0xa1,写24c02芯片的命令是0xa0;

8、24c02的随机读数据操作函数

在这里插入图片描述

/******************************************************************************* * 函 数 名 : unsigned char At24c02Read(unsigned char addr) * 函数功能 : 读取24c02的一个地址的一个数据 * 输 入 : 无 * 输 出 : 无 ******************************************************************************/ unsigned char At24c02Read(unsigned char addr) { 
    unsigned char num; I2C_Start(); I2C_SendByte(0xa0, 1); //发送写器件地址 I2C_SendByte(addr, 1); //发送要读取的地址 I2C_Start(); I2C_SendByte(0xa1, 1); //发送读器件地址 num=I2C_ReadByte(); //读取数据 I2C_Stop(); return num; } 

9、24c02的字节写数据操作函数

在这里插入图片描述

/******************************************************************************* * 函 数 名 : void At24c02Write(unsigned char addr,unsigned char dat) * 函数功能 : 往24c02的一个地址写入一个数据 * 输 入 : 无 * 输 出 : 无 ******************************************************************************/ void At24c02Write(unsigned char addr,unsigned char dat) { 
    I2C_Start(); I2C_SendByte(0xa0, 1);//发送写器件地址 I2C_SendByte(addr, 1);//发送要写入内存地址 I2C_SendByte(dat, 0); //发送数据 I2C_Stop(); } 

今天的文章
24c02芯片中文手册_24c128芯片引脚图及功能分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/81325.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注