0

次のコードを使用して、SPI 経由で AT45DB081D チップと通信しようとしています。

void efContinuousArrayRead(unsigned char *data, unsigned int page, unsigned int offset, unsigned int length)
{
    unsigned int index;

    FLASH_SEL_ON

    SPIShift(0x03); 
    SPIShift((unsigned char)(page >> 7));
    SPIShift((unsigned char)((page << 1) | (offset >> 8)));
    SPIShift((unsigned char)(offset & 0xFF));

    for(index = 0; index < length; index++)
    {
        data[index] = SPIShift(0x00);
    }

    FLASH_SEL_OFF
}

次のような他のいくつかのコマンドが機能しています。

  • バッファ 1/2 読み取り
  • ページ消去あり/なしのバッファ 1/2 書き込み
  • メインメモリからバッファ 1/2

これらの他のコマンドが機能することを考えると、FLASH_SEL_ON、SPIShift などが期待どおりに機能していると確信しています。

ページ 0 から任意のオフセットを読み取ることができることに注意してください。ただし、0 以外のページから読み取ることができません。これにより、問題はページを指定するための数学に問題があると考えられます。

デバッグ中に、ページ 1、オフセット 0 の 24 ビット アドレスが次のように計算されることがわかりました。

00000000 00000010 00000000

アドレスの形式に関するデータシートの仕様によると、これは正しいように見えます。

xxxPPPPP PPPPPPPB BBBBBBBB

どこ:

  • ×未使用
  • P ページ番号
  • Bオフセット

pageNumber = 0 を指定すると、そこに配置した正しい値が返されます。ただし、pageNumber = 1 を指定すると、以前に配置した値ではなく、255 個すべての値が取得されます。

0 以外のページのアドレスを指定するにはどうすればよいですか?

4

1 に答える 1

1

このコマンドはうまく実装されていることがわかりました。正しくなかったのは他のコマンドでした (MainMemoryPageToBufferTransfer など)。彼らは、256バイトモードで動作するチップの数学を使用してページ番号を計算していました。このチップは 264 バイト モードで動作しています。

これらのコマンドのアドレス指定を次から変更します。

SPIShift(opcode); 
SPIShift(pageNumber >> 8); 
SPIShift((unsigned short)pageNumber, 0x00));

に:

SPIShift(opcode);
SPIShift((unsigned char)(pageNumber >> 7)); 
SPIShift((unsigned char)(pageNumber << 1), 0x00));

そして、それはそれを並べ替えました。読み取り操作と書き込み操作の両方がページ番号を指定するために同じ欠陥のあるロジックを使用していたため、私のテストは合格でした。

于 2013-09-20T18:56:06.953 に答える