次のコードを使用して、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 以外のページのアドレスを指定するにはどうすればよいですか?