我正在尝试使用以下代码通过 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
在哪里:
- x 未使用
- P 页码
- B 偏移
当我指定 pageNumber = 0 时,我得到了放在那里的正确值。但是,当我指定 pageNumber = 1 时,我得到所有 255 个值,而不是我之前放置在那里的值。
0以外的页面如何指定地址?