当前位置:首页 > 公众号精选 > 程序员小哈
[导读]“202007每月一练” 的板子上还有一个24C02芯片没有写教程,今天介绍一下24C02这个芯片的驱动方法。

点击上方“嵌入式从0到1”,选择“置顶/星标公众号

干货福利,第一时间送达!


202007每月一练” 的板子上还有一个24C02芯片没有写教程,今天介绍一下24C02这个芯片的驱动方法。

有的时候我们在程序中会改变一些参数的值,我们希望这些参数可以固化,掉电重启之后仍旧能够使用最新的值,这种需求,我们就可以使用E2PROM来实现。

24CXX属于串行E2PROM, 是基于I2C总线的存储器件,遵循二线制协议,I2C总线上可以外挂多个器件,每个器件对应不同的地址,通过地址将不同器件进行分开,保证不同芯片之间数据传输的独立性。
由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。

24C02的应用场景:

  • 存储硬件的默认参数,这样开机上电之后读取这些参数,就可以按照默认参数运行了,比如存储PID自整定之后的参数;
  • 保存计费、计量的一些应用的余额;
  • 类似血压计、血糖仪之类保存一定次数的检测结果,实现历史回溯功能。

24CXX系列E2PROM为I2C总线的掉电存储数据芯片。对于I2C总线的介绍可以参考下面网文:

4位数码管显示模块驱动

I2C总线主要注意以下几点:

  1. 数据有效性要求

在输入数据时,当SCL是高电平时,SDA上的信号必须保持不变;只有SCL上的时钟信号为低电平时,SDA上的信号才能改变。

  1. 数据的开始和结束条件

SDA、SCL默认为高电平,表示总线处于空闲状态。

数据输入的开始条件是SCL为高电平时,SDA由高变低;

结束条件是SCL为高电平时,SDA由低电平变为高电平,即SDA出现一个上升沿的跳变,即为终止信号。

  1. I2C的应答信号ACK

数据传输带有应答信号ACK,在传输数据的过程中,在时钟线SCL的第九个脉冲时,从机芯片内部会产生一个应答信号ACK将SDA管脚拉低。

引脚定义


引脚 功能描述
A0-A2 器件地址定义引脚,通过高低电平对应的二进制代表不同的地址
SDA 串行数据
SCL 串行时钟输入
WP 写保护,接地:可读可写;
接Vcc只读,即写保护
GND Ground
Vcc Power Supply

24C02模块的原理图

  1. 本文对应实例,CON1跳线短接,24C02的地址为0,故24C02的写地址为0xA0,读地址为0xA1。

  2. 24C02,尾数02代表着内部有256*8(2K bits)空间。

  3. 上拉电阻必需有,否则可能无法对24C02进行正确读写。

24C02器件操作流程

单字节写

单字节写流程

在字节写模式下,主器件发送起始命令和从器件地址信息、此时R/W位置0(写地址)发给从器件,在从器件产生应答信号后,主器件发送24C02的地址信息,然后等待从器件返回的另一个应答信号后,再发送数据到24C02,然后再接收一次Ack应答信号后,主芯片产生一个停止信号,从器件收到停止信号后,开始内部数据的擦写,在内部擦写过程中,24C02不再应答主器件的任何请求,从而完成整个单字节的写流程。

注: 当上一个数据写完之后,即发送停止信号之后,需延时至少10ms以上,才能再发送下一次写操作的起始信号。

读操作

1. 单字节读
读操作允许主器件对24C02的任意字节进行读操作。主器件首先通过发送起始信号、从器件地址和写操作(写地址)的标志位0。

在从器件应答之后,主器件发送目标地址,并等待返回应答信号。

主器件重新发送起始信号和从器件地址,此时R/W位置1(读操作,读数据),从器件响应应答信号,然后主器件获取一个8位数据字节,主器件不用发送应答信号但需要产生一个停止信号,即完成单字节读过程。

2. 多字节连续读

在从机给主机发送完一个8位字节数据后,主器件产生一个应答信号来响应,告诉从机主器件请求更多的数据,对应每个主机产生的应答信号,从机将发送一个8位数据字节。当主器件不发送应答信号而发送停止位时结束操作。

如果我们使用如下代码,读取大于24C02容量的字节数的话,会有什么现象呢?
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);

上面代码执行,输出结果如下所示:

从上面截图,我们可以看出来,两个红色圈选部分的内容是一样的,即当读取的字节数超过N(对于24C02,N=255),读取的数据指针将返回存储空间的前面,从头往后输出剩余字节。

出现这样的原因主要是我们在读取函数中,发送地址的时候,将读取地址对存储空间大小取余了,所以又从头开始输出剩余字节了。

IIC_Send_Byte(ReadAddr%256);

紫色的55,就是程序初始化的时候,检查24C02芯片是否存在时,AT24CXX_Check()函数中写入的数据:

while(AT24CXX_Check())  //检测24C02是否存在{ printf("24C02 Check Failed!\r\n");  delay_ms(500);  printf("Please Check! \r\n");  delay_ms(500); }

资料获取

代码工程中有两个文件,其中myiic为I2C总线相关操作函数所在文件,24cxx为24C02操作函数所在文件。

微信公众号后台回复“24C02”,可以下载本文对应的工程源码。

注:
代码工程使用的Keil版本为:V5.20
我用的PCB设计软件版本为:Altium Designer 14.2

如果没有特殊说明,软件环境都为以上两个版本。

有问题可以加我微信: 

chengxuyuanxiaoha(程序员小哈的全拼),

我可以拉你进技术交流群,有问题随时交流。


传统美德不能丢, 

偷偷摸摸请点赞, 

明目张胆请在看


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭