【问题标题】:How to perform Continuous Array Read for ATMEL Flash Chip AT45DB081D如何对 ATMEL 闪存芯片 AT45DB081D 执行连续阵列读取
【发布时间】:2013-09-20 18:44:11
【问题描述】:

我正在尝试使用以下代码通过 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 以外的任何页面读取内容。这让我相信问题在于我指定页面的数学有缺陷。

在调试中发现,对于page 1,offset 0,24位地址计算为:

00000000 00000010 00000000

根据地址格式的数据表规范,这看起来是正确的:

xxxPPPPP PPPPPPPB BBBBBBBB

地点:

  • x 未使用
  • P 页码
  • B 偏移

当我指定 pageNumber = 0 时,我得到了放在那里的正确值。但是,当我指定 pageNumber = 1 时,我得到所有 255 个值,而不是我之前放置在那里的值。

0以外的页面如何指定地址?

【问题讨论】:

    标签: c embedded spi z80


    【解决方案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));
    

    然后排序。我的测试通过了,因为读取和写入操作都使用了相同的有缺陷的逻辑来指定页码,这让我相信它们工作正常。

    【讨论】:

      猜你喜欢
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多