0

我的 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

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

4

1 回答 1

0

解决了

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

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

1) 在 C 中:

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

2) 在 C 中,没有库导入

while (NVMCONbits.WR);

3) 在装配中:

btsc NVMCON,#15 ; If busy (WR bit s set)
bra $-2         ; Go back and wait
于 2014-10-08T17:54:48.753 回答