PIC30F数据EEPROM首次读取0xFFFF

时间:2014-10-08 16:06:38

标签: pic eeprom

我的PIC30F代码第一次从数据EEPROM读取字时,它读取0xFFFF而不是EEPROM中的实际数据。之后它看起来很好。

  • 读错后,我检查了W1,确实有正确的地址
  • 数据EEPROM中没有值为0xFFFF
  • 的字
  • 我检查了供应:它是5.13 V
  • 如果我在表阅读说明之前就打破了,并且逐步完成它,那就很好了
  • 我知道NVMADRU和NVMADR没有参与阅读,但我检查了它们,它们的值在良好读取和不良读取之间没有变化
  • 这是一个dsPIC30F5011
  • 我检查了勘误表,但没有找到任何关于此类问题的提法
  • 我正在使用PICkit II完成MPLAB 8的调试功能
    • 我正在使用PICkit II完成MPLAB 8的调试功能:我重置,然后运行,它失败
    • 如果我将代码放在一个紧密的循环中,直到值正确,并计算迭代次数,我发现循环需要2339次才能正确读取

EEPROM读取代码:

_ReadEEWord:
;--------------------------------------------------------------------------------
; Read a word from Data EEPROM
; Entry W0  Word address relative to the start of Data EEPROM
; Exit  W0  Word at that location
; Uses  W1, Table pointer
;--------------------------------------------------------------------------------

; Start address of Data EEPROM
#define DATAEE_START    0x7FFC00 

    ; Setup pointer to EEPROM memory 
    mov #0x7F,W1 ; Set the table pointer
    mov W1,TBLPAG   ;  to the page with the EEPROM
    add W0,W0,W0    ; Convert the word address to a byte address
    mov #0xFC00,W1  ; Add the start of EEPROM
    add W1,W0,W1    ;  to the address
    nop
    nop
    nop
    ; Return the EEPROM data
    tblrdl [W1],W0 ; Read the EEPROM data   
    nop
    nop
    nop
    return

对可能导致这种情况的任何建议?

1 个答案:

答案 0 :(得分:0)

解决

文档没有这样说,但是,在您可以读取数据EEPROM之前,必须等待以前的任何EEPROM操作。

您可以通过以下方式之一进行:

1)在C:

#include    <libpic30.h>    // Includes EEPROM utilities
_wait_eedata();  // Wait for the erase to be done

2)在C中,没有lib导入

while (NVMCONbits.WR);

3)在集会中:

btsc NVMCON,#15 ; If busy (WR bit s set)
bra $-2         ; Go back and wait