EEPROM驱动代码常见操作

发布者:变形金刚最新更新时间:2023-04-06 来源: zhihu关键字:EEPROM  驱动代码 手机看文章 扫描二维码
随时随地手机看文章

相信很多读者都使用过类似AT24C0x这种使用I²C读写的EEPROM,在项目中,使用不当就容易导致数据丢失,或者异常的情况。


今天就来讲讲关于EEPROM的内容。


1I²C读写EEPROM基础原理

市面上大部分使用I2C通信的EEPROM,控制时序和读写流程都基本相同。


I²C通信原理,说简单不简单,但说难也不难,主要理解基础原理和时序即可。

可以参看我分享的文章:通信教程 | I²C基础原理及通信协议通信教程 | 详述I²C总线时序通信教程 | I²C几种速度及区别


2EEPROM底层驱动

真正实际做过项目的人都知道,好的底层驱动,会给上层应用开发带来很大便利,节省开发时间,以及减少bug发生率。


而大部分初学者,或者应届毕业生从事相关开发,一般很少考虑代码的移植性,复用性,或者说容错处理等问题。


下面,我简单列两点我在项目中,对EEPROM常用的几项操作。


1.写,再读,验证写入成功

这种方法很好理解:写入之后,再次读去这部分数据,进行一一匹配,验证是否与写入数据一致。

一般我是会重复操作3次,也就是说:写入,再读取,如果超过3次都还失败,那么我则放弃写入,认为写入失败,或芯片异常。

这个方法可以简单解决因异常导致写入失败的问题。


2.添加校验信息

在上面一层读验证基础上,对保存一些参数,我一般还会:在参数末尾添加类似“和校验”,或“CRC校验”。

假如你连续存储一个有10字节的参数(数据结构),如果因异常修改了中间某一个字节参数,你读出来进行校验,发现不对,则认为这个参数无效。

添加这个校验的目的相信从上面我举例已经明白,就是解决多字节参数中某个字节被恶意修改,导致这个参数无效的问题。


3.EEPROM在多任务中添加互斥锁

使用过操作系统的朋友都知道,多线程访问一个资源,一般都存在互斥的关系。简单的说:一个资源,在同一时刻,只能被一个线程操作。

那EEPROM举例:线程A在网EEPROM写10字节数据,刚6个字节时,线程B想要抢占,往EEPROM写入数据。你觉得线程A应不应该放弃I2C总线,让线程B写入呢?

答案肯定是不允许的,所以,就有了互斥锁这么一说。也就是等先占用I2C总线的线程操作完,才释放总线,让其他线程进行操作。

这三点应该是我比较常用了,网上还有其他一些相关的容错处理机制,感兴趣的不妨搜索一下。

我这里就不贴代码了,因芯片型号不同,应用不同,代码就存在差异。但我们目的:在保证满足应用的同时,需考虑代码的移植、复用、以及容错。


3I²C选择硬件、软件?

我们代码应该使用硬件I2C?还是软件模拟I2C?

这个问题有许多朋友都在问,说句实话,遇到这类有争议的问题,一般来说,需要结合项目实际情况,比如速度、实时性、移植性等。


我遇到这类问题,一般会根据实际情况而定。比如:你的I2C产品要提供给一些不同平台用户,进行二次开发,我觉得软件IO模拟比较好,方便用户嘛。


假如你们公司开发的产品都使用STM32这家公司芯片开发I2C产品,我觉得,你代码可以使用硬件I2C。


关键字:EEPROM  驱动代码 引用地址:EEPROM驱动代码常见操作

上一篇:嵌入式开发 | 单片机能用C++开发吗?
下一篇:单片机串口最底层的本质​

推荐阅读最新更新时间:2024-11-07 19:52

单片机EEPROM简介
在实际的应用中,保存在单片机 RAM 中的数据,掉电后就丢失了,保存在单片机的FLASH 中的数据,又不能随意改变,也就是不能用它来记录变化的数值。但是在某些场合,我们又确实需要记录下某些数据,而它们还时常需要改变或更新,掉电之后数据还不能丢失,比如我们的家用电表度数,电视机里边的频道记忆,一般都是使用 EEPROM 来保存数据,特点就是掉电后不丢失。我们板子上使用的这个器件是 24C02,是一个容量大小是 2Kbits,也就是 256 个字节的 EEPROM。一般情况下,EEPROM 拥有 30 万到 100 万次的寿命,也就是它可以反复写入 30-100 万次,而读取次数是无限的。 24C02 是一个基于 I2C 通信协议的器
[单片机]
STC单片机AD和EEPROM驱动C程序设计与编写
stc单片机具有在应用编程,调试起来比较方便;带有10位AD;内部eeprom;可在1T/机器周期下工作,速度是传统51单片机的12倍;下面是我写的AD和EEPROM的驱动C代码: /*---------------------------------------------------------------- *File Name: stc_AD.c - *Description: A/D 转换程序 *Project: - *MCU type: STC12C5410AD -
[单片机]
基于SM320F2812 SPI总线的扩展EEPROM设计
EEPROM(Electrically Erasable ProgrammableRead-Only Memory电可擦可编程只读存储器),是一种掉电后数据不丢失的存储芯片.在实际应用中,为了保持程序能够统一,又必须在程序中使用不同的参数,可以使用EEPROM进行扩展存储,将需要使用的数据存储在EEPROM中.当系统上电开始工作时,首先从EEPROM中读取参数,然后执行应用.本文采用了ATMEL公司的EEPROM存储器AT25010及TI公司推出的2000系列DSP TMS320F2812,很好地实现了数据的擦写和存储.AT25010采用了标准的SPI总线接口,所以与DSP经过简洁的设计连接后即可实现硬件连接. 1.AT25010
[电源管理]
基于SM320F2812 SPI总线的扩展<font color='red'>EEPROM</font>设计
STC89C52内部的EEPROM
STC89C52内部自带了4K大小的EEPROM,地址是从2000H~2FFFH。写操作主要是编程和擦除。如果某个字节是 1111,1111B ,则可将其中的 1 编程为 0 ,如果该字节中有位为 0 ,则须先将整个扇区擦除,因为只有 扇区擦除 才可以将 0 变为 1 。因此我们说,这不是真正意义上的EEPROM,称之为Data Flash更为合理。 几个相关的功能寄存器: 以下是几个操作函数,供大家参考: void ISP_Enable() { EA_S=EA; EA=0; ISP_CONTR=0x82; } void ISP_Disable() { ISP_CONTR=0; ISP_CMD=0; I
[单片机]
IIC实现对EEPROM(24C02)的读写
概述:EEPROM芯片型号为24C02,该芯片的总容量是256个字节,该芯片通过IIC总线与外部连接。 实验功能:通过KEY1按键来控制24C02的写入,通过另外一个按键KEY0来控制24C02的读取。 硬件电路: IIC配置代码: //初始化IIC void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟 //GPIOB8,B9初始化设置 GPIO_InitStructure.GPIO_Pin = GP
[单片机]
IIC实现对<font color='red'>EEPROM</font>(24C02)的读写
stm8s开发(九) EEPROM的使用:使用EEPROM存储数据!
EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。在以前的单片机系统中,通常都是在单片机外面再扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使用,降低了成本,提高了可靠性。 STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。 为了管理方便,定义EEPROM的地址 #define EP_H
[单片机]
【51单片机】 ULN2003模块 驱动步进电机(5线)正反转 代码以及接线图
步进电机有四相(A-B-C-D) 正向转动思路为A→B→C→D 反向转动思路为D→C→B→A 通过给每一相轮流供电,实现电机轴的360度转动 、、以下代码可直接复制使用: #include reg52.h #define uchar unsigned char //宏定义 把unsigned char简写为uchar #define uint unsigned int // 把unsigned int 简写为uint uint i,j; //定义全局变量,执行电机for循环转动时间需要用到 sbit A1 = P1^0; //定义给步进电机四相连接的IO口 sbit B1 = P1^1;
[单片机]
【51单片机】 ULN2003模块 <font color='red'>驱动</font>步进电机(5线)正反转 <font color='red'>代码</font>以及接线图
Linux下I2C总线EEPROM驱动程序设计方法
1 引言 I2C (Inter-Integrated Circuit1总线是一种由Philips公司开发的2线式串行总线,用于连接微控制器及其外围设备。它是同步通信的一种特殊形式,具有接口线少、控制方式简单、器件封装形式小、通信速率较高等优点。在主从通信中,可有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。笔者在开发基于MPC8250的嵌入式Linux系统的过程中发现I2C总线在嵌入式系统中应用广泛,I2C总线控制器的类型比较多,对系统提供的操作接口差别也很大。与I2C总线相连的从设备主要有微控制器、EEPROM、实时时钟、A/D转换器等.MPC8250处理器正是通过内部的I2C总线控制器来和这些连接在I2C
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved