0

PIC30F コードが初めてデータ EEPROM からワードを読み取るとき、実際に EEPROM にあるデータではなく 0xFFFF を読み取ります。後は問題なく読めます。

  • 読み取り不良の後、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 では、lib のインポートはありません

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 に答える