Memory 无法将大缓冲区写入EEPROM

Memory 无法将大缓冲区写入EEPROM,memory,embedded,msp430,eeprom,Memory,Embedded,Msp430,Eeprom,我正在尝试将M95M02-DR 256KB EEPROM内存芯片与MSP430微控制器连接。作为示例测试,我尝试将以下字符串写入其中: 第一章,兔子洞。爱丽丝开始厌倦了坐在她姐姐旁边的银行 当我试图从芯片读取数据时,我得到的是: 第一章,兔子洞。爱丽丝开始对坐在她姐姐旁边的床上感到非常厌倦 这些都是垃圾数据。问题是,如果我将字符串的大小减少几个字符,那么就没有问题了。以前我试着从SD卡上的文件中读取数据,然后以256字节的块写入EEPROM芯片。那个箱子里什么也没写。但是当我逐字节执行相同的操作

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

第一章,兔子洞。爱丽丝开始厌倦了坐在她姐姐旁边的银行

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

第一章,兔子洞。爱丽丝开始对坐在她姐姐旁边的床上感到非常厌倦

这些都是垃圾数据。问题是,如果我将字符串的大小减少几个字符,那么就没有问题了。以前我试着从SD卡上的文件中读取数据,然后以256字节的块写入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\u sendFrame
EEPROM\u readFrame
工作正常,因为我也将它们用于SD卡

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


谢谢

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

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

页面{start=0x025600,offset=0x98}

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

页面{start=0x025600,offset=0xFF}

然后所有内容都回到页面的开头。你想在哪里写作 0x25700,您实际上正在向0x25600写入

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

如果您稍后阅读,您将在下面的0x025600处看到剩余内容

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

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

无效eeprom写入(uint32地址、uint8数据、uint32数据)
{
而(0

这还使您能够传入长度超过256字节的数据。包装器函数可以为您处理所有的分块。

好主意!在一个页面中写入wrap,但在到达整个设备的末尾时仅读取wrap,因此错误的数据显示写入到页面的起始位置,但读取继续进入下一页。因此我必须手动检查
eeprom\u write()
函数中的wrap-around?该死,是的,你得检查一下。这就是我们为廉价可靠的硬件所付出的代价。不过,它不必非常复杂。我将在我的答案中添加一些示例代码。@HarryTsai Man我希望我能再次投票支持你的答案。:)。Meri beacup mon ami.@HarryTsai但对数据长度使用uint32_t不会导致endian ism出现问题吗?
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;
  }
}