首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将大型缓冲区写入EEPROM

无法将大型缓冲区写入EEPROM
EN

Stack Overflow用户
提问于 2014-08-06 13:00:22
回答 1查看 1.5K关注 0票数 2

我正在尝试将M95M02-DR 256 to的EEPROM存储器芯片与MSP430微控制器连接起来。作为一个示例测试,我尝试向它写入以下字符串:

第一章“兔子洞”。爱丽丝开始厌倦了坐在她姐姐旁边的河岸,

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

第一章“兔子洞”。艾丽斯开始厌倦了坐在她妹妹旁边的b?

?s是垃圾数据。问题是,如果我将字符串的大小缩小几个字符,那么就没有问题。以前我尝试从SD卡上的文件中读取数据,然后用256字节的块写入EEPROM芯片。在这种情况下没有写任何东西。但是当我逐字节执行相同的操作时,就没有问题了。

这是我正在使用的代码

代码语言:javascript
复制
  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功能如下:

代码语言:javascript
复制
  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卡。

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-06 18:30:10

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

在您的示例中,您开始在地址0x025698上书写。

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

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

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

然后,所有的包装回到页面的开头。如果您想要编写0x25700,则实际上是向0x25600写入。

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

如果事后进行读取,您将在0x025600上看到您的其余内容。

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

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

代码语言:javascript
复制
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个字节的数据。包装器函数可以为您处理所有的分块。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25161106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档