0

The first time my PIC30F code reads a word from Data EEPROM, it reads 0xFFFF instead of the data actually in EEPROM. It reads fine afterward.

  • After a bad read, I checked W1 and it does have the correct address
  • There are no words in data EEPROM with a value of 0xFFFF
  • I checked the supply: it's 5.13 V
  • If I break right before the table read instruction, and step through it, it woks fine
  • I know that NVMADRU and NVMADR are not involved in reading, but I checked them, and their value doesn't change between good reads and bad reads
  • It's a dsPIC30F5011
  • I checked the Errata, and did not find any reference to such issue
  • I am working through the debug function of MPLAB 8, with a PICkit II
    • I am working through the debug function of MPLAB 8, with a PICkit II: I reset, then run, and it fails
    • If I place the code in a tight loop until the value is correct, and counting the number of iterations, I see that it takes 2339 times through the loop until it reads correctly

EEPROM read code:

_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

Any suggestions of what may be causing that?

Davide Andrea
  • 1,357
  • 2
  • 15
  • 39

1 Answers1

0

SOLVED

The documentation doesn't say so, but, before you can read data EEPROM, you must wait for any previous EEPROM operations to be done.

You can do it in one of these ways:

1) In C:

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

2) In C, no lib import

while (NVMCONbits.WR);

3) In assembly:

btsc NVMCON,#15 ; If busy (WR bit s set)
bra $-2         ; Go back and wait
Davide Andrea
  • 1,357
  • 2
  • 15
  • 39