tian111 发表于 2020-5-10 11:23

实际读出不对


/********************************write eeprom*******************************/
void write_eeprom(Byte write_page,Byte write_addr,Byte write_data)
{
    EA=0;
      FLASHCON=1;
      XPAGE=write_page;
      IB_OFFSET=write_addr;
      IB_DATA=write_data;
      IB_CON1=0X6E;
      IB_CON2=0X05;
      IB_CON3=0X0A;
      IB_CON4=0X09;
      IB_CON5=0X06;
      _nop_();
      _nop_();
      _nop_();
      _nop_();

      XPAGE=0x00;
      FLASHCON=0;
      EA=1;
}
/********************************read eeprom********************************/
Byte read_eeprom(Byte read_page,Byte read_addr)
{
      Byte temp;
      EA=0;
    FLASHCON=1;
      XPAGE=read_page;
      IB_OFFSET=read_addr;
      temp=*(Byte code *)(read_addr);
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      
      XPAGE=0x00;
      FLASHCON=0;
      EA=1;
      return temp;
}
/********************************erase eeprom*******************************/
void erase_eeprom(Byte erase_page)
{
    EA=0;
      FLASHCON=1;
      XPAGE=erase_page;
      IB_CON1=0XE6;
      IB_CON2=0X05;
      IB_CON3=0X0A;
      IB_CON4=0X09;
      IB_CON5=0X06;
      _nop_();
      _nop_();
      _nop_();
      _nop_();

      XPAGE=0X00;
      FLASHCON=0;
      EA=1;
}
/********************************主函数*************************************/
void main(void)
{
    CLKCON=0X20;         //系统分频1/2=6M
      P0CR&=0x0f;       //P0.4,P0.5,P0.6,P0.7输入口         
      P0PCR|=0xf0;               //输入口打开上拉电阻
      init();
      T4_init();
      T5_init();
      ADC_init();
      if(P0_7==0)
      {
             while(!P0_7);
            //erase_eeprom(0);               
            //write_eeprom(0,0,79);
            //write_eeprom(0,1,80);
            //write_eeprom(0,2,81);
                erase_eeprom(1);
                write_eeprom(1,3,82);
                write_eeprom(1,4,83);
                write_eeprom(1,5,84);
                A=read_eeprom(0,0);
                B=read_eeprom(0,1);
                C=read_eeprom(0,2);
                D=read_eeprom(1,3);
                E=read_eeprom(1,4);
                F=read_eeprom(1,5);
我先是写的扇区0的数据,写正常,读出也正常,然后关掉写,直接读扇区0的数据正常,即A=79,B=80,C=81,说明已经保存到eeprom里了,但是我写扇区1,D,E,F不是应该等于82,83,84吗,怎么实际读出来D,E,F却等于79,80,81呢

songqian17 发表于 2020-5-10 11:26

读EEPROM与读FLASH程序存储器一样

chenho 发表于 2020-5-10 11:29

对,用DPTR寄存器做地址

gongche 发表于 2020-5-10 11:33


不用XPAGE和IB_OFFSET,也不用那几个NOP

chenho 发表于 2020-5-10 11:36

嗯,也不用关中断,MCU也不会进入IDLE状态

tian111 发表于 2020-5-10 11:39

新手,,麻烦大神写一下读eeprom的代码,谢谢!

zhuhuis 发表于 2020-5-10 11:41


这是正确的读eeprom的代码
Byte read_eeprom(Byte read_page,Byte read_addr)
{
      Byte temp;
      EA=0;
    FLASHCON=1;
//      XPAGE=read_page;
//      IB_OFFSET=read_addr;
      temp=*(Byte code *)(read_addr+read_page*256);
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      
//      XPAGE=0x00;
      FLASHCON=0;
      EA=1;
      return temp;
}

tian111 发表于 2020-5-10 11:44

哦,那我就知道怎么回事了,多谢大家
页: [1]
查看完整版本: 实际读出不对