单片机EEPROM读写程序
24C02读写程序
HT49 MCU系列单片机读写HT24系列的EEPROM应用范例HT49 MCU系列单片机读写HT24系列的EEPROM应用范例文件编码:HA0017s简介:HT24系列的EEPROM是通过I2C协议控制其读写的。
HT49系列单片机的接口部分是简单I/O 口,可以用来很方便地采用I2C协议控制周边器件。
HT24系列的EEPROM总共8个管脚,三个为芯片地址脚A0、A1、A2,在单片机对它进行操作时,从SDA输入A0、A1、A2数据和芯片外部A0、A1、A2所接地址需一一对应。
一个为芯片写保护脚WP,WP脚接低电平时,芯片可进行读写操作;WP脚接高时,芯片只可进行读,不可进行写。
另外两个管脚为电源脚VCC,VSS。
用单片机对HT24系列的EEPROM进行控制时,HT24系列的EEPROM的外部管脚VCC、VSS、WP、A0、A1、A2根据需要,对应接上,SDA、SCL接到单片机控制脚上。
引脚名称I/O 功能描述A0~A2 I地址输入VSS I电源负极输入SDA I/O串行数据输入/输出SCL I串行数据传送时钟信号输入WP I写保护VCC I电源正极输入HT24系列的EEPROM根据型号不同,EEPROM的容量大小不同,当EEPROM的空间大于1页(256bytes)时,即大于2048bits,则HT49 MCU需要控制A0、A1、A2来确定写HT24系列的EEPROM的第几页,HT24系列的EEPROM空间大小如下表所示:型号引脚A0、A1及A2使用方法容量大小HT24LC02 A0、A1、A2引脚作为器件地址输入,从SDA输入A0、A1、A2数据和芯片引脚A0、A1、A2所接状态需一一对应2K(256×8)HT24LC04 A1、A2引脚作为器件地址输入,从SDA输入A1、A2数据和芯片引脚A1、A2所接状态需一一对应,A0引脚浮空4K(512×8,2pages)HT24LC08 A2引脚器件地址输入,从SDA输入A2数据和芯片引脚A2所接状态需一一对应,其余引脚浮空8K(1024×8,4pages)HT24LC16 A0、A1、A2全部浮空,不必接16K(2048×8,8pages)HT49 MCU系列单片机读写HT24系列的EEPROM应用范例程式说明:本文是以HT49R30A-1控制HT24LC04为例的。
stc单片机eeprom读写程序
stc单片机eeprom读写程序以下是STC单片机使用EEPROM进行读写的示例程序:#include <reg52.h>#include <intrins.h>#define EEPROM_ADDR 0xA0 // EEPROM的I2C地址sbit SDA = P2^0; // I2C的数据线sbit SCL = P2^1; // I2C的时钟线// I2C开始信号void I2C_Start(){SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 0;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C停止信号void I2C_Stop(){SDA = 0;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 1;_nop_(); // 延时一段时间}// I2C发送一个字节的数据void I2C_SendByte(unsigned char dat){unsigned char i;for (i = 0; i < 8; i++){SDA = dat & 0x80; // 获取最高位dat <<= 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C接收一个字节的数据unsigned char I2C_ReceiveByte(){unsigned char i, dat = 0;SDA = 1;for (i = 0; i < 8; i++){_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间dat <<= 1;dat |= SDA;SCL = 0;}return dat;}// 在EEPROM中写入一个字节的数据void EEPROM_WriteByte(unsigned char addr, unsigned char dat) {I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令I2C_SendByte(addr); // 发送地址I2C_SendByte(dat); // 发送数据I2C_Stop();}// 从EEPROM中读取一个字节的数据unsigned char EEPROM_ReadByte(unsigned char addr){unsigned char dat;I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令 I2C_SendByte(addr); // 发送地址I2C_Start();I2C_SendByte(EEPROM_ADDR | 1); // 发送读取指令 dat = I2C_ReceiveByte(); // 读取数据I2C_Stop();return dat;}。
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 读写操作。
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的地址匹配,否则无法进行有效的读写操作。
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文章分类单片机。
51单片机EEPROM的读写
51单片机EEPROM的读写D#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。
单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写
单片机程序设计实践教程_第17章_EEPROM器件AT24C02
读写
本章主要介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
EEPROM是一种非易失性存储器,可以在电源关闭后保持数据的存储,适用于存储一些关键的配置信息或数据。
首先,需要连接单片机与AT24C02,常见的连接方式有两根数据线(SDA和SCL),两根线分别连接到单片机的I2C总线接口上。
在进行读写操作之前,需要进行初始化,设置相关的参数,如器件地址、时钟频率等。
然后,可以使用相应的读写函数对AT24C02进行读写操作。
对于读操作,需要指定读取的地址和数据长度。
可以使用一个循环来
连续读取多个数据,也可以单独读取一些地址上的数据。
读取的数据保存
在单片机的缓存中,可以根据需要进行处理或显示。
对于写操作,同样需要指定写入的地址和数据。
可以通过循环连续写
入多个数据,也可以单独写入一些地址上的数据。
写入操作完成后,要记
得进行等待,等待数据写入完成。
需要注意的是,AT24C02有一定的写入周期,写入速度较慢。
因此,
在进行连续写入操作时,需要考虑到写入速度,避免写入过快导致数据丢
失或写入错误。
本章还介绍了一些常见的应用场景,如存储温度、湿度等传感器数据,存储用户配置信息等。
总的来说,本章介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
通过实践这些内容,可以更好地掌握EEPROM的应用和使用方法,为后续的项目实践提供参考。
51单片机读写内部EEPROM详解
程序2:
/***************************************************************
作品:EEPROM实验,开机还原关电前LED的亮灭状况
单片机:STC89C52RC
晶振:12M
编译环境:Keil uVision4 V9.00
***************************************************************/
#define uchar unsigned char
#define uint unsigned int
/****************特殊功能寄存器声明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
{
uchar V;
V = dcx(0x2002);// 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况
if(V == 2){LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
LED1=0;LED2=1;
V = dcx(0x2002);// 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况
if(V == 2){LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
dsPIC30F6014内部EEPROM读写C程序设计及其应用
# d e f i n e _ E E D A T A ( N ) N V M C O N 的 W R 位,等待完成
__attribute__((section(".eedata,r"),aligned(N)))
}
例如,要在 EEPROM 中存放 0x0000 ̄0xF000 16
烧写数据到 E E P R O M
用于读写 EEPROM 存储器的 4 个特殊功能寄存器 SFR(Special Function Register)是:
· NVMCON · NVMADR · NVMADRU · NVMKEY NVMCON 寄存器控制要擦除的块,要烧写的存储 器类型以及烧写周期的起始时刻。 NVMADR 寄存器用于保持有效地址的低两位,捕 捉执行过的末尾表指令的EA[15:0]位并选择要写的行。 N V M A D R U 寄存器用于保持有效地址的高两位, 捕捉执行过的末尾表指令的 EA[23:16]位。 NVMKEY 寄存器是只写寄存器,用于写保护。在 开始写或者擦除操作时,用户必须连续的写 0x55 和 0 x A A 到 N V M K E Y 寄存器。 dsPIC30F6014 内部 EEPROM 存储器允许读写单个 字或者含有 1 6 个字的块, 寄存器 N V M A D R 和 N V M A D R U 用于访问 EEPROM 的地址,指令 T B L R D L 和 T B L W T L 用于对 E E P R O M 的读写。在相应的 EEPROM 存储器位置做擦除操作后必须执行写保护, 写保护通常需要 2ms 时间来完成。在对 EEPROM 进行 擦除操作时,用户不能同时对 EEPROM 进行读和写。
97 2005.11 电子产品世界
设计天地
24C16的EEPROM的读写程序
24C16规范的51读写C文件(开发板程序之一)/*I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率400kbps。
各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。
这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
目前有很多半导体集成电路上都集成了I2C接口。
*//********************************************************************** ******** (C) Copyright 2007,单片机初学者园地* All Rights reserved.***项目名称: 51单片机学习开发系统***本文件名称:IIC.c** 完成作者:单片机初学者* 当前版本: V1.0* 完成日期:* 描述:本程序结构简单、合理,有帮助于初学者养成良好的编* 程风格。
51单片机读写内部EEPROM详解
#define uchar unsigned char
#define uint unsigned int
特殊功能寄存器声明****************
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
uchar dat;
ISP_CONTR=0x81;
ISP_CMD= 0x01;/用户可以对"Data Flash/EEPROM区"进行字节读ISP_ADDRL = addr;
ISP_ADDRH=addr>>8;
EA= 0;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
_nop_();
dat=ISP_DATA;
uchar dcx(uint addr);
voidQ0();
/*
*/
/*
void main(void)
uchar V;
V = dcx(0x2002);//开机读取EEPROM区2002h数据,还原关电前LED的亮灭 状况
if(V==2){LED1=0;LED2=1;}
else if(V==6){LED1=0;LED2=0;}
验证第二、第三个程序时需按程序内主程序中的操作说明进行烧录单片
机,以验证是否成功操作单片机内部EEPROM。
程序1:
/***************************************************************
作品:EEP ROM实验,开机还原关电前LED的亮灭状况
ISP_ADDRH=addr>>8;
pic16单片机读写
pic16单片机读写Eeprom读写函数用于pic16 系列单片机void write_eeprom(unsigned char addr,unsigned char data) {do{;}while(WR==1); //上一次写操作是否完成EEADR=addr; //EEPROM地址EEDATA=data; //准备写入EEPROM的数据EEPGD=0; //指向EEPROM数据储存器WREN=1; //使能写操作EECON2=0x55; //设置通用参数EECON2=0xAA; //设置通用参数WR=1; //开始写do{;}while(WR==1); //等待写操作完成WREN=0; //禁止写操作}unsigned char read_eeprom(unsigned char addr){unsigned char num;do{;}while(RD==1); //上一次读操作是否完成EEADR=addr; //EEPROM地址为00HEEPGD=0; //指向EEPROM数据储存器RD=1; //开始读do{;}while(RD==1); //等待读操作完成num=EEDATA; //读出return(num); //返回读出的数}下面为pic18系列的eeprom读写程序void write_eeprom(unsigned char addr,unsigned char edata) {do{;}while(WR==1); //上一次写操作是否完成NVMADR=addr; //EEPROM地址NVMADRH:NVMADRLNVMDAT=edata; //准备写入EEPROM的数据NVMDA TNVMREG1 =0; //指向EEPROM数据储存器NVMREG0 NVMREG1 :1;NVMREG0 =0;WREN=1; //使能写操作NVMCON2=0x55; //设置通用参数NVMCON2=0xAA; //设置通用参数WR=1; //开始写do{;}while(WR==1); //等待写操作完成WREN=0; //禁止写操作}unsigned char read_eeprom(unsigned char addr){unsigned char num;do{;}while(RD==1); //上一次读操作是否完成NVMADR=addr; //EEPROM地址为00HNVMREG1 =0; //指向EEPROM数据储存器NVMREG0 NVMREG1 :1;NVMREG0 =0; //指向EEPROM数据储存器RD=1; //开始读do{;}while(RD==1); //等待读操作完成num=NVMDA T; //读出return(num); //返回读出的数}。
AVR单片机EEPROM的读写
AVR单片机EEPROM的读写
一AVR 存储类型不要外挂方便使用
1.FLASH 存储程序代码
2.EEPROM 运行的数据掉电不丢失的数据存储分页的数据
3.SRAM 运行的临时数据
EEPROM:读写以字节为单位通过专用指令或SPI、JTAG 直接读写
使用RC 震荡作为时钟,典型值为8.5ms
有时数据丢失的原因:刚上电电压不稳就操作、读写时被中断打断、程序跑飞了
怎样预防:
熔丝位的电压检测设置:低于电压就停止
熔丝位系统时钟的设置:设置上电暂停时间长一点
双字节存储,或加校验位
操作时尽量关中断
二相关寄存器
存储器需要数据和地址来操作以及相应的控制寄存器
地址寄存器EEARH EEARL
数据寄存器EEDR
控制寄存器EECR
* ** * EERIE EEMWE EEWE EERE
以一个实例示范下即可。
EEPROM读写程序的设计及说明(v1.1改进版)
EEPROM读写程序的设计及说明一、I2C 总线概述I2C 总线是PHILIPS 公司推出的芯片间串行数据传输总线。
I2C 总线通过两根线(串行数据线SDA 和串行时钟线SCL)使挂接到总线上的器件相互进行信息传递,能够十分方便地地构成多机系统和外围器件扩展系统。
I2C 器件是把I2C 的协议植入器件的I/O 接口,使用时器件直接挂到I2C 总线上即可。
总线使用软件寻址来识别每个器件--微控制器、存储器、LCD、驱动器时钟芯片及其它I2C 总线器件,而无须使用片选信号,是否选中是由主器件发出的I2C 从地址决定的而I2C 器件的从地址是由I2C 总线委员会实行统一发配的。
总线上的每一次数据传送活动都是主控器先发送起始信号,然后主控器发送被控器的地址及读写位1个字节,这之后是主控器等待被控器的应答信号(接着的第九位),再接着就是主控器发送数据给被控器(写被控器)或接收被控器发出来的数据(读被控器),最后由主控器发出停止信号通知被控器结束整个数据传送过程。
I2C 总线的数据传送过程如下图所示。
I2C 总线协议规定传送的数据长度为8位,而每次传送的数据字节数由被控器所限制如24C01(128 字节EEPROM)规定一次最多可以传送8个字节,24C02(256字节EEPROM)规定一次最多可传送16个字节。
按照I2C总线协议,总线上非单片机类型的外围器件地址由器件编号地址(高4位D7~D4由器件类型决定)和器件引脚地址(D3~D1)组成,如24C01/02/03/04的器件编号地址为1010。
器件的引脚地址由A2A1A0三根硬件地址线决定,最后一位为读写控制位,1表示读,0表示写,如下图示。
二、程序框图三、EEPROM应用程序1、整体功能说明本程序利用NEC公司的9177芯片,用软件的模拟方法实现对EEPROM器件(如24C04)的读写操作。
2、变量说明EEDATA 所需读或写的EEPROM参数个数PARAADD EEPROM读写的地址变量EEWRDELAY 写EEPROM的延时时间计时变量3、标志说明_EEPRW 读写标志(0=EEPROM写,1=EEPROM读)_ACKERR EEPROM有无应答标志(1=无应答,0=有应答)_ERRORFG EEPROM出错标志(1=EEPROM出错,0=EEPROM无错)_PARAERR EEPROM参数错误(1=EEPROM参数出错,0=EEPROM参数无错)4、常量说明SLAW EQU 0A0H 表示EEPROM器件地址及EEPROM写SLAR EQU 0A1H 表示EEPROM器件地址及EEPROM读P_EESDA EQU P1.1 连接EEPROM数据线(SDA)的芯片管脚P_EESCL EQU P1.0 连接EEPROM 时钟线(SCL)的芯片管脚5、模块使用说明(1)本EEPROM读写模块可直接调用,在NEC9177调用方法为:CALL !EEPROMRW;(2)调用前需给以下几个参数进行赋值所需读写的EEPROM参数个数:EEDATA 例如:MOV EEDATA,#32所需读写的EEPROM参数初始地址:PARAADD 例如:MOV PARAADD,#0读写EEPROM数据所存放的地址:HL 例如:MOVW HL,#PARABUF程序要求为读或写EEPROM标志:_EEPRW 例如:SET1 _EEPRW6、应用范围此程序段可应用于NEC9177作为主芯片的电控中,其中外围的EEPROM器件应具有I2C总线的特性(如24C04),其他具有I2C特性的器件也可做参考。
stc89c52单片机EEPROM地址读写数据库函数
Read_isp_data=isp_data;
return(Read_isp_data);
}
/**************************************************************/
/*******************************************************************************/
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; /*开中断*/
}
/**************************************************************/
/***************STC89CXX_EEPROM字节读程序*************************/
STC89CXX_EEPROM_Char_Write(0x20,0x01,0x11);
STC89CXX_EEPROM_Char_Write(0x20,0x02,0x22);
STC89CXX_EEPROM_Char_Write(0x20,0x03,0x33);
STC89CXX_EEPROM_Char_Write(0x20,0x04,0x44);
void main (void)
{
unsigned char temp;
Delay1ms(10); //开机延时
STC89CXX_EEPROM_Erase(0x20); //擦除整个扇区
STC89CXX_EEPROM_Char_Write(0x20,0x00,0x00); //指定EEPROM地址写数据
PIC24FV32A304单片机内部EEPROM读写测试
参考手册PIC24FV32KA304 Family Data Sheet (07-31-2013)第65-68页:修改参考手册中的代码,构建成读写函数如下://EEPROM读写测试int __attribute__ ((space(eedata))) eeData=0x0000;//擦除一个字void EEPROM_ERASE_WORD(unsigned intaddr){NVMCON = 0x4058;TBLPAG = __builtin_tblpage(&eeData);__builtin_tblwtl(__builtin_tbloffset(&eeData)+addr, 0); asm volatile ("disi #5");__builtin_write_NVM();while(NVMCONbits.WR==1);//擦除所有void EEPROM_ERASE_ALL(){NVMCON = 0x4050;asm volatile ("disi #5");__builtin_write_NVM();}//向地址addr写一个字int EEPROM_WRITE_WORD(unsigned intaddr,intnewData ){NVMCON = 0x4004;TBLPAG = __builtin_tblpage(&eeData);__builtin_tblwtl(__builtin_tbloffset(&eeData)+addr, newData);asm volatile ("disi #5");__builtin_write_NVM();while(NVMCONbits.WR==1);return 1;}//在地址addr读一个字int EEPROM_READ_WORD(unsigned intaddr){TBLPAG = __builtin_tblpage(&eeData);return __builtin_tblrdl(__builtin_tbloffset(&eeData)+addr);}int main(void){//数据以16bit对齐的方式访问EEPROM空间//共有512byte存储空间,地址以byte寻址,访问的地址256个(0 2 4 6 0..510偶数)//读写测试intI,Data[];//下面一段代码放入函数中调用,无法运行,不知是什么原因,只能直接在main 中运行…for(i=0;i<512;i+=2){EEPROM_WRITE_WORD(i,i/2);//先写入数据Data[i]=EEPROM_READ_WORD(i);//读出数据Send_byte(Data[i]%256);Send_byte(Data[i]/256);//发送数据}}调试信息:编译信息:2015-12-15测试。
STC单片机EEPROM的读写程序
STC单片机EEPROM的读写程序汇编语言写的,依据stc单片机官方提供的资料,测试ok,另外还有c语言的大家可到论坛去找。
stc的eeprom 功能还是不错的,可以简化我们的外围电路,但是缺点是是有就那就是写入速度太慢了,只能按扇区的写,不能字节写.下面是代码AUXR1 EQU 0A2HISPDATA EQU 0E2HISPADDRH EQU 0E3HISPADDRL EQU 0E4HISPCMD EQU 0E5HISPTRIG EQU 0E6HISPCONTR EQU 0E7HORG 0000HAJMP MAINORG 0030HMAIN:MOV AUXR1,#0INC AUXR1MOV DPTR,#2000H ACALL ERASEMOV A,#0FEH ACALL EEPROMW ACALL EEPROMR INC AUXR1AJMP MAIN ERASE:;擦除MOV ISPCONTR,#81H MOV ISPCMD,#03H MOV ISPADDRH,DPH MOV ISPADDRL,DPL CLR EAMOV ISPTRIG,#46H MOV ISPTRIG,#0B9H NOPSETB EAACALL ISPXXRET EEPROMW:;写MOV ISPCONTR,#81H MOV ISPCMD,#02HMOV ISPADDRH,DPH MOV ISPADDRL,DPL MOV ISPDATA,A CLR EAMOV ISPTRIG,#46H MOV ISPTRIG,#0B9H NOPSETB EAACALL ISPXXRET EEPROMR:;读MOV ISPCONTR,#81H MOV ISPCMD,#01H MOV ISPADDRH,DPH MOV ISPADDRL,DPL CLR EAMOV ISPTRIG,#46H MOV ISPTRIG,#0B9H NOPMOV A,ISPDATA SETB EAACALL ISPXXRETISPXX:MOV ISPCONTR,#0 MOV ISPCMD,#0 MOV ISPTRIG,#0 RETDEL:MOV R2,#0FFHD1:MOV R1,#0FFH DJNZ R1,$DJNZ R2,D1RETEND。
PIC单片机片内EEPROM的读写程序
PIC单片机片内EEPROM的读写程序因为也是摸索着学习PIC单片机,当要用到EEPROM存储部分系统参数,看单片机手册上的资料,觉得还是比较麻烦,然后还是不太会,然后就想找找看网上有没有现成的PIC单片机的片内EEPROM的读写程序,然后都没有找到想要的,而且对汇编语言的也不知道,所以搜索了下最后终于发现PICC编译器里面其实对内部的EEPROM的读写有头文件,可以直接来用,方法如下:PICC的安装目录下C:\Program Files\HI-TECH Software\PICC\9.81\include(这是我的电脑里目录)里面有一个eeprom_routines.h的文件这个就是关于EEPROM 中的读写程序,具体程序如下:// This header file should not be included directly// Inclusion of this file is provided indirectly by including htc.h/******************************************************************** ***//****** EEPROM memory read/write macros and function definitions *******//******************************************************************** ***//* NOTE WELL:The macro EEPROM_READ() is NOT safe to use immediately after anywrite to EEPROM, as it does NOT wait for WR to clear. This is bydesign, to allow minimal code size if a sequence of reads isdesired. To guarantee uncorrupted writes, use the functioneeprom_read() or insertwhile(WR)continue;before calling EEPROM_READ().*/#if EEPROM_SIZE > 0#ifdef __FLASHTYPE// macro versions of EEPROM write and read#define EEPROM_WRITE(addr, value) \do{ \while(WR)continue;EEADRL=(addr);EEDATA=(value); \EECON1&=0x3F;CARRY=0;if(GIE)CARRY=1;GIE=0; \WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \if(CARRY)GIE=1; \}while(0)#define EEPROM_READ(addr)((EEADRL=(addr)),(EECON1&=0x3F),(RD=1),EEDATA)#else // else doesn't write flash#define EEPROM_WRITE(addr, value) \do{ \while(WR)continue;EEADRL=(addr);EEDATA=(value); \CARRY=0;if(GIE)CARRY=1;GIE=0; \WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \if(CARRY)GIE=1; \}while(0)#define EEPROM_READ(addr) ((EEADRL=(addr)),(RD=1),EEDATA) #endif/* library function versions */extern void eeprom_write(unsigned char addr, unsigned char value); extern unsigned char eeprom_read(unsigned char addr);#endif // end EEPROM routines看到这里就知道了。
单片机读写EEPROM例子
单⽚机读写EEPROM例⼦eeprom.c#ifndef _EEPROM_H_#define _EEPROM_H_#include <intrins.h>#include <reg52.h>typedef unsigned int uint;typedef unsigned char uchar;/********STC89C52扇区分布*******第⼀扇区:2000H--21FF第⼆扇区:2200H--23FF第三扇区:2400H--25FF第四扇区:2600H--27FF第五扇区:2800H--29FF第六扇区:2A00H--2BFF第七扇区:2C00H--2DFF第⼋扇区:2E00H--2FFF*******************************/#define RdCommand 0x01 //字节编程数据命令#define PrgCommand 0x02 //字节读数据命令#define EraseCommand 0x03 //扇区擦除数据命令#define Error 1#define Ok 0#define WaitTime 0x01 //定义CPU的等待时间,40M以下为0,20M以下为1,10M以下为2,5M以下为3/*****ISP/IAP特殊功能寄存器声明********/sfr ISP_DATA = 0xE2;sfr ISP_ADDRH = 0xE3;sfr ISP_ADDRL = 0xE4;sfr ISP_CMD = 0xE5;sfr ISP_TRIG = 0xE6;sfr ISP_CONTR = 0xE7;unsigned char byte_read(unsigned int byte_addr);void byte_write(unsigned int byte_addr,unsigned char Orig_data);void SectorErase(unsigned int sector_addr);#endifeeprom.c#include "eeprom.h"/**********打开ISP/IAP功能**************/void ISP_IAP_Enable(void){EA = 0; //关中断ISP_CONTR = ISP_CONTR & 0x18;ISP_CONTR = ISP_CONTR | WaitTime; // 设置等待时间ISP_CONTR = ISP_CONTR | 0x80; //允许ISP/IAP操作}/**********关闭ISP/IAP功能**************/void ISP_IAP_Disable(void){ISP_CONTR = ISP_CONTR & 0x7f; //禁⽌ISP/IAP操作ISP_CMD = 0x00; //去除ISP/IAP命令ISP_TRIG = 0x00; //防⽌ISP/IAP命令⽆触发EA = 1; // 开中断}/**********触发ISP/IAP**************/void ISPTrig(void){ISP_TRIG = 0x46; //先送46h,再送B9h到ISP/IAP触发寄存器,每次都需如此ISP_TRIG = 0xb9; //送完B9h后,ISP/IAP命令⽴即被触发启动_nop_();}/**********字节读**************/unsigned char byte_read(unsigned int byte_addr){unsigned char dat = 0; //读EEPROM数据缓存EA = 0; //关中断ISP_ADDRH = (unsigned char)(byte_addr >> 8); //送地址⾼字节ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); //送地址低字节ISP_IAP_Enable(); //打开ISP/IAP功能ISP_CMD = ISP_CMD & 0xf8; //清除ISP_CMD寄存器低3位ISP_CMD = ISP_CMD | RdCommand; //写⼊读数据命令ISPTrig(); //触发ISP/IAPdat = ISP_DATA; //将ISP_DATA寄存器中的数据保存起来ISP_IAP_Disable(); //关闭ISP/IAP功能EA = 1; //使能中断return dat; //返回读到的数据}/**********字节写**************/void byte_write(unsigned int byte_addr,unsigned char Orig_data){EA = 0; //关中断ISP_ADDRH = (unsigned char)(byte_addr >> 8); //送地址⾼字节ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); //送地址低字节ISP_IAP_Enable(); //打开ISP/IAP功能ISP_CMD = ISP_CMD & 0xf8; //清除ISP_CMD寄存器低3位ISP_CMD = ISP_CMD | PrgCommand; //写⼊写数据命令ISP_DATA = Orig_data; //写⼊数据到ISP_DATA寄存器ISPTrig(); //触发ISP/IAPISP_IAP_Disable(); //关闭ISP/IAP功能EA =1; //使能中断}/**********扇区擦除**************/void SectorErase(unsigned int sector_addr){EA = 0;ISP_ADDRH = (unsigned char)(sector_addr >> 8); //送擦除地址⾼字节 ISP_ADDRL = (unsigned char)(sector_addr & 0x00ff); //送擦除地址低字节 ISP_IAP_Enable();ISP_CMD = ISP_CMD & 0xf8; //清除ISP_CMD寄存器低3位ISP_CMD = ISP_CMD | EraseCommand; //写⼊擦除数据命令ISPTrig(); //触发ISP/IAPISP_IAP_Disable(); //关闭ISP/IAP功能}ISP2.C/********************************************************************************* @file main.c* @author waitstory* @version V1.0* @date 2018-4-11* @brief STC89C52RC内部EEPROM的读写******************************************************************************* @attention** 实验平台:STC89C52RC芯⽚,晶振11.0592MHz*********************************************************************************/#include <eeprom.h>#include <absacc.h>void InitUART(uint baud); //串⼝初始化函数void UartTXData(uchar str[]); //串⼝发送函数void Delay_ms(uint z); //延时函数uchar TxStr[3] = {1};uchar dat[2] ={0x33,0x35};uint ma,mb;char id;char *MCUID;/********STC89C52扇区分布*******第⼀扇区:2000H--21FF第⼆扇区:2200H--23FF第三扇区:2400H--25FF第四扇区:2600H--27FF第五扇区:2800H--29FF第六扇区:2A00H--2BFF第七扇区:2C00H--2DFF第⼋扇区:2E00H--2FFF*******************************/void main(){//ma=0x2000;SectorErase(0x2000); //擦除第⼀扇区byte_write(0x2001,dat[0]); //在地址为0x2001的内存写⼊⼀个字节byte_write(0x2002,dat[1]); //在地址为0x2002的内存写⼊⼀个字节//byte_write(0x2001,'1'); //在地址为0x2001的内存写⼊⼀个字节//byte_write(0x2002,'2'); //在地址为0x2002的内存写⼊⼀个字节Delay_ms(1000); //延时1sInitUART(9600); //串⼝初始化函数ma=0x2e00;while(1){TxStr[0] = byte_read(0X2001); //从地址0x2001读取⼀个字节TxStr[1] = byte_read(0X2002); //从地址0x2002读取⼀个字节ma=ma+2;UartTXData(TxStr); //将读取的字节发送⾄串⼝Delay_ms(1000); //延时2s}}/* 串⼝配置函数,baud-通信波特率 */void InitUART(uint baud){EA = 1; //使能中断总开关SCON = 0x50; //配置串⼝为模式1TMOD &= 0x0F; //清零T1的控制位TMOD |= 0x20; //配置T1为模式2TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值TL1 = TH1; //初值等于重载值ET1 = 0; //禁⽌T1中断ES = 1; //使能串⼝中断TR1 = 1; //启动T1}/*串⼝发送字符串函数*/void UartTXData(uchar str[]){uchar i = 0;while(str[i] != '\0'){SBUF= str[i];i++;while(!TI);TI=0;}}/*延时函数*/void Delay_ms(uint z){uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}结果:打开STC-ISP中的串⼝助⼿-打开串⼝,9600,单⽚机发送33 35,串⼝接收到33 35。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ISP_CMD = ISP_CMD & 0xf8;
/* 清空低 3 位 */
/* 指向下一个字节 */
/* ========================= 扇区读出 ========================= */
/* 程序对地址没有作有效性判断,请调用方事先保证他在规定范围内 */
void ArrayRead(uint begin_addr, uchar len){
// uchar xdata data_buffer[];
/* 整个扇区读取缓存区 */
uint iSectorAddr;
uint i;
iSectorAddr = begin_addr; // & 0xfe00;
/* 取扇区地址 */
ISP_IAP_enable(); for(i = 0; i < len; i++){
ISP_DATA = 0;
ISP_TRIG = 0x46;
/* 触发 ISP_IAP 命令字节 1 */
ISP_TRIG = 0xb9;
/* 触发 ISP_IAP 命令字节 2 */
_nop_();
Ttotal[i] = ISP_DATA; iSectorAddr++; } ISP_IAP_disable(); }
ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_();
/* 触发 ISP_IAP 命令字节 1 */ /* 触发 ISP_IAP 命令字节 2 */
/* 比较对错 */ if(ISP_DATA != array[i]){
ISP_IAP_disable(); return Error; } in_addr++; } ISP_IAP_disable(); return Ok; }
return Error;
}
in_addr = begin_addr;
/* 逐个写入并校对 */
ISP_IAP_enable();
/* 打开 IAP 功能 */
for(i = 0; i< len; i++){
/* 写一个字节 */
ISP_ADDRH = (uchar)(in_addr >> 8);
ISP_ADDRL = (uchar)(in_addr & 0x00ff);
/* 关闭 IAP 功能 */
/* ==============================================================
从 eeprom 中读取数据
=================================================打开 ISP,IAP 功能 */
ISP_TRIG = 0x46;
/* 触发 ISP_IAP 命令字节 1 */
ISP_TRIG = 0xb9;
/* 触发 ISP_IAP 命令字节 2 */
_nop_();
}
/* ==================== 字节读 ======================== */ uchar byte_read(uint byte_addr){
#define WaitTime 0x01
/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void){
EA = 0;
/* 关中断
*/
ISP_CONTR = ISP_CONTR & 0x18;
/* 0001,1000 */
ISP_ADDRH = (uchar)(byte_addr >> 8); /* 取地址 */ ISP_ADDRL = (uchar)(byte_addr & 0xff);
ISP_CMD = ISP_CMD & 0xf8; ISP_CMD = ISP_CMD | PrgCommand; ISP_DATA = original_data;
ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
ISP_CONTR = ISP_CONTR | 0x80;
/* ISPEN=1
*/
}
/* =============== 关闭 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void){
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令 3 */
ISPgoon(); ISP_IAP_disable();
/* 触发执行
*/
/* 关闭 ISP,IAP 功能 */
}
/* ==================== 字节写 ======================== */ void byte_write(uint byte_addr, uchar original_data){
uint i; uint in_addr;
/* 判是否是有效范围,此函数不允许跨扇区操作 */
if(len > PerSector){
return Error;
}
in_addr = begin_addr & 0x01ff;
/* 扇区内偏移量 */
if((in_addr + len) > PerSector){
ISP_ADDRH = (uchar)(iSectorAddr >> 8); ISP_ADDRL = (uchar)(iSectorAddr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8;
/* 清低 3 位 */
ISP_CMD = ISP_CMD | RdCommand;
/* 读命令 1 */
/* 写命令 2 */
ISP_DATA = original_data;
/* 写入数据准备 */
ISPgoon(); ISP_IAP_disable(); }
/* 触发执行
*/
/* 关闭 IAP 功能 */
/* =================== 字节写并校验 =================== */ uchar byte_write_verify(uint byte_addr, uchar original_data){
void DataRestore()
{
EepromPtr = BaseAddr;
/* 触发 ISP_IAP 命令字节 1 */ /* 触发 ISP_IAP 命令字节 2 */
/* 读回来 */ ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8;
/* 清低 3 位 */
ISP_CMD = ISP_CMD | RdCommand;
/* 读命令 1 */
if(ISP_DATA == original_data){ return Ok;
} else{
return Error; } }
/* 读写数据校验 */ /* 返回校验结果 */
/* ===================== 数组写入 ===================== */ uchar ArrayWrite(uint begin_addr, uint len, uchar *array){
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
0x08,
0x09,
0x0a,
0x0b,
0x0c,
0x0d,
0x0e,
0x0f,
};
uint timerForDelay, i, EepromPtr;
/* 专供延时用的变量 */
/* 循环变量
*/
/* eeprom 读写指针 */
/* --------------- 命令定义 --------------- */
ISP_DATA = array[i];
/* 取数据 */
ISP_CMD = ISP_CMD & 0xf8;
/* 清低 3 位 */
ISP_CMD = ISP_CMD | PrgCommand; /* 写命令 2 */
ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_();
ISP_ADDRH = (uchar)(byte_addr >> 8); /* 地址赋值 */ ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8;
/* 清除低 3 位 */
ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */
ISPgoon(); ISP_IAP_disable();
/* 触发执行
*/
/* 关闭 ISP,IAP 功能 */
return (ISP_DATA); }
/* 返回读到的数据 */
/* ================== 扇区擦除 ======================== */ void SectorErase(uint sector_addr){