LPC1788的内部EEPROM使用
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)
{
return 1;
}
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);//清除
return 0;
}
u8 e2prom_write_8(u8 page,u8 addr,u8 value)
{
if(write_8(page,addr,value))return 1;
return e2prom_program(page);
}
u8 e2prom_write_16(u8 page,u8 addr,u16 value)
{
u8 ret;
ret = write_8(page,addr,(u8)(value>>8));
if(ret)return ret;
ret = write_8(page,addr+1,(u8)value);
if(ret)return ret;
return e2prom_program(page);
}
u8 e2prom_write_32(u8 page,u8 addr,u32 value)
{
u8 ret;
ret = write_8(page,addr,(u8)(value>>24));
if(ret)return ret;
ret = write_8(page,addr+1,(u8)(value>>16));
if(ret)return ret;
ret = write_8(page,addr+2,(u8)(value>>8));
if(ret)return ret;
ret = write_8(page,addr+3,(u8)value);
if(ret)return ret;
return e2prom_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)
{
return 1;
}
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);//清除
return 0;
}
u8 e2prom_read_16(u8 page,u8 addr,u16* value)
{
u8 a,b,ret;
ret = e2prom_read_8(page,addr,&a);
if(ret) return ret;
ret = e2prom_read_8(page,addr+1,&b);
if(ret) return ret;
*value = a;
*value<<=8;
*value += b;
return 0;
}
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) return ret;
ret = e2prom_read_8(page,addr+1,&b);
if(ret) return ret;
ret = e2prom_read_8(page,addr+2,&c);
if(ret) return ret;
ret = e2prom_read_8(page,addr+3,&d);
if(ret) return ret;
*value = a;
*value<<=8;
*value += b;
*value<<=8;
*value += c;
*value<<=8;
*value += d;
return 0;
}
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)));
return 0;
}
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 %2x\r\n",a);
printf("read b value is %2x\r\n",b);
printf("read c value is %2x\r\n",c);
printf("read d value is %2x\r\n",d);
e2prom_read_32(1,0,&read);
printf("read 32 value is %8x\r\n",read);
return 0;
}
LPC1788的内部EEPROM使用的更多相关文章
- STM32L系列单片机内部EEPROM的读写
STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已.STM32L的EEPROM使用寿命设计为100 ...
- STC89C52单片机内部EEPROM驱动
STC89C52单片机自身带有4K的存储空间,分为8个扇区,每个扇区512字节,第一扇区起始地址为:0x2000, 结束地址为:21FF, 第八扇区起始地址为0x2E00,结束地址是2FFF #inc ...
- 单片机成长之路(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动
最近又看了一下关于stc单片机的知识,感觉在使用中EEPROM是个经常用到的东西,特地学习了一下,给大家分享一下心得,如有不足,多多包涵,废话不多说,一图解千言,先上图: /*------------ ...
- STC单片机 IAP(EEPROM)的使用
STC89C51.52内部都自带有2K字节的EEPROM,54.55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次 ...
- AT89C51的内部4K flash,
AT89C51的内部4K flash, 是用来下载程序代码的,程序运行时只能做读取数据操作,不能写入.单片机断电时需要候保存数据,可以选择 带EEPROM的单片机 就可以,如STC 系列的单片机有内部 ...
- startup_LPC17XX.s 启动文件分析
工程中startup_LPC17XX.s是M3的启动文件,启动文件由汇编语言写的,它的作用一般是下面这几个: 1)堆和栈的初始化 2)中断向量表定义 3)地址重映射及中断向量表的转移 4)设置系统时钟 ...
- 【驱动】DM9000网卡驱动分析
Preface 内核源码版本:linux-2.6.18 网卡驱动·linux内核网络分层结构:http://infohacker.blog.51cto.com/6751239/122114 ...
- FPGA大公司面试笔试数电部分,看看你会多少
1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系. 答案应该与上面问题一致 [补充]:同步时序逻辑电路的特点:各触发器的时钟端全部连接 ...
- 基于STC12C5A的MINI3216多功能点阵时钟
代码地址如下:http://www.demodashi.com/demo/12862.html 基于STC12C5A的MINI3216多功能点阵时钟 硬件详解 PCB 硬件原理图 主控模块 max72 ...
随机推荐
- div.2/D. As Fast As Possible<数学题,二分>
题目连接 题意: n个学生出去玩,要前进一段距离,租了一辆可以载k个人的车,问到达到目的地的最短时间. cin: n,l,v1,v2,k. £:所有人一起到达终点的时候时间最短. £:所有人走路和坐车 ...
- Android中购物车的全选、反选、问题和计算价格
此Demo主要解决的是购物车中的全选,反选计算价格和选中的条目个数的问题,当选中几条时,点击反选,会把当先选中的变为不选中,把不选中的变为选中.点击全选会全部选中,再次点击时,变为全部不选中. //- ...
- Java传参
1. 如果参数是基本数据类型(int.long等),传值.方法内部改变参数值,外部值不变. 2. 如果参数是对象类型,传地址.方法内部改变对象值,外部对象值改变.但是,如果方法内部调用new重新构 ...
- linker command failed with exit code 1 (use -v to see invocation)修改方法
它的意思是指文件丢失或者文件重复,你就要仔细查看项目中有没有重复的文件,如有重复修改即可,如果是文件丢失,那就麻烦啦!你需要根据报错的地方进行修补文件,最为直接的方法是重新创建项目.还有另外一种情况是 ...
- MYSQL数据库的套接字文件,pid文件,表结构文件
socket文件:当用Unix域套接字方式进行连接时需要的文件. pid文件:MySQL实例的进程ID文件. MySQL表结构文件:用来存放MySQL表结构定义文件. 套接字文件 Unix系统下本地连 ...
- 利用eclipse新建一个maven项目步骤:
1.打开eclipse,左键点击左上角File,选中New,左键点击选中Maven Project,出现下面界面: 2.把打钩的去掉,选择自己项目所在的工作空间,如下图,我建在我的工作空间worksp ...
- MyEclipse8.5安装findbugs方法
step 1:首先从官网下载findbugs插件: edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821.zipstep 2:将解压之后的edu.umd. ...
- SVM阅读资料
1,Andrew Ng机器学习公开课笔记 -- 支持向量机 2,http://blog.pluskid.org/?page_id=683 3,支持向量机SVM(一) 4,机器学习中的算法(2)-支持向 ...
- location对象的属性和方法应用(解析URL)
本文将与大家分享下location对象使用属性和方法来解析URL的实例,感兴趣的朋友可以参考下,希望对你有所帮助 location对象提供了很多属性和方法用来解析URL. 复制代码代码如下: &l ...
- Redis 密码设置和登录
Redis 一般在生产环境中,大家都不使用密码,为了确保安全,都是在防火墙上对redis端口做IP白名单的 我是个技术控,我非得了解一下密码这回事[虽然以后不会用到,呵呵] 好了,废话不多说,简单介绍 ...