AVR使用范例--EEPROM使用详解
AVR单片机IIC读写范例IIC.C 或者IIC.H

资料简介:本程序简单的示范了如何使用ATMEGA16的TWI 读写AT24C02 IIC EEPROM TWI协议(即IIC协议,请认真参考IIC协议的内容,否则根本就不能掌握)一主多从的应用,M16作主机(M16做从机和多主多从的应用不多,请自行参考相关文档)中断模式(因为AVR的速度很高,而IIC的速度相对较低,采用查询模式会长时间独占CPU,令CPU的利用率明显下降。
特别是IIC速度受环境影响只能低速通讯时,对系统的实时性产生严重的影响。
查询模式可以参考其它文档和软件模拟IIC的文档)AT24C02/04/08的操作特点出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器*/#include <avr/io.h>#include <avr/signal.h>#include <avr/interrupt.h>#include <avr/delay.h>//时钟定为外部晶振7.3728MHz,F_CPU=7372800#include <compat/twi.h>//定义了各种模式下的状态码列表(TWSR已屏蔽预分频位),本文后面附上中文描述//管脚定义#define pinSCL0//PC0 SCL#define pinSDA1//PC1 SDA//为保险起见,最好在SCL/SDA接上1~10K的外部上拉电阻到VCC。
#define fSCL100000//TWI时钟为100KHz//预分频系数=1(TWPS=0)#if F_CPU < fSCL*36#define TWBR_SET 10;//TWBR必须大于等于10#else#define TWBR_SET(F_CPU/fSCL-16)/2;//计算TWBR值#endif#define TW_ACT(1<<TWINT)|(1<<TWEN)|(1<<TWIE)//TWCR只能IN/OUT,直接赋值比逻辑运算(|= &=)更节省空间#define SLA_24CXX0xA0//24Cxx系列的厂商器件地址(高四位)#define ADDR_24C020x00// AT24C02的地址线A2/1/0全部接地,SLAW=0xA0+0x00<<1+0x00,SLAR=0xA0+0x00<<1+0x01 //TWI_操作状态#define TW_BUSY0#define TW_OK 1#define TW_FAIL 2//TWI_读写命令状态#define OP_BUSY0#define OP_RUN 1//TWI读写操作公共步骤#define ST_FAIL0//出错状态#define ST_START1//START状态检查#define ST_SLAW2//SLAW状态检查#define ST_WADDR3//ADDR状态检查//TWI读操作步骤#define ST_RESTART4//RESTART状态检查#define ST_SLAR5//SLAR状态检查#define ST_RDATA6//读取数据状态检查,循环n字节//TWI写操作步骤#define ST_WDATA7//写数据状态检查,循环n字节#define FAIL_MAX20//重试次数最大值//定义全局变量unsigned char ORGDATA[8]={0xAA,0xA5,0x55,0x5A,0x01,0x02,0x03,0x04};//原始数据unsigned char CMPDATA[8];//比较数据unsigned char BUFFER[256];//缓冲区,可以装载整个AC24C02的数据struct str_TWI//TWI数据结构{volatile unsigned char STATUS;//TWI_操作状态unsigned char SLA;//从设备的器件地址unsigned int ADDR;//从设备的数据地址unsigned char*pBUF;//数据缓冲区指针unsigned int DATALEN;//数据长度unsigned char STATE;//TWI读写操作步骤unsigned char FAILCNT;//失败重试次数};struct str_TWI strTWI;//TWI的数据结构变量//仿真时在watch窗口,监控这些全局变量。
AVR内部EEPROM读写实验

A VR内部EEPROM读写实验片内EEPROM读写实险。
1、用内部EEPROM记录CPU启动次数,并在PB 口上显示出来。
2、内部1 M晶振,程序采用单任务方式,软件延时。
3、进行此实验请插上JP1的所有8个短路块,JP7(LED_EN)短路块。
4、通过此实验,可以对对内部EEPROM 有个初步认识,了解EEPROM函数的操作。
5、可过复位键让系统重启,这样就可以更新显示了。
*/#include iom16v.h/*延时函数*/void delay_ms(unsigned char i) {unsigned char a, b;for (a = 1; a i; a++) { for (b = 1; b; b++) { ; } }}/*EEPROM读取函数*//*addr:地址;number:长度;p_buff:读出数据存放指针*/void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {while(EECR (1 EEWE));EEARH = 0x00;while(number --) { EEARL = addr ++; EECR |= (1 EERE); *p_buff++ = EEDR; }}/*EEPROM写入函数*//*addr:地址;number:长度;p_buff:写入数据存放指针*/void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {EEARH = 0x00;while(number --) { while(EECR (1 EEWE)); EEARL = addr ++; EEDR = *p_buff ++; EECR |= (1 EEMWE); EECR |= (1 EEWE); }}/*主函数*/void main(void) {unsigned char temp;DDRA = 0x00; /*方向输入*/PORTA = 0xFF; /*打开上拉*/DDRB = 0xFF; /*方向输出*/PORTB = 0xFF; /*电平设置*/DDRC = 0x00;PORTC = 0xFF;DDRD = 0x00;PORTD = 0xFF;delay_ms(250); /*启动延时*/eprom_read(0x10, 0x01, temp); /*读出记录*/PORTB = ~temp; /*显示记录*/temp ++; /*刷新记录*/eprom_write(0x10, 0x01, temp); /*写入记录*/while (1) { ; }}。
AVR单片机教程19—第十九课 ATMEAG16L的内部EEPROM读写编程

——————————————————————————第十九课ATMEAG16L的内部EEPROM读写编程本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买!11.1 ATMEAG16L的内部EEPROMATmegal6L单片机片内有512个字节的EEPROM,它作为一个独立的数据空间存在。
ATmegal6L的EEPROM采用独立线性编址,其地址范围为0~511。
ATmegal6L通过对相关单片机培训寄存器的操作实现对EEPROM按字节进行读写。
ATmegal6L的EEPROM至少可以擦写100000次。
ATmegal6L的EEPROM的写入时间约花数毫秒,取决于VCC的电压。
电源电压越低,写周期越长。
11.2 与EEPROM相关的寄存器——————————————————————————l.EEPROM地址寄存器—EEARH、EEARLEEPROM地址寄存器EEARH、EEARL用于指定某个EEPROM单元的地址。
512个字节的EEPROM线性编址为0~511。
地址寄存器EEARH、EEARL可读可写,初始值没有定义,访问前必须赋予正确的地址。
2.EEPROM数据寄存器—EEDREEPROM数据寄存器EEDR用于存放即将写入EEPROM或者从EEPROM读出的某个单元的数据。
写入或者读出的地址由EEPROM的地址寄存器EEARH、EEARL给出。
EEPROM按字节进行读写。
EEPROM数据寄存器EEDR可读可写,初始值为0x00。
3.EEPROM控制寄存器—EECR——————————————————————————EEPROM控制寄存器EECR用于控制单片机对EEPROM的操作。
位7~4:保留位。
读这些位时总为0。
位3:EERIE位为EEPROM中断准备好使能位。
AVR单片机内部EEPROM应用方法

AVR 单片机内部EEPROM 应用方法
AVR 单片机内部集成了EEPROM,但是在GCC 写编写EEPROM 应用
程序的时候,经常会出现读写EEPROM 时程序出错,或重启等不正常现象。
在软件仿真时也许结果是正确的,但是在片上运行的时候就不正常。
困扰很
久,终于发现原因在于编译器,已经我们对EEPROM 操作说明的理解不正确
或不仔细。
操作EEPROM 对时序的要求较高。
更加Datasheet 里的写操作范例程序:while(EECR & (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
EECR |= (1
EECR |= (1 以上代码在GCC 中的编译结果,发现EECR |= (1while(EECR & (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
asm volatile(SBI 0x1C,2 \n\t);
asm volatile(SBI 0x1C,1 \n\t);。
AVR单片机EEPROM读写过程

EEPROM: 单片机内部可用软件读写的数据存储空间,掉电后数据不丢失,可擦写10万次。
ATmega16 内部有512字节的EEPROM数据空间,地址空间由0-511,由EEPROM 地址寄存器EEAR指定,数据寄存器EEDR用于存储要读写的数据。
写操作步骤:
一、查询上一个数据是否写完:while (EECR&(1<<EEWE)) ; //如果EEWE位为1,就在原地等待
二、将要写如数据的地址送到EEAR: EEAR=address(范围0-0x1ff) ;
三、把要写入的数据送到EEDR: EEDR=data;
四、主机写入允许:EECR|=(1<<EEMWE);
五、启动写入:EECR|=(1<<EEWE);
读操作步骤:
一、等待上一个数据写完:while(EECR&(1<<EEWE));
二、指定要读出数据的地址:EEAR=adress;
三、使能读:EECR|=(1<<EERE);
四、从EEDR中读取数据:data=EEDR;
小企鹅diy 科学探究学习网
更多文章转到/wqb_lmkj/blog文章分类单片机。
AVR单片机内部EEPROM方法

AVR单片机内部EEPROM方法/**************************************************************;eeprom.c 在AVR单片机中可以用在ATMEGA16和ATMEGA8中都可以用,在GCC下;编译通过。
09年11月1号! 陈永飞已测试过!;读/写atmega8515内部EEPROM的例子;将数据0....9写入eeprom中,再读出用数码管显示出来***************************************************************/#include ;#include ;#define uchar unsigned char#define uint unsigned int#define Hidden 16ucharDispTab[17]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; uchar BitTab[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};uchar DispBuf[6]; //显示缓冲区 unsigned char Counter=0; void io_init(void){// PortAPORTA = 0xff;DDRA = 0xff;// PortBPORTB = 0x0;DDRB = 0x0;// PortCPORTC = 0xfc;DDRC = 0xfc;// PortDPORTD = 0x0;DDRD = 0x0;}void mDelay(uint DelayTim) {uint i;for(;DelayTim>;0;DelayTim--) {for(i=0;i;=6)i=0;PORTC=0xff; //关闭显示tmp=DispBuf[i];PORTA=DispTab[tmp];tmp=BitTab[i];PORTC=tmp;mDelay(1); //延时1ms}int main(void){unsigned int Count=0;unsigned char Addr=1; //向地址1里面写数字uint8_t temp=0;io_init();DispBuf[0]=Hidden;DispBuf[1]=Hidden;DispBuf[2]=Hidden;DispBuf[3]=Hidden;DispBuf[4]=0; //次低位显示0while(1){temp=eeprom_read_byte (Addr);DispBuf[5]=temp;if(++Count==1000){Count=0;Counter++;eeprom_write_byte(Addr,Counter); }if(Counter>;=10)Counter=0; //计数值在0~9之间循环disp(); //调用显示程序}}。
eeprom使用的流程

EEPROM使用的流程1. 简介EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种特殊的非易失性存储器,可以通过电子擦除的方式对其中的数据进行修改。
EEPROM 的使用可以在许多应用中存储重要的配置信息或用户数据,并在需要时进行读取、修改和擦除。
2. EEPROM流程概述使用EEPROM时,通常需要遵循以下基本流程:1.初始化EEPROM2.写入数据到EEPROM3.从EEPROM中读取数据4.擦除EEPROM中的数据下面将详细介绍每个流程的步骤和注意事项。
3. 初始化EEPROM在使用EEPROM之前,需要对其进行初始化。
初始化的过程可以包括确定EEPROM的地址、设置相关的控制寄存器等操作。
以下是初始化EEPROM的一般步骤:•确定EEPROM的地址:根据硬件设计和连线的方式,确定EEPROM 的地址。
通常情况下,EEPROM都会有一个唯一的I2C地址,可以通过连接敏感引脚或编程进行设置。
•设置控制寄存器:根据EEPROM的型号和规格,设置相关的控制寄存器。
这些寄存器可以包括写使能、擦除使能、写保护等设置。
根据具体的硬件平台和开发工具,设置方法可能会有所不同。
•验证初始化:在进行后续的写入和读取操作之前,需要验证EEPROM的初始化是否成功。
这可以通过读取控制寄存器的值或执行简单的读取操作来实现。
4. 写入数据到EEPROM一旦EEPROM初始化完成,可以开始向其中写入数据了。
写入数据到EEPROM通常需要注意以下几个步骤:•选择写入的地址:根据EEPROM的规格和需求,选择要写入数据的地址。
EEPROM通常被分为多个字节或页面,每个页面都有其唯一的地址。
•编写写入算法:根据需要,编写适合特定EEPROM型号的写入算法。
这些算法可能包括将数据按字节或页面写入EEPROM、校验写入的数据等操作。
根据具体的硬件平台和开发工具,写入算法可能会有所不同。
arm eeprom编程

EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种可以通过电子方式擦除和编程的非易失性存储器。
在ARM微控制器上,通常使用内置的EEPROM模块或外部EEPROM芯片来存储数据。
下面是一个简单的示例,演示如何在ARM微控制器上编程EEPROM。
1.硬件连接首先,需要将EEPROM芯片连接到微控制器的I/O引脚上。
通常,EEPROM芯片会有一些特定的引脚用于数据输入/输出、地址选择和擦除/编程控制。
根据EEPROM芯片的数据手册,将相应的引脚连接到微控制器的相应I/O引脚上。
2.配置微控制器在编程EEPROM之前,需要配置微控制器的一些参数,例如I/O引脚的工作模式、时钟频率等。
根据EEPROM芯片的数据手册,设置微控制器的一些特定寄存器。
3.EEPROM编程函数下面是一个简单的示例EEPROM编程函数的代码:c复制代码#include<stdio.h>#include<stdint.h>#include"eeprom.h"// EEPROM库的头文件void eeprom_write(uint32_t address, uint8_t data) {// EEPROM编程函数,写入单个字节的数据// 具体实现取决于使用的EEPROM库和微控制器型号eeprom_write_byte(address, data); // 使用库函数将数据写入EEPROM }int main() {uint32_t address = 0x0000; // EEPROM地址uint8_t data = 0x12; // 要写入的数据eeprom_write(address, data); // 调用EEPROM编程函数return0;}在这个示例中,eeprom_write()函数是用来写入单个字节数据的函数,它的实现取决于所使用的EEPROM库和微控制器型号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本页详细介绍ICC自带EEPROM操作函数的操作方法,包括单字符读写,数组读写,结构体读写。
程序代码:下载相关文件
∙void main(void)
∙{
∙ unsigned char temp1,temp2; /*定义变量*/∙ unsigned char buffer[10]; /*定义数组*/∙ unsigned char buf[]="AVR与虚拟仪器"; /*定义字符串*/∙
∙ EEPROMwrite(0x10,'a'); /*单字符写入到0x10,注意是单引号*/
∙ temp1 = EEPROMread(0x10); /*读一个字符到temp1*/
∙
∙
∙ EEPROM_WRITE(0x20,"abcdefg"); /*写字符串到0x20*/
∙ EEPROM_READ(0x20,temp2); /*读字符到temp2,temp2=a*/
∙ EEPROM_READ(0x20,buffer); /*读字符串到数组中 buffer[10]=abcdefg */
∙
∙ EEPROM_WRITE(0x30,buf); /*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/
∙
∙ while(1)
∙ ;
∙}
∙
调试后的效果:
调试eeprom的时候,记住设置Avr studio保护eeprom数据,否则每次都会将eeprom中的数据改为0xFF。
如下图:
打开调试选项:
钩选保护eeprom数据选项:
打开相关观测窗口:
按F10逐条语句运行,查看运行结果。
1. 地址10上的值被改写为“a”
2. temp1的值变为a,及读取了地址0x10的值a:
3. abcdefg写入20开始的地址:
4. temp2的变为地址20的值a:
5. 以0x20开始的值都读入buffer数组中:
6. 预定义的数组中的值写到EEPROM中:
7. 设置不保护EEPROM的值之后,停止调试再开始调试,EEPROM中的值改为0XFF:
通过以上的观察,我想你已经对EEPROM的操作有了一定的认识,同时,你可以打开eeprom.h查看内部内容,是如何定义函数的。
结构体的操作方法与数组类似:(一般简单应用中,你用不到下面的知识,看不懂没有关系,不要被吓倒了)
∙EEPROMWriteBytes(0x10,&red_flag,sizeof(red_flag)); //将结构写入EEPROM
∙EEPROMReadBytes(0x10,&red_flag,sizeof(red_flag)); //从EEPROM中将结构全部读出来
∙旗帜的结构为
∙/*
∙typedef struct
∙{
∙uint8 position; //0 底 1~180:中间 180:顶
∙uint8 fangxiang; //0 静止中 'u' : 向上 'd':向下
∙uint8 T; //0 总时间
∙uint8 t; //0 已经耗去的时间
∙uint8 S; //0 目标路程
∙uint8 s; //0 已经走过的路程
∙uint8 move_flag; //0 是否运动中
∙uint8 half_mode; //0 非半旗 1:半旗
∙uint8 purse; //0 没有暂停 1:暂停状态
∙uint8 half_short_or_long;//0 1:半旗长路程中 2:半旗短路程中∙uint16 maichong; //0 脉冲数目
∙}QIZHI;
∙QIZHI red_flag; //旗帜结构
*/。