当前位置:首页 > 单片机 > 单片机
[导读]Lpc1788内置有eeprom使用代码#ifndef __E2PRONINCHIP_H_#define __E2PROMINCHIP_H#include "common.h"#include "sys.h"#include "debugserial.h"#define EEPROM_CLOCK 375000void e2prom_init(void);u8 e2prom_write

Lpc1788内置有eeprom

使用代码

#ifndef __E2PRONINCHIP_H_

#define __E2PROMINCHIP_H

#include "common.h"

#include "sys.h"

#include "debugserial.h"

#define EEPROM_CLOCK 375000

void e2prom_init(void);

u8 e2prom_write_8(u8 page,u8 addr,u8 value);

u8 e2prom_write_16(u8 page,u8 addr,u16 value);

u8 e2prom_write_32(u8 page,u8 addr,u32 value);

u8 e2prom_read_8(u8 page,u8 addr,u8*value);

u8 e2prom_read_16(u8 page,u8 addr,u16*value);

u8 e2prom_read_32(u8 page,u8 addr,u32*value);

u8 e2prom_program(u8 page);

u8 e2prom_test(void);

#endif

#include "e2prominchip.h"

//有一些寄存器只能写不能读,用起来的时候要小心& "子类的应用,如果发生总线中断可能是这些因素引起的

//eeprom有一个64的页缓存,写入的时候不需要页地址只需要页偏移地址先写到这个页里面

//然后写入页地址,也缓存直接写入整个页面(应该是匹配 不同 写入)

void e2prom_init(void)

{

u32 val;

LPC_EEPROM->PWRDWN=0x00;//清除掉电

LPC_EEPROM->CLKDIV=((u16)(SystemCoreClock/EEPROM_CLOCK))-1;//设置时钟

val=((((SystemCoreClock/1000000)*15)/1000)+1);

val|=(((((SystemCoreClock/1000000)*55)/1000)+1)<<8);//设置等待时间 NS级别

val|=(((((SystemCoreClock/1000000)*35)/1000)+1)<<16);

LPC_EEPROM->WSTATE=val;

LPC_EEPROM->INT_CLR_STATUS=(1<<26)|(1<<28);//清除中断状态

// LPC_EEPROM->INT_CLR_ENABLE = (1<<26)|(1<<28);//关闭中断

}

static u8 write_8(u8 page,u8 addr,u8 value)

{

u16 dataddr=0;

if(page>=64||addr>=64)

{

return1;

}

dataddr=(addr&0x3f);

LPC_EEPROM->ADDR=dataddr;//写入地址

LPC_EEPROM->CMD=3;//非连续八位写入

LPC_EEPROM->INT_CLR_STATUS=(1<<26)|(1<<28);//清除中断状态

LPC_EEPROM->WDATA=value;

while(!(LPC_EEPROM->INT_STATUS&(1<<26)));//等待写入完成

LPC_EEPROM->INT_CLR_STATUS=(1<<26);//清除

return0;

}

u8 e2prom_write_8(u8 page,u8 addr,u8 value)

{

if(write_8(page,addr,value))return1;

returne2prom_program(page);

}

u8 e2prom_write_16(u8 page,u8 addr,u16 value)

{

u8 ret;

ret=write_8(page,addr,(u8)(value>>8));

if(ret)returnret;

ret=write_8(page,addr+1,(u8)value);

if(ret)returnret;

returne2prom_program(page);

}

u8 e2prom_write_32(u8 page,u8 addr,u32 value)

{

u8 ret;

ret=write_8(page,addr,(u8)(value>>24));

if(ret)returnret;

ret=write_8(page,addr+1,(u8)(value>>16));

if(ret)returnret;

ret=write_8(page,addr+2,(u8)(value>>8));

if(ret)returnret;

ret=write_8(page,addr+3,(u8)value);

if(ret)returnret;

returne2prom_program(page);

}

u8 e2prom_read_8(u8 page,u8 addr,u8*value)

{

u16 dataddr=0;

LPC_EEPROM->INT_CLR_STATUS=(1<<26)|(1<<28);//清除中断状态

if(page>=64||addr>=64)

{

return1;

}

dataddr=page;

dataddr<<=6;

dataddr|=(addr&0x3f);

LPC_EEPROM->ADDR=dataddr;//写入地址

LPC_EEPROM->CMD=0;//非连续八位读出

while(!(LPC_EEPROM->INT_STATUS&(1<<26)));//等待读出完成

*value=LPC_EEPROM->RDATA;

LPC_EEPROM->INT_CLR_STATUS=(1<<26);//清除

return0;

}

u8 e2prom_read_16(u8 page,u8 addr,u16*value)

{

u8 a,b,ret;

ret=e2prom_read_8(page,addr,&a);

if(ret)returnret;

ret=e2prom_read_8(page,addr+1,&b);

if(ret)returnret;

*value=a;

*value<<=8;

*value+=b;

return0;

}

u8 e2prom_read_32(u8 page,u8 addr,u32*value)

{

u8 a,b,c,d,ret;

ret=e2prom_read_8(page,addr,&a);

if(ret)returnret;

ret=e2prom_read_8(page,addr+1,&b);

if(ret)returnret;

ret=e2prom_read_8(page,addr+2,&c);

if(ret)returnret;

ret=e2prom_read_8(page,addr+3,&d);

if(ret)returnret;

*value=a;

*value<<=8;

*value+=b;

*value<<=8;

*value+=c;

*value<<=8;

*value+=d;

return0;

}

u8 e2prom_program(u8 page)

{

u16 dataddr=0;

LPC_EEPROM->INT_CLR_STATUS=(1<<28);//清除编程中断

dataddr=(page&0x1f);

dataddr<<=6;

LPC_EEPROM->ADDR=dataddr;//写入地址

LPC_EEPROM->CMD=6;//编程指令

while(!(LPC_EEPROM->INT_STATUS&(1<<28)));

return0;

}

u8 e2prom_test(void)

{

u8 a,b,c,d;

u32 read;

e2prom_write_32(1,0,0xaabbccdd);

e2prom_read_8(1,0,&a);

e2prom_read_8(1,1,&b);

e2prom_read_8(1,2,&c);

e2prom_read_8(1,3,&d);

printf("read a value is %2xrn",a);

printf("read b value is %2xrn",b);

printf("read c value is %2xrn",c);

printf("read d value is %2xrn",d);

e2prom_read_32(1,0,&read);

printf("read 32 value is %8xrn",read);

return0;

}


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

  引 言   近年来,由于我国社会经济的快速发展和人们生活方式的转变,心血管病发病率及相关危险因素呈不断上升趋势,人们也越来越注意自己的身心健康。过去测量血压必须到医院,由医生用水银血

关键字: 电子血压计 脉搏波 lpc1788 s0012a

单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。

关键字: stc89c52rc 内部eeprom 单片机

STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已。STM32L的EEPROM使用寿命设计为100000次擦写以上...

关键字: 内部eeprom 单片机 stm32l系列

/************************************************PIC16F877A 内部EEPROM读写实验*******Author:hnrainDate:2010-12-26Ver...

关键字: pic16f877a 内部eeprom 内部函数 读写实验

#ifndef __MYIIC_H_#define __MYIIC_H_#include "common.h"#include "delay.h"#include "de...

关键字: io口 lpc1788 模拟iic

STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下IS...

关键字: 51单片机 内部eeprom 读写

首先是gpio中断,这一点和1768不同,1768使用的中断时和eint3共用中断通道,到了1788,专门为gpio开辟了中断#ifndef __JOYPAD_H_#define __JOYPAD_H_#include...

关键字: lpc1788 外部中断 gpio中断

#ifndef __DEBUGSERIAL_H_#define __DEBUGSERIAL_H_#include "sys.h"#include "stdio.h"extern u...

关键字: lpc1788 串口通讯

#ifndef __LCD_H_#define __LCD_H_#include "common.h"#include "debugserial.h"#include "...

关键字: lpc1788 lcd接口 驱动真彩屏

Norflash型号为sst39vf32#ifndef __NORFLASH_H_#define __NORFLASH_H_#include "common.h"#include "dela...

关键字: lpc1788 emc驱动norflash
关闭
关闭