2

M95M02-DR 256KB EEPROM メモリ チップを MSP430 マイクロコントローラと接続しようとしています。サンプル テストとして、次の文字列を書き込もうとしました。

第一章 うさぎの穴を下る。アリスは、銀行で妹のそばに座っているのにうんざりし始めていました。

チップからデータを読み取ろうとすると、次のようになります。

第一章 うさぎの穴を下る。アリスは、ベッドの上で妹のそばに座っていることにとてもうんざりし始めていました?????

? はジャンク データです。問題は、文字列のサイズを数文字減らしても問題ありません。以前、SD カード上のファイルからデータを読み取り、256 バイト ブロックで EEPROM チップに書き込もうとしました。その場合は何も書かれていません。しかし、同じ操作をバイトごとに実行すると、問題はありませんでした。

これは私が使用しているコードです

  static uint32_t i=0x025698;

  static unsigned char message[120] = "CHAPTER I. Down the Rabbit-Hole."\
  "Alice was beginning to get very tired of sitting by her sister on the bank, "; 

  static int size ;

  unsigned char input[120];

  size = strlen(message);

  eeprom_spi_init();
  eeprom_write( i ,message,size);

  __delay_cycles(2500);

  eeprom_read( i, input,size);

  input[size]='\0';

  ax_log_msg(E_LOG_INFO,input);  //print command

低レベルの SPI 関数は次のとおりです。

  void eeprom_write(uint32_t ui_addr, uint8_t *puc_wrData, uint8_t ui_dataLen)
  {

    uint8_t uac_wrBuf[260] = {0x00,};
    uint8_t i = 0;

    EEPROM_wrEnable();

    uac_wrBuf[i++] = WRITE; /* Write Instruction */
    uac_wrBuf[i++] = (uint8_t)((ui_addr >> 16) & 0xFF); /* First 8-bit MSB of 24-bit address  */
    uac_wrBuf[i++] = (uint8_t)((ui_addr >> 8) & 0xFF);  /* Second 8-bit MSB of 24-bit address */
    uac_wrBuf[i++] = (uint8_t)((ui_addr) & 0xFF);       /* Third 8-bit MSB of 24-bit address  */

    while(ui_dataLen--) {
      uac_wrBuf[i++] = *puc_wrData++;
    }
    uac_wrBuf[i++] = 0xFF;

    EEPROM_ON();
    EEPROM_sendFrame(uac_wrBuf, i);
    EEPROM_OFF();

    __delay_cycles(250000);
  }



  void eeprom_read(uint32_t ui_addr, uint8_t *puc_wrData, uint8_t ui_dataLen)
  {

    uint8_t uac_rdBuf[260] = {0x00,};
    uint8_t uac_rdCmd[4];
    uint8_t i = 0;

    uac_rdCmd[i++] = READ;
    uac_rdCmd[i++] = (uint8_t)((ui_addr >> 16) & 0xFF); /* First 8-bit MSB of 24-bit address  */
    uac_rdCmd[i++] = (uint8_t)((ui_addr >> 8) & 0xFF);  /* Second 8-bit MSB of 24-bit address */
    uac_rdCmd[i++] = (uint8_t)((ui_addr) & 0xFF);       /* Third 8-bit MSB of 24-bit address  */

    EEPROM_ON();
    EEPROM_sendFrame(uac_rdCmd, i);
    EEPROM_readFrame(puc_wrData, ui_dataLen);
    EEPROM_OFF();

  }

EEPROM_sendFrameとはEEPROM_readFrame、SD カードにも使用しているので問題なく動作しています。

どんな助けでも大歓迎です。記載し忘れている情報がありましたら、お知らせください。追加します。

ありがとう

4

1 に答える 1

5

ページの境界に達しています。すべての EEPROM は、トランザクションごとに 1 つのページにのみ書き込むことができます。M95M02 には 256 バイトのページがあるため、eeprom_write への 1 回の呼び出し内で、すべてのターゲット アドレスが最下位アドレスを除くすべてのバイトで一致する必要があります。

この例では、アドレス 0x025698 から書き込みを開始します。

ページ {開始 = 0x025600、オフセット = 0x98}

ページの最後に到達するまで、各データ バイトは自動インクリメントされます。

ページ {開始 = 0x025600、オフセット = 0xFF}

その後、すべてがページの先頭に戻ります。0x25700 を書きたいところに、実際には 0x25600 に書き込んでいます。

ページ {開始 = 0x025600、オフセット = 0x00 = 0x100 & 0xFF}

後で読み取ると、残りのコンテンツが0x025600に表示されます。

この問題を解決するには、書き込みをページ境界を越えないセグメントに分割する必要があります。

提案があります: 現在の eeprom_write の名前を eeprom_write_page に変更し、次のコードでラップします (エラーが発生したことをお詫びします。実際にコンパイルする時間がありませんでした)。

void eeprom_write(uint32_t addr, uint8_t* data, uint32_t datalen)
{
  while (0 < datalen)
  {
    uint32_t pagelen = (addr|0xFF) - addr + 1;
    uint32_t writelen = min(datalen, pagelen);

    eeprom_write_page(addr, data, (uint8_t)writelen);

    addr += writelen;
    data += writelen;
    datalen -= writelen;
  }
}

これにより、256 バイトを超えるデータを渡すことができるという利点も得られます。ラッパー関数は、そのすべてのチャンクを処理できます。

于 2014-08-06T18:30:10.090 に答える