我试图将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
低电平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_sendFrame
和EEPROM_readFrame
工作正常,因为我也将它们用于SD卡。
任何帮助都将不胜感激。如果有任何我忘记提及的信息,请告诉我,我会加上它。
由于
答案 0 :(得分:5)
您正在点击页面边界。所有EEPROM每次事务只能写入一页。 M95M02具有256字节页面,因此在对eeprom_write的任何单个调用中,除了最不重要的字节之外,所有目标地址都必须匹配。
在您的示例中,您开始在地址0x025698处写入。
页面{start = 0x025600,offset = 0x98}
每个数据字节自动递增,直到您到达页面末尾。
页面{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个字节的数据的好处。包装函数可以为您处理所有这些组块。