Eeprom的读写
Eeprom的读写
所看过的对24系列I2C读写时序描述最准确最容易理解的资料,尤其是关于主从器件的应答描述和页写描述,看完后明白了很多。
关于页写的描述,网络上绝大部分范程都没提到页写时的数据地址必须是每页的首地址才能准确写入,而且如果写入超过一页的数据会循环覆盖当前页的数据。
关于IIC总线I2C总线:i2c总线是Philips 公司首先推出的一种两线制串行传输总线。
它由一根数据线(SDA)和一根时钟线(SDL)组成。
i2c总线的数据传输过程如图3所示,基本过程为:1、主机发出开始信号。
2、主机接着送出1字节的从机地址信息,其中最低位为读写控制码(1为读、0为写),高7位为从机器件地址代码。
3、从机发出认可信号。
4、主机开始发送信息,每发完一字节后,从机发出认可信号给主机。
5、主机发出停止信号。
I2C总线上各信号的具体说明:开始信号:在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,将产生一个开始信号。
停止信号:在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,将产生一个停止信号。
应答信号:既认可信号,主机写从机时每写完一字节,如果正确从机将在下一个时钟周期将数据线(SDA)拉低,以告诉主机操作有效。
在主机读从机时正确读完一字节后,主机在下一个时钟周期同样也要将数据线(SDA)拉低,发出认可信号,告诉从机所发数据已经收妥。
(注:读从机时主机在最后1字节数据接收完以后不发应答,直接发停止信号)。
注意:在I2C通信过程中,所有的数据改变都必须在时钟线SCL为低电平时改变,在时钟线SCL为高电平时必须保持数据SDA信号的稳定,任何在时钟线为高电平时数据线上的电平改变都被认为是起始或停止信号。
作为一种非易失性存储器(NVM),24系列EEPROM使用的很普遍,一般作为数据量不太大的数据存储器。
下面总结一下其应用的一些要点。
从命名上看,24CXX中XX的单位是kbit,如24C08,其存储容量为8k bit,即1k Byte=1024 Byte。
eeprom读写程序详解
eeprom读写程序详解EEPROM(Electrically Erasable Programmable Read-Only Memory) 是一种可编程只读存储器,可以在电信号的作用下进行擦写和改写。
它通常用于存储单片机或其他嵌入式系统中的数据、设置参数、配置文件等。
对于 EEPROM 的读写程序,需要考虑以下几个方面:1. 读操作:读操作通常包括以下步骤:- 等待上次读操作完成。
- 获取要读取的数据的单元地址。
- 将 EEPGD 位和 CFGS 位清零。
- 启动读操作控制位 RD。
- 等待本次读操作完成。
- 将该单元地址中对应的数据返回。
在读取 EEPROM 数据时,为了避免芯片在一瞬间无法获取到数据,需要给芯片一定的时间来稳定获取数据。
因此,在读取操作中需要加入等待步骤。
2. 写操作:写操作通常包括以下步骤:- 等待上次写操作完成。
- 获取要写的数据的单元地址。
- 将要写的数据写入 EEPROM 的单元中。
- 将 EEPGD 位和 CFGS 位清零。
- 启动写操作控制位 WP。
- 等待写操作完成。
在写操作中,为了确保数据的可靠性,需要将要写的数据写入EEPROM 的单元中,并等待写操作完成。
同时,在写操作过程中,需要注意避免对无关的单元进行写操作,以免损坏 EEPROM 芯片。
3. 中断处理:在 EEPROM 的读写操作中,通常需要加入中断处理机制,以便在读写过程中及时响应和处理异常情况。
例如,在读取 EEPROM 数据时,如果 EEPROM 芯片出现故障,可能会导致读取失败。
为了避免这种情况,可以在读取操作中加入中断处理机制,在读取失败时及时报警或采取相应的应对措施。
总之,EEPROM 读写程序的实现需要考虑多个方面的因素,包括读操作、写操作、中断处理等。
同时,需要考虑 EEPROM 芯片的特性和限制,以便实现高效、稳定、可靠的 EEPROM 读写操作。
eeprom的读写原理
eeprom的读写原理
EEPROM是可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory)的缩写。
它是一种非易失性存储器,可以在不需要电源的情况下保持存储的数据。
EEPROM的读写原理涉及到内部的电子结构和操作方式。
首先,让我们从写入数据开始。
EEPROM的写入原理是通过在内部的存储单元中存储电荷来表示数据。
当需要写入数据时,首先要将写入地址和数据发送到EEPROM芯片。
然后,根据写入数据的逻辑状态(0或1),相应的存储单元内的电荷状态会被改变。
这是通过在存储单元中施加特定的电压来实现的,这会改变存储单元内部的绝缘体的电荷状态,从而表示特定的数据。
接下来是读取数据的原理。
当需要读取数据时,读取地址会被发送到EEPROM芯片,芯片会根据地址找到相应的存储单元,并读取存储单元内的电荷状态。
这些电荷状态会被转换成数字信号,然后输出给外部系统。
通过这种方式,存储在EEPROM中的数据可以被读取出来并用于系统操作。
总的来说,EEPROM的读写原理涉及到内部存储单元的电荷状态
表示数据,并通过外部电压和信号的控制来实现数据的写入和读取操作。
这种原理使得EEPROM成为一种非常有用的存储器,适用于许多需要长期存储数据并且需要在断电后保持数据的应用场景。
eprom和eeprom的读写过程
eprom和eeprom的读写过程
EPROM(Erasable Programmable Read-Only Memory)和EEPROM(Electrically Erasable Programmable Read-Only Memory)都是一种非易失性存储器,可以用来存储数据并在需要时进行读取。
两者之间的主要区别在于擦除的方式不同。
1. EPROM的读写过程:
- 写入:EPROM使用特定的设备(EPROM编程器)将数据写入芯片。
设备通过一个特定的电压脉冲将数据编程到存储单元中,并将存储单元的电平状态改变从1变为0,以此来表示数据的存储。
- 读取:EPROM的读取是通过将特定地址的存储单元的电平状态转换为电压信号来完成的。
如果存储单元的电平为1,则读取的电压为低电平;如果存储单元的电平为0,则读取的电压为高电平。
2. EEPROM的读写过程:
- 写入:EEPROM的写入过程与EPROM相比更灵活。
可以通过特定的设备将数据写入EEPROM。
写入时,需要将要写入的地址和写入的数据发送给EEPROM,并将特定的命令信号发送给EEPROM,以启动写入操作。
写入操作完成后,EEPROM中相应地址的存储单元将保存写入的数据。
- 读取:EEPROM的读取过程与EPROM相似,通过将特定地址的存储单元的电平状态转换为电压信号来读取数据。
EEPROM的读取可以直接通过数据总线传输读取命令和地址,不需要额外的编程器。
需要注意的是,在实际操作中使用EPROM和EEPROM时,需要严格按照相关规范和设备说明进行操作,确保正确的读写过程,以免损坏芯片或丢失数据。
STC单片机EEPROM读写程序
STC单片机EEPROM读写程序在单片机中,EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以用于存储数据,即使在断电情况下,数据也会被保留。
因此,掌握STC单片机的EEPROM读写程序对于开发嵌入式系统非常重要。
一、EEPROM简介EEPROM是一种可重复擦写的存储器,可用于存储小量数据。
与Flash存储器相比,EEPROM具有更快的写入和擦除速度。
在STC单片机中,EEPROM的存储容量通常较小,一般在几个字节到几千字节之间。
二、EEPROM读操作在STC单片机中,进行EEPROM读操作需要按照以下步骤进行:1. 初始化I2C总线:STC单片机使用I2C总线进行EEPROM读写操作,因此需要先初始化I2C总线。
通过设置相关寄存器,设置I2C 总线的速度和地址。
2. 发送设备地址:确定要读取的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要读取的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送读命令:向EEPROM发送读命令,以启动读操作。
5. 读取数据:从EEPROM中读取数据,并保存到变量中。
6. 结束读操作:完成读操作后,关闭I2C总线。
三、EEPROM写操作类似于读操作,进行EEPROM写操作也需要按照一定的步骤进行:1. 初始化I2C总线:同样地,首先需要初始化I2C总线。
2. 发送设备地址:确定要写入的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要写入的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送写命令:向EEPROM发送写命令,以启动写操作。
5. 写入数据:将要写入EEPROM的数据发送到I2C总线。
6. 结束写操作:完成写操作后,关闭I2C总线。
四、注意事项在进行EEPROM读写操作时,需要注意以下几点:1. 确保正确的设备地址:要与EEPROM的地址匹配,否则无法进行有效的读写操作。
STM8教程实验26-片内EEPROM的读写
例程二十六Flash_eeprom读写实验EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。
在以前的单片机系统中,通常都是在单片机外面再扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。
现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使用,降低了成本,提高了可靠性。
STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。
最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。
EEP ROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。
下面介绍一下STM8S了EEPROM:风驰电子STM8开发板就是大容量的了解了那么多关于STM8S 的EEPROM的知识,下面看看软件方面是如何编程的,老规矩,从主函数看起。
看到主函数,是否觉得很容易呢,在这个例程中我发了一个晚上的时间去调试,还是不行,到了第二天早上才调试成功,所以希望大家珍惜我的写的教程文档,这些教程和例程是我发了不知多少时间是总结,为了都是各位爱好者能缩短一下开发使用时间。
好了,转入正题吧,大家在做这个实验的时候要注意2个重要的地方。
第一在“stm8s_conf.h”文件中取消注释,在“stm8s.h”的文档中改成如下这样才能使用几个重要的函数。
还有一个重要的地方是,Flash_eeprom_writeread_Init()初始化一定先初始化。
下面再看看初始化的原函数这个初始化是初始化Flash正常编程方式,开启EEPROM的数据存贮器。
这是一个EEPROM的读写测试程序,EEPROM的读的话是可以每个地址每个地址的读,但是写的话必须是一个扇区一个扇区的写,每个扇区为128Byte。
至于里面的各个函数,相信大家一个就知道是什么意思了,在这里就不多说了。
里面还有一个地方要注意的,FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);这条语句就是等待EEPROM写完成,必须的,无论EEPROM的读还是写,都必须要这条语句。
eeprom读写例子
void main(void)
{
UINT8 i=0;
EEPROMSectorErase(0); //从EEPROM 的相对0 地址扇区擦除
EEPROMWriteByte(0,0x88);//从EEPROM 的相对0 地址写入0x88
i=EEPROMReadByte(0); //从EERPOM 的相对0 地址读取数据
{
ISP_CMD=0x03; //扇区擦除模式
EEPROMEnable(); //EEPROM 使能
EEPROMSetAddress(addr);//设置EEPROM 地址
EEPROMStart(); //EEPROM 启动
DelayNms(10); //擦除一个扇区要10ms
EEPROMDisable(); //禁止EEPROM
{
ISP_DATA=0x00; //清空ISP_DATA
ISP_CMD=0x01; //读模式
EEPROMEnable(); //EEPROM 使能
EEPROMSetAddress(addr); //设置EEPROM 地址
EEPROMStart(); //EEPROM 启动
DelayNus(10); //读取一个字节要10us
STC89C52内部EEPROM
STC89C52RC 2KEEPROM
传统的 EEPROM是电可擦可编程只读存储一种掉电后数据不丢失的存储芯片。
?? STC89C52RC的 EEPROM是通过 ISP/IAP 技术读写内部 FLASH 来实现 EEPROM。
?? STC89C52RC的 EEPROM起始地址为 0x2000,以 512字节为一个扇区,EERPOM的大小为 2K字节。
学习笔记之内部eeprom读写
程序修改后重新编译下载到单片机后, 打开串口调试助手, 肯定会发现什么数据都没有, 别急, 重新按下单片机的复位键就可以看到数据了。 因为在主程序中发送数据的指令只执行 了一次, 速度很快, 在你打开串口调试助手前就已经过去了, 因此需复位一下才能看到现象。 现象如下图所示:
读回的数据分别是 00,01,02,03,04,05,06,07,08,09,发现和写入的数据是相同的,那么说 明成功的对 eeprom 进行了读写操作。 只要会了这两个最基本的读写操作,那么 Atmega16 内部的 512 字节的 eeprom 空间就 可以为你所用了。
AVR 学习笔记之内部 EEPROM 读写
AVR 单片机的多数型保存的数据。 Atmega16 内置的 EEPROM 的容量是 512 字节, 可以重复擦写的次数 是 10 万次。
AVRGCC 自带的 EEPROM 读写函数可对 Atmega16 内部的 EEPROM 进行读写操作。如果要使用 AVRGCC 中自带的 EEPROM 读写函数,首先要在程序中包含#include<avr/eeprom.h>这个头文件。 AVRGCC 内置 EEPROM 访问函数库如下: (1)void eeprom_read_block(void *buf, unsigned int addr, size_t n):从 EEPROM 的 addr 地址
} void usart_init() { UCSRA=0X00; UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//写 UCSRC, 异步操作, 禁止奇偶校验, 停止位数为 1,8 位字符长度 UBRRH=(F_CPU/BAUD/16-1)/256;//波特率高 4 位 UBRRL=(F_CPU/BAUD/16-1)%256;//波特率低 8 位 UCSRB|=(1<<TXEN);//使能发送,使能接收,使能接受中断 } void usart_put_char(unsigned char TX_data)//发送一个字节的数据 { while(!(UCSRA&(1<<UDRE)));//检测 UDRE 是否为 1, 只有在 UDRE 为 1 的情况下, 才 能向缓冲器 UDR 中写入数据。 UDR=TX_data; } int main() { unsigned char i; port_init(); usart_init(); for(i=0;i<10;i++)eeprom_write_byte(i,i); while(1); } 上段程序是对 EEPROM 进行写操作,通过 for(i=0;i<10;i++)eeprom_write_byte(i,i);这段 程序实现的是在地址 0—9 分别写数据 0—9。 那么怎么知道我数据是否成功写入了呢?下面 还要进行读操作,作用是把刚才写入的数据读出来,看看是否和写入的一样,只需要修改主 程序即可。修改后的代码如下: int main() { unsigned char i; port_init(); usart_init(); for(i=0;i<10;i++) usart_put_char(eeprom_read_byte(i)); while(1); }
PIC单片机EEPROM的读写程序
。TEEHSATAD 考参 �似类 MORPEE 写读与程过体具写读的 HSALF �3 。)个这考参要前序程编(TEEHSATAD 见可序程编汇体具 。零清被否是 RW�置设被否是 FIEE 查检须必件软则�成完有没 1 骤步果如。 �零清件软由须 必 FIEE�置设被 FIEE 而零清被位 RW�时束结期周写在 �01 。NERW 除清 。 �断中到用要需果如�断中放开 。位 RW 置设 �3� 。 �2NOCEE 入写后 然�W 入写先首�步两含包� 。2NOCEE 入写 AAX0 将 �2� 。 �2NOCEE 入写后 然�W 入写先首�步两含包� 。2NOCEE 入写 55X0 将 �1� �序顺的骤步个 5 面下行执格严 。断中 elbasiD 。NERW 置设 。位 DGPEE 清 .ATADEE 入写据数位 8 将 。制限的件硬于大会不度长址地保确�RDAEE 入写址地将 �7 �6 �5 �4 �3 �2 CIP
。程 过写于处正是不是看位 RW 查检�成完有没 01 骤步果如 �1
�骤步的 MORPEE 写 。行进在正作操写有没证保要前程过作操写个 一始开在。零清 NERW 对须必件软后完写。RW 置设能才后置设被 NERW 在有只 。零持保须必间时它其 �据数写在正了除位 NERW 据数 MORPEE 写 。TEEHSATAD 见可序程编汇体具 。数读 ATADEE 从 。位 DR 置设 。位 DGPEE 除清 。制限的件硬于大会不度长址地保确 �ATADEE 入写址地将 �4 �3 �2 �1 �3
的中 ATADEE:HTADEE 而�除擦被会将据数的中 RDAEE:HRDAEE 。 令 指 行 执 止 停 会 将 机 片 单 � 置 设 被 R W 和 N E RW 旦 一 �HSALF 于对 。1 置被 FIEE �零清被会将址地的 RDAEE 后然 �入写据 数的中 ATADEE 将会就 RW 和 NERW 了置设旦一�据数 MORPEE 于 对 。 零 清 位 识 标 该 对 先 首 须 必 前 之 RW 置 设 在 � 置 设 被 后 束 结 程过写当 FIEE 志标断中。零清动自被会后束结作操写�位始初作操 写是位 RW。作操写行进以可则 1=�位能使作操写是 NERW。FIEE 和 RRERW 位志标个两�NERW 和 RW 位制控个两有作操写 。据数到读器 存寄 ATADEE:HTADEE 从以可令指条两后置设被在 �据数的 HSALF 于 对 而 。 据 数 到 读 器 存 寄 ATADEE 从 以 可 上 马 会 就 后 置 设 被位 该 �作操读的 MORPEE 于对。零清动自会后束结作操读。据数到读器 存寄据数从能就 1 成置设被旦一�DR 位加附个一到用要作操读 。作操行进 HSALF 对是则 1= �作操行进 MORPEE 对 �0=DGPEE 。断中外意的中程过写止防来用被是而�器存 寄的上义意正真个一是不 2NOCEE�化始初置配来用 1NOCEE 器存寄 2NOCEE 和 1NOCEE �1 。写读的节字/字行进�行执常正的序程响影 会不 MORPEE 。 �列系 X78F61�据数位 41 储存 ATADEE:HTADEE � 址 地 位 31 存 保 RDAEE:HRDAEE � 断 中 和 令 指 条 一 下 行 执会才束结作操写到直�行运的令指停暂会作操写的 HSALF 对
EEPROM读写实验
实验十、EEPROM读写实验
(一)、实验目的:
EEPROM是掉电后不丢失信息的一种数据存储器,适用于现场数据的采集和存储。
本实验给出了EEPROM记录单片机重启次数(包括上电复位重启和下载程序的过程中的复位重启),并将该次数显示在8位4联LED数码管上的例程程序。
目的是引导使用者掌握51单片机与IIC设备进行串行通讯的原理和使用方法。
(二)、实验接线和步骤:
1、将U13(上面的8位拨码开关)的“5”~“8”位打到“ON”位置,这是数码
管位码。
2、将U14(下面的8位拨码开关)的“1”~“8”位打到“ON”位置,这是数码
管段码。
3、将24C08处的两个三位跳线处,分别短接“P34”,“PC-34”跳线和“P35”,“PC-35”
跳线。
这是24C08的IIC总线的数据线和时钟线。
4、下载程序。
5、因为U17(USB旁的4位拨码开关)会对数码管显示产生影响,所以将U17的
“1”~“3”位断开。
6、按动复位键观察数码管显示数字。
(电源重启和下载复位也会增加单片机重启次
数)
说明:因程序例程篇幅过长,不方便以书面形式列出,为方便使用者,例程的原代码及工程文件所有文档均已附在电子文档“EEPROM读写实验”文件夹中。
使用者可在例程程序的基础上改变某些参数以观察不同的实验效果。
内部EEPROM读写实验
GOTO $-1 ;
DECFSZ 72H,1 ;
GOTO DELAY1 ;
RETURN
;********************************************
GOTO MAIN ;
ORG 0008H ;
MAIN
BCF STATUS,RP1 ;选体1为当前体
BSF STATUS,RP0 ;
MOVLW 00H ;设定RC全部为输出
END
�
WR EQU 1 ;定义写启动控制位位地址
WREN EQU 2 ;定义写使能控制位位地址
EEPGD EQU 7 ;定义访问目标选择控制位位址
F EQU 1 ;定义目标寄存器为RAM的指示符
W EQU 0 ;定义目标寄存器为W的指示符
CALL DELAY ;调用延时子程序
MOVF ADDR,F ;检测当前地址
BTFSS STATUS,Z ;是否为0?是!跳一步
GOTO READ1 ;否!返回继续读出和显示
READ2
MOVLW 55H ;
MOVWF EECON2 ;送55H到寄存器EECON2(读写内部EEPROM,这句是固定的)
MOVLW 0AAH ;
MOVWF EECON2 ;送AAH到寄存器EECON2(读写内部EEPROM,这句是固定的)
DELAY
MOVLW 0 ;
MOVWF 72H ;将外层循环参数值256送外层循环寄存器
DELAY1
MOVLW 0 ;将内层循环参数值256送内层循环寄存器
MOVWF 73H ;
ADDR EQU 70H ;定义地址变量
eeprom 读写结构体
eeprom 读写结构体当你需要读写结构体到 EEPROM(Electrically Erasable Programmable Read-Only Memory)时,你可以按照以下步骤进行操作:1. 定义结构体:首先,你需要定义你要读写的结构体。
确保结构体的字段类型适合EEPROM 的存储要求。
2. 分配 EEPROM 存储空间:为了存储结构体,你需要在 EEPROM 中分配足够的存储空间。
这可以通过在 EEPROM 驱动程序中定义一个特定的存储区域来完成。
3. 写入结构体:要将结构体写入 EEPROM,你需要将结构体的每个字段转换为适合EEPROM 写入的数据类型,并将其逐个写入到 EEPROM 中。
你可能需要使用特定的 EEPROM 写入函数或指令来完成这个操作。
4. 读取结构体:要从 EEPROM 中读取结构体,你需要使用相应的读取函数或指令,将存储在 EEPROM 中的数据逐字段读取,并将其转换回结构体的形式。
在进行 EEPROM 读写结构体时,需要注意以下几点:1. EEPROM 的写入次数有限,通常在数万次到数十万次之间。
因此,频繁的写入可能会缩短 EEPROM 的寿命。
尽量只在必要时进行写入操作。
2. EEPROM 的写入速度相对较慢,与内存或闪存相比。
因此,在写入结构体时,可能需要考虑到时间延迟。
3. 在处理 EEPROM 时,要特别小心处理意外情况,例如电源中断或写入错误。
确保在程序中添加适当的错误处理机制,以防止数据丢失或损坏。
具体的 EEPROM 读写操作会因使用的硬件平台和 EEPROM 驱动程序而有所不同。
请参考你所使用的硬件平台和 EEPROM 驱动程序的文档,以获取更详细和具体的指导。
51单片机EEPROM的读写
51单片机EEPROM的读写STC单片机的内部EEPROM是用DATAFLASH模拟出来的,不是真正的EEPROM存储器,不能用普通的方法来操作下面是一些注意点:1.字节写之前要先将这个字节所在扇区的其它有效数据读取到RAM暂存(这步不是必须的)2.暂存完之后再对整个扇区(512字节)进行擦除操作,擦拭完后,整个扇区每个地址中数据都变成0xFF3.将欲写入的N个字节数据,用字节写函数写入EEPROM4.将暂存到RAM的其它有用的EEPROM值再用字节写函数写回EEPROM5.STC用FLASH模拟出来的EEPROM的字节写功能只能将1变成0,而不能将0变成1,只有扇区擦除后数据才是全1,例如:在地址0x21f0处第1次写11010110,第2次写111010,读出结果是这2个值的相与10010所以如果一个地址处的值不是0xff时写入新的数据是不对的,要先执行扇区擦除,变为0xff,对于单个字节的写入,我们可以先检查该地址处的数据是否为0xff,是的话就不用擦除扇区了----------------------------------------------------------------------STC89C52单片机内部EEPROM 的读写过程1 配置ISP_CONTR寄存器,使能第7位ISPEN,让ISP_IAP功能生效,并配置低3位的等待时间2 写指令: 读/写/擦除扇区这3个命令3 赋值: ISP_ADDRH和ISP_ADDRL的地址值4 关闭总中断EA,因为下面要写的2个触发指令必须是连续操作的,不能被中断5 执行公用的ISP_IAP 触发指令,触发后读写操作才能进行6 打开中断EA, 关闭ISP_IAP功能:清相关寄存器#include "my51.h"/******************定义命令字节******************/#define read_cmd 0x01 //字节读数据命令#define wirte_cmd 0x02 //字节编程数据命令#define erase_cmd 0x03 //扇区擦除数据命令/****************特殊功能寄存器声明****************/sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe3;sfr ISP_ADDRL = 0xe4;sfr ISP_CMD = 0xe5;sfr ISP_TRIG = 0xe6;sfr ISP_CONTR = 0xe7;/*定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数******************///#define enable_waitTime 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值//#define enable_waitTime 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值//#define enable_waitTime 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值#define enable_waitTime 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值//#define enable_waitTime 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值void ISP_IAP_disable(void) //关闭ISP_IAP{EA=1; //恢复中断ISP_CONTR = 0x00;ISP_CMD = 0x00;ISP_TRIG = 0x00;}void ISP_IAP_trigger() //触发{EA=0;//下面的2条指令必须连续执行,故关中断ISP_TRIG = 0x46; //送触发命令字0x46ISP_TRIG = 0xB9; //送触发命令字0xB9}void ISP_IAP_readData(u16 beginAddr, u8* pBuf, u16 dataSize) //读取数据{ISP_DATA=0; //清零,不清也可以ISP_CMD = read_cmd; //指令:读取ISP_CONTR = enable_waitTime; //开启ISP_IAP,并送等待时间while(dataSize--) //循环读取{ISP_ADDRH = (u8)(beginAddr >> 8); //送地址高字节I SP_ADDRL = (u8)(beginAddr & 0x00ff);//送地址低字节ISP_IAP_trigger(); //触发beginAddr++; //地址++*pBuf++ = ISP_DATA; //将数据保存到接收缓冲区}ISP_IAP_disable(); //关闭ISP_IAP功能}void ISP_IAP_writeData(u16 beginAddr,u8*pDat,u16 dataSize) //写数据{ISP_CONTR = enable_waitTime; //开启ISP_IAP,并送等待时间ISP_CMD = wirte_cmd; //送字节编程命令字while(dataSize--){ISP_ADDRH = (u8)(beginAddr >> 8); //送地址高字节ISP_ADDRL = (u8)(beginAddr & 0x00ff);//送地址低字节ISP_DATA = *pDat++; //送数据beginAddr++;ISP_IAP_trigger(); //触发}ISP_IAP_disable(); //关闭}void ISP_IAP_sectorErase(u16 sectorAddr) //扇区擦除{ISP_CONTR = enable_waitTime; //开启ISP_IAP;并送等待时间ISP_CMD = erase_cmd; //送扇区擦除命令字ISP_ADDRH = (u8)(sectorAddr >> 8);//送地址高字节ISP_ADDRL = (u8)(sectorAddr & 0X00FF);//送地址低字节ISP_IAP_trigger(); //触发ISP_IAP_disable();//关闭ISP_IAP功能}void main() //测试{u8 buf[3]={0}; //接收数据缓冲区u8dat[5]={b(111010),b(1001),b(1),b(1011),b( 1110)};//我写成二进制是为观察led灯ISP_IAP_sectorErase(0x2000); //扇区擦除,一块512字节ISP_IAP_writeData(0x21f0,dat,sizeof(dat));//写EEPROMISP_IAP_readData(0x21f0,buf,sizeof(buf)); //读取P1=buf[2];//在地址0x21f0处第1次写11010110,第2次写111010,读出结果是这2个值的相与10010while(1); //所以如果一个地址处的值不是0xff时写入新的数据是不对的,要先擦除为0xff}#ifndef _MY51_H#define _MY51_H#include <reg52.h>//#include <math.h>#include <intrins.h>#include <stdio.h>#include "mytype.h"/*************二进制输入宏****************************/#ifndef _LongToBin_#define _LongToBin_#define LongToBin(n) \( \((n >> 21) & 0x80) | \((n >> 18) & 0x40) | \((n >> 15) & 0x20) | \((n >> 12) & 0x10) | \((n >> 9) & 0x08) | \((n >> 6) & 0x04) | \((n >> 3) & 0x02) | \((n ) & 0x01) \)#define bin(n) LongToBin(0x##n##l)#define BIN(n) bin(n)#define B(n) bin(n)#define b(n) bin(n)#endif/*************单个数据位的置位宏*********************/#ifndef _BIT_#define _BIT_#define BIT(n) (1<<n)#define bit(n) BIT(n)#endif#define high 1 //高电平#define low 0 //低电平#define led P1 //灯总线控制sbit led0=P1^0; //8个led灯,阴极送低电平点亮sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;sbit led6=P1^6;sbit led7=P1^7;sbit ledLock=P2^5; //led锁存的状态,0锁定 ,1不锁定sbit beep=P2^3; //蜂鸣器void delayms(u16 ms);//void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085///////////////////////////////////////// ////////////////////////////////////#endif。
EEPROM读写实例及说明
;****************************************************************************
include "p16f877.inc"
ADDR EQU 20H ;写入地址寄存器
VALU EQU 21H ;写入值
REC_ EQU 22H ;读计数
WRC_ EQU 24H ;写计数
org 0
goto main
main
bcf STATUS,RP1
bcf STATUS,RP0 ;bank0
movlw 10h
movwf ADDR ;写入EEPROM初始值
movlw 90h
movwf VALU ;初始写入值
movlw 30h
movwf FSR ;间址,读出值初始存放地址
; EEPROM读写实例及说明
;****************************************************************************
; This is a program to test the function of reading&writting for EEPROM.
movlw 0Fh
movwf WRC_ ;写入次数
movwf REC_
;incf REC_ ;读出次数
wri_ ;写子程序
bsf STATUS,RP1
bsf STATUS,RP0 ;bank3
btfsc EECON1,WR
goto $-1
bcf STATUS,RP0
bcf STATUS,RP1 ;bank0
i2c读写eeprom手册
i2c读写eeprom手册
I2C读写EEPROM的手册主要包括以下步骤:
1. 确定EEPROM的设备地址:I2C通讯时,地址跟读写方向连在一起构成一个8位数。
当R/W位为0时,表示写方向,加上7位地址,其值为
“0xA0”,常称该值为I2C设备的“写地址”;当R/W位为1时,表示读方向,加上7位地址,其值为“0xA1”,常称该值为“读地址”。
2. 准备读写操作:主机产生并发送起始信号到从机,将控制命令写入从机设备,读写控制位设置为低电平,表示对从机进行数据写操作,控制命令的写入高位在前低位在后。
3. 发送存储地址:从机接收到控制指令后,回传应答信号,主机接收到应答信号后开始存储地址的写入。
4. 进行读写操作:根据一次读操作读取数据量的多少,读操作可分为随机读操作和顺序读操作。
随机读操作可以理解为单字节数据的读取。
5. 结束操作:读写操作完成后,主机发送停止信号结束操作。
请注意,所有I2C设备均支持单字节数据写入操作,但只有部分I2C设备支持页写操作;且支持页写操作的设备,一次页写操作写入的字节数不能超过设备单页包含的存储单元数。
此外,EEPROM芯片中还有一个WP引脚,
具有写保护功能,当该引脚电平为高时,禁止写入数据,当引脚为低电平时,可写入数据。
以上步骤仅供参考,如果使用实验板EEPROM的型号、设备地址或控制引
脚不一样,需根据实际工程修改。
EEPROM多个数据读写
temp2=dcx(IAP_ADDRESS+1);
temp3=dcx(IAP_ADDRESS+2);
temp4=dcx(IAP_ADDRESS+3);
temp1++;
temp2++;
temp3++;
temp4++;
a=temp1+temp2+temp3+temp4;
cc(IAP_ADDRESS);//擦除第1个扇区(2000h~21FFh)
xcx(IAP_ADDRESS,temp1);
xcx(IAP_ADDRESS+1,temp2);//对EEPROM区2002h写入
xcx(IAP_ADDRESS+2,temp3);
xcx(IAP_ADDRESS+3,temp4);
void xcx(uint addr,uchar dat)
{
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_PROGRAM;//用户可以对"Data Flash/EEPROM区"进行字节编程
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_DATA = dat; //数据进IAP_DATA
uchar code wxian[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//选通哪位数码管控制位
uchar bcd[8];//数码管bcd码缓冲区
void delay(uint t);//延时函数声明
单片机EEPROM读写数据流程解析
单片机EEPROM读写数据流程解析EEPROM 写数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。
第二步,发送数据的存储地址。
24C02 一共256 个字节的存储空间,地址从0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。
第三步,发送要存储的数据第一个字节、第二个字节??注意在写数据的过程中,EEPROM 每个字节都会回应一个“应答位0”,来告诉我们写EEPROM 数据成功,如果没有回应答位,说明写入不成功。
在写数据的过程中,每成功写入一个字节,EEPROM 存储空间的地址就会自动加1,当加到0xFF 后,再写一个字节,地址会溢出又变成了0x00。
EEPROM 读数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。
这个地方可能有同学会诧异,我们明明是读数据为何方向也要选“写”呢?刚才说过了,24C02 一共有256 个地址,我们选择写操作,是为了把所要读的数据的存储地址先写进去,告诉EEPROM 我们要读取哪个地址的数据。
这就如同我们打电话,先拨总机号码(EEPROM 器件地址),而后还要继续拨分机号码(数据地址),而拨分机号码这个动作,主机仍然是发送方,方向依然是“写”。
第二步,发送要读取的数据的地址,注意是地址而非存在EEPROM 中的数据,通知EEPROM 我要哪个分机的信息。
第三步,重新发送I2C 起始信号和器件地址,并且在方向位选择“读”操作。
这三步当中,每一个字节实际上都是在“写”,所以每一个字节EEPROM 都会回应一个“应答位0”。
第四步,读取从器件发回的数据,读一个字节,如果还想继续读下一个字节,就发送一个“应答位ACK(0)”,如果不想读了,告诉EEPROM,我不想要数据了,别再发数据了,。
EEPROM读写访问
EEPROM写使能。当EEPROM的 地址和数据准备好后,用户必须 设置EEWE为“1”,才能将数据 写入EEPROM中。在置EEWE为 “1”前,EEMWE必须置“1”, 否则写入操作无效。
位 位名 读/写 初始值 7 6 5
EEPROM读使能。此位用于对 EEPROM的数据读取,当EEAR中 设置了EEPROM的读取地址后, EERE的置“1”操作将使单元的数 据送至EEDR寄存器中,此时EERE 位自动清“0”。
1
1
(1)休眠状态 为进入休眠状态,MCUCR中的SE位被设为1,且须执 行一条SLEEP指令。系统发生的任何一种中断和复位将使 MCU恢复到正常模式。
(2)空闲模式 SM位必须清零,SLEEP指令使MCU进入空闲状态, 当系统发生外部中断、定时器/计数器溢出中断和看门狗复 位单片机时返回正常模式。 (3)掉电模式 此模式下,只有复位和外部中断可以使单片机恢复正 常模式。 (4)节电方式库函数 void sleep_enable(void) //允许低功耗模式 void sleep_disable(void) //禁止低功耗模式 void idle(void) //闲置模式 void powerdown(void) //掉电模式 void powersave(void) //休眠模式 在调用这些库函数之前必须将头文件#include <sleep.h> 加入到源程序文件中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
所看过的对24系列I2C读写时序描述最准确最容易理解的资料,尤其是关于主从器件的应答描述和页写描述,看完后明白了很多。
关于页写的描述,网络上绝大部分范程都没提到页写时的数据地址必须是每页的首地址才能准确写入,而且如果写入超过一页的数据会循环覆盖当前页的数据。
关于IIC总线I2C总线:i2c总线是Philips 公司首先推出的一种两线制串行传输总线。
它由一根数据线(SDA)和一根时钟线(SDL)组成。
i2c总线的数据传输过程如图3所示,基本过程为:1、主机发出开始信号。
2、主机接着送出1字节的从机地址信息,其中最低位为读写控制码(1为读、0为写),高7位为从机器件地址代码。
3、从机发出认可信号。
4、主机开始发送信息,每发完一字节后,从机发出认可信号给主机。
5、主机发出停止信号。
I2C总线上各信号的具体说明:开始信号:在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,将产生一个开始信号。
停止信号:在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,将产生一个停止信号。
应答信号:既认可信号,主机写从机时每写完一字节,如果正确从机将在下一个时钟周期将数据线(SDA)拉低,以告诉主机操作有效。
在主机读从机时正确读完一字节后,主机在下一个时钟周期同样也要将数据线(SDA)拉低,发出认可信号,告诉从机所发数据已经收妥。
(注:读从机时主机在最后1字节数据接收完以后不发应答,直接发停止信号)。
注意:在I2C通信过程中,所有的数据改变都必须在时钟线SCL为低电平时改变,在时钟线SCL为高电平时必须保持数据SDA信号的稳定,任何在时钟线为高电平时数据线上的电平改变都被认为是起始或停止信号。
作为一种非易失性存储器(NVM),24系列EEPROM使用的很普遍,一般作为数据量不太大的数据存储器。
下面总结一下其应用的一些要点。
从命名上看,24CXX中XX的单位是kbit,如24C08,其存储容量为8k bit,即1k Byte=1024 Byte。
一、工作条件1.工作电压(VCC)24CXX:4.5V-5.5V24CXX-W:2.5V-5.5V24CXX-R:1.8V-5.5V2.输入电平定义(VIH,VIL)VIH:0.7VCC-VCC+1VIL:-0.45V-0.3VCC二、硬件连接1.上拉电阻RP的取值由于I2C总线电容要满足小于400pf的条件。
从以下波形可以看出,上拉电阻越大,总线的电容越小,可以实现的数据传输率就越大,可达400khz。
[点击图片可在新窗口打开]2.写保护脚芯片写保护脚是高电平有效,即WP接高电平时禁止写入3.地址脚24C01/24C02 三个地址脚(E0,E1,E2)都有效,24C04只有E2,E1有效,24C08只有E2有效,24C16三个地址脚都无效,如下图所示,所谓地址脚无效是指不需要接入电路中(NC ,not connected),其对应的地址位要用来表示要操作的字节的高位地址。
[点击图片可在新窗口打开]24C32/24C64三个地址脚都有效;24C128/24C256/24C512的地址脚E1和E0有效,其余为NC;24C1024的地址脚E1有效,其余为NC。
三、寻址方式1.器件地址当总线上连接多个I2C器件时,需要对器件进行寻址。
器件地址如下表所示,其中E2,E1,E0是指三个引脚的状态,取决于是接地还是接高电平,R/W为1则为读操作,为0则为写操作。
A8,A9,A10,A16指的是所要操作的字节地址的高位,后面会提到。
芯片bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit024C01/02/21 1 0 1 0 E2 E1 E0 R/W24C04 1 0 1 0 E2 E1 A8 R/W24C08 1 0 1 0 E2 A9 A8 R/W24C16 1 0 1 0 A10 A9 A8 R/W24C32/64 1 0 1 0 E2 E1 E0 R/W24C128/256/512 1 0 1 0 0 E1 E0 R/W24C1024 1 0 1 0 0 E1 A16 R/W2.字节地址在对芯片内的某一字节或一连续地址进行读写操作时,需要制定其地址或首字节的地址,不同芯片地址有不同的表示方式,如下表所示,其中有些芯片的地址位的高位存储在器件地址中。
芯片地址位数地址范围24C01 bit7-bit0 0x00-0x7F24C02 bit7-bit0 0x00-0xFF24C04 A8,bit7-bit0 0x00-0x1FF24C08 A9,A8,bit7-bit0 0x00-0x3FF24C16 A10,A9,A8,bit7-bit0 0x00-0x7FF24C32 bit15-bit8,bit7-bit0 0x00-0xFFF24C64 bit15-bit8,bit7-bit0 0x00-0x1FFF24C128 bit7-bit0 0x00-0x3FFF24C256 bit7-bit0 0x00-0x7FFF24C512 bit7-bit0 0x00-0xFFFF24C1024 A16,bit15-bit8,bit7-bit0 0x00-0x1FFFF四、读写时序EEPROM一般在电路中做从器件,以下的发送和接收都是针对主器件说明的,开始和结束条件也是由主器件发出。
1、单字节写操作START->发送器件地址->ack->发送字节地址->ack->发送数据->ack-> STOP2、按“页”写操作,“页”是指高位地址一样一组数据,对于24C01/02/04/08/16,一页数据为16字节,一页指高四位地址一样的一组数据。
对于24C32/24C64,一页数据为32字节,一页指高11位地址一样的一组数据。
START->发送器件地址->ack->发送页首地址->ack->发送数据->ack.........-> 发送数据->ack -> STOP3、随机单字节读操作START->发送器件地址(写)->ack->发送字节地址->ack->START->发送器件地址(读)->ack ->接收数据->noack->STOP4、当前单字节读操作,“当前”指的是前面进行过读操作,但是没有STOP,芯片内部“指针”指的字节即为“当前”字节。
START->发送器件地址(读)->ack->接收数据->noack->STOP5、随机连续字节读操作START ->发送器件地址(写)->ack->发送字节首地址->ack->START->发送器件地址(读)-> ack->接收数据->ack->接收数据->ack.........接收数据(最后字节)->noack->STOP6、当前连续字节读操作START->发送器件地址(读)->ack->接收数据->ack->接收数据->ack...............接收数据(最后字节)->noack->STOP关于页写的道理。
A T24Cxx系列的EEPROM为了提高写效率,提供了页写功能,内部有个一页大小的写缓冲RAM,地址范围当然就是从00到一页大小,发生写操作时,开始送入的地址对应的页被选中,并将其内容映像到缓冲RAM,数据从低端地址对应的缓冲RAM地址开始修改,超过这个地址范围就回到00,写完后,就会把开始确定的EEPROM页擦除,再把一整页RAM数据写入。
所有写数据都发生在开始写地址时确定的页上。
如页容量为128,一页都是从00开始按128字节分成一个个的页,0页就是0~7F,1页就是80~FF,类推,边界就是128字节的整数倍地址。
页RAM的地址范围为7位00~7F,写入时高端地址就是页号。
发生写操作,开始送入的地址对应的页被锁存,后续不论写多少,都在这个页中,只是一个页内的地址进行加一,超过就归零开始。
从F0开始写32个字节,那么开始送入的地址为F0,就会锁定在1号页(第2个页)上,底端7位页内部地址开始从70H开始写,到达7F时回到00再到10H,也就是写在了F0~FF,80~8F。
也就是,从01开始写也只能到7F,再往80写就跑到00上去了,这就是写操作的翻卷,datasheet 上都有说明。
就是从边界前写两个字节也要分两次写。
页是绝对的,按整页大小排列,不是从开始写入的地址开始算。
读没有页的问题,可以从任意地址开始读取任意大小数据,只是超过整个存储器容量时地址才回卷。
但一次性访问的数据长度也不要太大。
所以分页的存储器要做好存储器管理,尽量同时读写的数据放在一个页上。
关于页写的道理。
A T24Cxx系列的EEPROM为了提高写效率,提供了页写功能,内部有个一页大小的写缓冲RAM,地址范围当然就是从00到一页大小,发生写操作时,开始送入的地址对应的页被选中,并将其内容映像到缓冲RAM,数据从低端地址对应的缓冲RAM地址开始修改,超过这个地址范围就回到00,写完后,就会把开始确定的EEPROM页擦除,再把一整页RAM数据写入。
所有写数据都发生在开始写地址时确定的页上。
如页容量为128,一页都是从00开始按128字节分成一个个的页,0页就是0~7F,1页就是80~FF,类推,边界就是128字节的整数倍地址。
页RAM的地址范围为7位00~7F,写入时高端地址就是页号。
发生写操作,开始送入的地址对应的页被锁存,后续不论写多少,都在这个页中,只是一个页内的地址进行加一,超过就归零开始。
从F0开始写32个字节,那么开始送入的地址为F0,就会锁定在1号页(第2个页)上,底端7位页内部地址开始从70H开始写,到达7F时回到00再到10H,也就是写在了F0~FF,80~8F。
也就是,从01开始写也只能到7F,再往80写就跑到00上去了,这就是写操作的翻卷,datasheet 上都有说明。
就是从边界前写两个字节也要分两次写。
页是绝对的,按整页大小排列,不是从开始写入的地址开始算。
读没有页的问题,可以从任意地址开始读取任意大小数据,只是超过整个存储器容量时地址才回卷。
但一次性访问的数据长度也不要太大。
所以分页的存储器要做好存储器管理,尽量同时读写的数据放在一个页上。