无法将大缓冲区写入EEPROM

Sum*_*Roy 2 memory embedded msp430 eeprom

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

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

当我尝试从芯片中读取数据时,这就是我得到的:

第一章.兔子洞.爱丽丝开始厌倦了坐在姐姐身边的b ?????

?是垃圾数据.问题是,如果我将字符串的大小减少几个字符,那么就没有问题了.以前我曾尝试从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
Run Code Online (Sandbox Code Playgroud)

低级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();

  }
Run Code Online (Sandbox Code Playgroud)

EEPROM_sendFrameEEPROM_readFrame我使用他们的SD卡以及工作正常.

任何帮助都将不胜感激.如果有任何我忘记提及的信息,请告诉我,我会添加它.

谢谢

Har*_*sai 5

你正在打页面边界.所有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;
  }
}
Run Code Online (Sandbox Code Playgroud)

这也使您能够传入超过256个字节的数据.包装函数可以为您处理所有这些组块.