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使用的更多相关文章

  1. STM32L系列单片机内部EEPROM的读写

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

  2. STC89C52单片机内部EEPROM驱动

    STC89C52单片机自身带有4K的存储空间,分为8个扇区,每个扇区512字节,第一扇区起始地址为:0x2000, 结束地址为:21FF, 第八扇区起始地址为0x2E00,结束地址是2FFF #inc ...

  3. 单片机成长之路(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动

    最近又看了一下关于stc单片机的知识,感觉在使用中EEPROM是个经常用到的东西,特地学习了一下,给大家分享一下心得,如有不足,多多包涵,废话不多说,一图解千言,先上图: /*------------ ...

  4. STC单片机 IAP(EEPROM)的使用

    STC89C51.52内部都自带有2K字节的EEPROM,54.55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次 ...

  5. AT89C51的内部4K flash,

    AT89C51的内部4K flash, 是用来下载程序代码的,程序运行时只能做读取数据操作,不能写入.单片机断电时需要候保存数据,可以选择 带EEPROM的单片机 就可以,如STC 系列的单片机有内部 ...

  6. startup_LPC17XX.s 启动文件分析

    工程中startup_LPC17XX.s是M3的启动文件,启动文件由汇编语言写的,它的作用一般是下面这几个: 1)堆和栈的初始化 2)中断向量表定义 3)地址重映射及中断向量表的转移 4)设置系统时钟 ...

  7. 【驱动】DM9000网卡驱动分析

    Preface    内核源码版本:linux-2.6.18    网卡驱动·linux内核网络分层结构:http://infohacker.blog.51cto.com/6751239/122114 ...

  8. FPGA大公司面试笔试数电部分,看看你会多少

    1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系. 答案应该与上面问题一致 [补充]:同步时序逻辑电路的特点:各触发器的时钟端全部连接 ...

  9. 基于STC12C5A的MINI3216多功能点阵时钟

    代码地址如下:http://www.demodashi.com/demo/12862.html 基于STC12C5A的MINI3216多功能点阵时钟 硬件详解 PCB 硬件原理图 主控模块 max72 ...

随机推荐

  1. RMQ 详解

    RMQ(Range Minimum/Maximum Query)问题:RMQ问题是给定一个区间,求这个区间中的最大或最小值的问题 RMQ采用动态规划的思想来求解:(st算法:Square Table) ...

  2. Ubuntu下安装Node.js

    下载Linux Binaries (.tar.gz)二进制包 解压 重命名为node 移动到/usr/local/目录下 创建软连接 ln -s /usr/local/node/bin/node   ...

  3. Chapter 1 First Sight——20

    After two classes, I started to recognize several of the faces in each class. 两节课之后,我开始记住了每节课的那几张脸. ...

  4. zendstudio的安装与配置

    <微信公众平台应用开发实战>第1章搭建开发环境和相关技术介绍,本章会先介绍微信公众平台的一些基本概念和公众平台的开发模式:然后讲解如何搭建开发环境—AppServ和zendstudio:然 ...

  5. LayoutInflater 类的使用

    转 http://yxwang0615.iteye.com/blog/1711147 一个Activity里如果直接用findViewById(),对应的是setConentView()的那个layo ...

  6. postgres 错误duplicate key value violates unique constraint 解决方案

    SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename)+1) 主要是:serial key其实是由sequence实现的,当 ...

  7. javascript 中{}和[] 的理解

    下面的一段解释是摘抄的,基本理解正确,做个记录.其实js中数组其实就是对象,typeof(['a', 'b', 'c'])//测试之后结果为 :  "object" 一.{ } 大 ...

  8. OpenGL学习-------visual studio 2010配置和第一个OpenGL程序讲解

    OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenG ...

  9. 【记录】haphost免费vps初始配置

    1.配置德国epel源 yum install yum-priorities rpm -Uvh http://ftp-stud.hs-esslingen.de/pub/epel/6/i386/epel ...

  10. inotify-java linux系统监听文件发生变化,实时通知java程序

    1 Overview     最近公司的一个任务需要实时监控文件系统中某个文件的内容变化.由于程序本身由Java编写,因此使用了inotify- java(http://code.google.com ...