aaabbbad 发表于 2017-3-11 13:06:26

求助:PIC 片上EEPROM写不进去

本帖最后由 aaabbbad 于 2017-3-11 13:06 编辑

我现在遇到一个问题,片上EEPROM写不进去,表现出的现象是:编译器在线调试观察EEPROM内部全是FF,我的擦写驱动是按照datasheet上的汇编写的c语言格式,网上说的BOD也是打开的,找到了几个相近片子的例程几乎一致,但就是写不进去,还请您再指导一下,以下附上我的代码和相关截图。
void data_write(unsigned char addr,unsigned char value)
{
      EEADR = addr;                              //写目标地址,范围0-ff
      EEDATA = value;                              //写目标值
      EECON1bits.EEPGD = 0;                //指向EEPROM接口
      EECON1bits.CFGS = 0;                //指向EEPROM/FLASH 区分config
      INTCONbits.GIE = 0;                        //关闭全局中断
      EECON1bits.WREN = 1;                //使能写功能
      EECON2 = 0x55;                              //填入写序列 55h
      EECON2 = 0xAA;                              //填入写序列 aah
      EECON1bits.WR = 1;                        //使能写控制位
      while(EECON1bits.WR == 1);      //等待写中断完成
      INTCONbits.GIE = 1;                        //使能全局中断
      PIR2bits.EEIF = 0;                        //清除写中断标志位
      EECON1bits.WREN = 0;                //关闭写功能
}

int data_read(unsigned char addr)
{      
      EEADR = addr;                              //读目标地址,范围0-ff
      EECON1bits.EEPGD = 0;                //指向EEPROM接口
      EECON1bits.RD = 1;                        //使能读功能
      return EEDATA;
}

时钟位配置


编译环境是MPLAB C18 调试器 PICKit3.5+
EEPROM地址手册上说范围是0x00-0xFF,我读写使用的地址是0x22,0x33,也没看到有什么位置说偏移地址啊,地址应该没错吧

地址组成关系如下

K7toubleaz 发表于 2017-3-16 23:35:10

我之前寫18F1220有把汇编直接包進C裡面跑,
動作大概就是寫完要等一下再讀,讀寫期間要關閉中斷。
後來查C18手冊寫出來的是這樣,不過這很久前寫的,我也忘了是寫啥了。

//====================EEROM==================================
unsigned char ReadEEPROM(unsigned char EE_Addr)
{//<editor-folddefaultstate="collapsed"desc="EEROM讀取">
EEADR=EE_Addr;    //给地址
EECON1bits.EEPGD=0;   //
EECON1bits.CFGS = 0;
EECON1bits.RD=1;      //开始读
Delay1TCY();
return EEDATA;    //直接返回读取的EEPROM
   //</editor-fold>
}
void int_EEPROM_write(unsigned char address, unsigned char data)
{//<editor-folddefaultstate="collapsed"desc="EEROM寫入">
    unsigned char INTCON_SAVE;

    EEADR= address;
    EEDATA = data;

    EECON1bits.EEPGD= 0; // 0 = Access data EEPROM memory
    EECON1bits.CFGS = 0; // 0 = Access Flash program or DATA EEPROM memory
    EECON1bits.WREN = 1; // enable writes to internal EEPROM

    INTCON_SAVE=INTCON; // Save INTCON register contants
    INTCON=0;             // Disable interrupts, Next two lines SHOULD run without interrupts

    EECON2=0x55;      // Required sequence for write to internal EEPROM
    EECON2=0xaa;      // Required sequence for write to internal EEPROM

    EECON1bits.WR=1;    // begin write to internal EEPROM
    INTCON=INTCON_SAVE; //Now we can safely enable interrupts if previously used

    Nop();

    while (PIR2bits.EEIF==0)//Wait till write operation complete
    {
      Nop();
    }

    EECON1bits.WREN=0; // Disable writes to EEPROM on write complete (EEIF flag on set PIR2 )
    PIR2bits.EEIF=0; //Clear EEPROM write complete flag. (must be cleared in software. So we do it here)
//</editor-fold>
}
页: [1]
查看完整版本: 求助:PIC 片上EEPROM写不进去