gpt4 book ai didi

memory - 无法将大缓冲区写入 EEPROM

转载 作者:行者123 更新时间:2023-12-02 08:32:39 26 4
gpt4 key购买 nike

我正在尝试将 M95M02-DR 256KB EEPROM 存储芯片与 MSP430 微 Controller 连接起来。作为示例测试,我尝试向其中写入以下字符串:

CHAPTER I. Down the Rabbit-Hole. Alice was beginning to get very tired of sitting by her sister on the bank,

当我尝试从芯片读回数据时,我得到的是:

CHAPTER I. Down the Rabbit-Hole. Alice was beginning to get very tired of sitting by her sister on the b?????

? 是垃圾数据。问题是,如果我将字符串的大小减少几个字符,那就没有问题了。之前我曾尝试从 SD 卡上的文件中读取数据,并以 256 字节 block 的形式写入 EEPROM 芯片。那种情况下什么也没写。但是当我逐字节执行相同的操作时,就没有问题了。

这是我正在使用的代码

  static uint32_t i=0x025698;

static unsigned char message[120] = "CHAPTER I. Down the Rabbit-Hole."\
"Alice was beginning to get very tired of sitting by her sister on the bank, ";

static int size ;

unsigned char input[120];

size = strlen(message);

eeprom_spi_init();
eeprom_write( i ,message,size);

__delay_cycles(2500);

eeprom_read( i, input,size);

input[size]='\0';

ax_log_msg(E_LOG_INFO,input); //print command

低级 SPI 函数如下:

  void eeprom_write(uint32_t ui_addr, uint8_t *puc_wrData, uint8_t ui_dataLen)
{

uint8_t uac_wrBuf[260] = {0x00,};
uint8_t i = 0;

EEPROM_wrEnable();

uac_wrBuf[i++] = WRITE; /* Write Instruction */
uac_wrBuf[i++] = (uint8_t)((ui_addr >> 16) & 0xFF); /* First 8-bit MSB of 24-bit address */
uac_wrBuf[i++] = (uint8_t)((ui_addr >> 8) & 0xFF); /* Second 8-bit MSB of 24-bit address */
uac_wrBuf[i++] = (uint8_t)((ui_addr) & 0xFF); /* Third 8-bit MSB of 24-bit address */

while(ui_dataLen--) {
uac_wrBuf[i++] = *puc_wrData++;
}
uac_wrBuf[i++] = 0xFF;

EEPROM_ON();
EEPROM_sendFrame(uac_wrBuf, i);
EEPROM_OFF();

__delay_cycles(250000);
}



void eeprom_read(uint32_t ui_addr, uint8_t *puc_wrData, uint8_t ui_dataLen)
{

uint8_t uac_rdBuf[260] = {0x00,};
uint8_t uac_rdCmd[4];
uint8_t i = 0;

uac_rdCmd[i++] = READ;
uac_rdCmd[i++] = (uint8_t)((ui_addr >> 16) & 0xFF); /* First 8-bit MSB of 24-bit address */
uac_rdCmd[i++] = (uint8_t)((ui_addr >> 8) & 0xFF); /* Second 8-bit MSB of 24-bit address */
uac_rdCmd[i++] = (uint8_t)((ui_addr) & 0xFF); /* Third 8-bit MSB of 24-bit address */

EEPROM_ON();
EEPROM_sendFrame(uac_rdCmd, i);
EEPROM_readFrame(puc_wrData, ui_dataLen);
EEPROM_OFF();

}

EEPROM_sendFrameEEPROM_readFrame 工作正常,因为我也将它们用于 SD 卡。

如有任何帮助,我们将不胜感激。如果有什么我忘记提及的信息,请告诉我,我会添加。

谢谢

最佳答案

您遇到了页面边界。所有 EEPROM 每次事务只能写入一页。 M95M02 有 256 字节页面,因此在对 eeprom_write 的任何一次调用中,所有目标地址都必须在每个字节中匹配,除了最低有效字节之外。

在您的示例中,您从地址 0x025698 开始写入。

page{start=0x025600, offset=0x98}

每个数据字节都会自动递增,直到到达页面末尾。

page{start=0x025600, offset=0xFF}

然后一切都会回到页面的开头。你想写的地方0x25700,您实际上正在写入0x25600。

page{start=0x025600, offset=0x00 = 0x100 & 0xFF}

如果您随后进行阅读,您将在 0x025600 处看到其余内容。

要解决此问题,您必须将写入分解为不跨越页面边界的段。

这里有一个建议:将当前的 eeprom_write 重命名为 eeprom_write_page 并用以下代码包装它(对任何错误表示歉意 - 我没有时间实际编译它):

void eeprom_write(uint32_t addr, uint8_t* data, uint32_t datalen)
{
while (0 < datalen)
{
uint32_t pagelen = (addr|0xFF) - addr + 1;
uint32_t writelen = min(datalen, pagelen);

eeprom_write_page(addr, data, (uint8_t)writelen);

addr += writelen;
data += writelen;
datalen -= writelen;
}
}

这还为您带来了能够传递超过 256 字节的数据的好处。包装函数可以为您处理所有的分块工作。

关于memory - 无法将大缓冲区写入 EEPROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25161106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com