打印

片内EEPROM写入问题

[复制链接]
3420|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sunware65|  楼主 | 2013-6-2 08:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面这段程序在软件仿真是没有任何问题,但用PICKIT3调试器仿真或实际单片机运行时,却写不进EEPROM。
for(i=0;i<4;i++)
  {
    do{}
    while(PIR2bits.EEIF==1); /*等待上一次*/
    EEADR=0x30+i;
    EEDATA=0x65;
    EECON1bits.EEPGD=0;  /*指向EEPROM*/
    EECON1bits.CFGS=0;
    PIR2bits.EEIF=0;
    INTCONbits.GIE=0;    /*关闭所有中断*/
    EECON1bits.WREN=1;   /*使能EEPROM*/
    EECON2=0x55;         /*擦写操作用*/
    EECON2=0xaa;         /*擦写操作用*/
    EECON1bits.WR=1;     /*启动写EEPROM操作*/
    while(!PIR2bits.EEIF); /*等待写EEPROM完成*/
    EECON1bits.WREN=0;
    PIR2bits.EEIF=0;     /*清写EEPROM中断标志*/
  }
    会是什么地方设置有问题吗?我查过了EEPROM写保护两项都没使用能,芯片是新的,没写过几次。各位大侠,还会是什么地方的问题?
   另外还告之,初始化EEPROM也非常正常。
沙发
kvdong| | 2013-6-2 09:56 | 只看该作者
首先问一句,你程序里关闭总中断后什么时候打开的呢?
在关总中断的之前(  INTCONbits.GIE=0;    /*关闭所有中断*/ )如何确定的INTCONbits.GIE的状态呢?

使用特权

评论回复
板凳
Sunware65|  楼主 | 2013-6-2 10:24 | 只看该作者
根本就没开中断!

使用特权

评论回复
地板
kvdong| | 2013-6-2 10:33 | 只看该作者
哦,我只是提醒你以后程序中这些地方是容易造成调试不过的地方,编程时应加以注意,跟你现在的问题没太大关系。

具体到你现在的问题,可以先把你用的芯片型号说一下,把问题描述的越详细,别人才越好判断,或者你在描述的过程中就能自己解决了。

最后提示,如果觉得没什么问题,可以换个芯片试试。我曾经连续遇到2片坏芯片,当时只能怀疑自己的程序,却始终找不到原因,无奈之下又换了芯片,却发现先前的两片都是有问题的。

使用特权

评论回复
5
Sunware65|  楼主 | 2013-6-2 17:30 | 只看该作者
现在的情况是,开机后第一次能写进去,也能读出。以后就只停在等待处,单步运行也是这种情况。看来只有换芯片试试了!

使用特权

评论回复
6
Sunware65|  楼主 | 2013-6-2 17:39 | 只看该作者
芯片用的是PIC18F4520

使用特权

评论回复
7
yewuyi| | 2013-6-3 09:15 | 只看该作者
操作内部EEPROM的几个关键点:
1、正确选择FLASH/EEPROM空间
2、按照规格书要求序列书写正确的读写代码
3、读写过程中防止中断或看门狗等动作
4、向EEPROM写入数据需要一定的时间,必须通过正确的代码来保证这个时间
5、正确选择EEPROM地址和数据

使用特权

评论回复
8
llqjmy| | 2013-6-3 13:16 | 只看该作者
我提供给你一个可用的代码吧,是基于MCC18的。
void WriteEEPROM(unsigned int EEPROM_Addr,unsigned char EEPROM_Data)
{
        INTTOCHAR        IntCharData;
        unsigned char CharData1,CharData2,CharData3;
        ClrWdt();
        IntCharData.IntData=EEPROM_Addr;
        EEPROM_Data1=IntCharData.CharData[0];        EEPROM_Data2=IntCharData.CharData[1];
        EEPROM_Data3=EEPROM_Data;

        _asm
                MOVFF        EEPROM_Data2,EEADRH       
                MOVFF        EEPROM_Data1,EEADR       
                MOVFF        EEPROM_Data3,EEDATA       
                BCF        EECON1, 7,0       
                BCF        EECON1, 6,0       
                BSF        EECON1, 2,0       
                BCF        INTCON, 7,0       
                MOVLW        0x55               
                MOVWF         EECON2,0       
                MOVLW         0xaa       
                MOVWF         EECON2,0        
                BSF        EECON1, 1,0       
                BSF         INTCON, 7,0       
       
                BCF        EECON1, 2,0
        _endasm
       
        Delay10KTCYx(10);
        ClrWdt();
}

其中INTTOCHAR是个整形和字符型共用的联合体,因为这个程序是PIC18F6520的,他的EEPROM比较大。这是实际验证过的程序。你可适当更改。

使用特权

评论回复
9
NE5532| | 2013-6-3 15:29 | 只看该作者
楼主通过什么来确定“写进去”了呢?如果程序运行不正确,检查中断相关流程是否正确,楼上提醒你中断的问题,并不是不可能出问题的,没有用中断也有可能有问题。

使用特权

评论回复
10
HZWCG| | 2013-6-4 16:07 | 只看该作者
在 EECON1bits.WR=1; 后面加一句:INTCONbits.GIE=1;

使用特权

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

本版积分规则

2

主题

8

帖子

0

粉丝