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

在哪里:

  • x 未使用
  • 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 回答