打印

eeprom写入被下一个扇区数据覆盖了

[复制链接]
3315|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lk0623|  楼主 | 2011-1-26 22:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在0x0000扇区写入数据,被0x0200扇区的数据覆盖了,读0x0000的时候出来的是0x0200的数据了.... 这个是什么问题呀?
代码如下 :
#include <reg51.H>
#define uint unsigned int
#define uchar unsigned char
uchar temp[16] ={0x5A,0x4A,0x58, 0x59, 0x44, 0x5A, 0x53, 0x5A, 0x01,0x01,0xF4,0x01,0x02,0x11,0x22,0x00};
uchar temp1[16]={0x5A,0x4A,0x58, 0x59, 0x44, 0x5A, 0x53, 0x5A, 0x02,0x02,0xF4,0x01,0x02,0x14,0x24,0x00};
uchar TXDBUFF[16];
uchar TXDBUFF1[16];
uchar i,add;
#define RELOAD_COUNT 0xFA // 22.1184M 模式1  9600
sfr AUXR=0x8e;
sfr AUXR1=0xA2;
sfr BRT=0x9c;
sfr IAP_DATA    = 0xC2;
sfr IAP_ADDRH   = 0xC3;
sfr IAP_ADDRL   = 0xC4;
sfr IAP_CMD     = 0xC5;
sfr IAP_TRIG    = 0xC6;
sfr IAP_CONTR   = 0xC7;
sfr16 DPTR = 0x82;
//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值
//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值
//#define DATA_FLASH_START_ADDRESS 0x00  //STC5Axx 系列 EEPROM 测试起始地址
union union_temp16
{
    uint   un_temp16;
    uchar  un_temp8[2];
}my_unTemp16;
void IAP_Disable()
{
    //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    IAP_CONTR = 0;      //关闭IAP 功能
    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
    IAP_TRIG  = 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
    IAP_ADDRH = 0;
    IAP_ADDRL = 0;
}
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
uchar Byte_Read(uint add)
{
    IAP_DATA = 0x00;
    IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字节读命令
    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址
    //EA = 0;
    IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
   // _nop_();
    //EA = 1;
    IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    return (IAP_DATA);
}
//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void Byte_Program(uint add, uchar  ch)
{
    IAP_CONTR = ENABLE_ISP;         //打开 IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令
    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址
    IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
    //EA = 0;
    IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
    //_nop_();
    //EA = 1;
    IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}

//擦除扇区, 入口:DPTR = 扇区地址
void Sector_Erase(uint add)
{
    IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令
    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址
    IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
    IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}


void  init_UART()
{
    SCON= 0x50;
    BRT= RELOAD_COUNT;
    AUXR= 0x11;
    //AUXR= 0x80;   //串口从P3变为P1
    ES=1;
    EA=1;
}
void send_UART(unsigned char i)
{
ES=0;
TI=0;
SBUF=i;
while(TI==0);
TI=0;
ES=1;
}
void eeprom(uchar add,uchar length,uchar buff[],uchar buff1[])
{
Sector_Erase(add);           //擦除整个扇区
for(i=0;i<length;i++)
{
     Byte_Program(add+i, buff[i]);//将 DEBUG_DATA 写入 EEPROM
  buff1[i] = Byte_Read(add+i);
  send_UART(buff1[i]);
}
}
void eeprom1(uchar add,uchar length,uchar buff1[])
{
for(i=0;i<length;i++)
{
  buff1[i] = Byte_Read(add+i);
  send_UART(buff1[i]);
}
}
void main(void)
{
   init_UART();
   eeprom(0x0000,16,temp1,TXDBUFF) ;
   eeprom(0x0200,16,temp,TXDBUFF) ;
   eeprom1(0x0000,16,TXDBUFF1) ;
   while(1) ;
}

相关帖子

沙发
lk0623|  楼主 | 2011-1-26 22:30 | 只看该作者

这个是PDF上扇区的地址

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

109

帖子

0

粉丝