求助: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,也没看到有什么位置说偏移地址啊,地址应该没错吧
地址组成关系如下
我之前寫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]