我写了个数据保存函数,用以保存ASCⅡ码,读与写却是不匹配。。。以下是我的代码
BYTE* eepRom_Read_DevAddr(void)
{
unsigned char cnt;
const unsigned char DevIdLen = EEPROM_DEVID_END_ADDR - EEPROM_DEVID_START_ADDR;
memset(eepRomBuffer, 0, sizeof(eepRomBuffer));
for ( cnt = 0; cnt < DevIdLen; cnt++ )
eepRomBuffer[cnt] = IapReadByte(EEPROM_DEVID_START_ADDR + cnt);
return eepRomBuffer;
}
int eepRom_Save_DeviceAddress(const char* DevId)
{
unsigned char cnt = 0;
BYTE Flag_QRcodeShow = 0;
const int DevIdLen = EEPROM_DEVID_END_ADDR - EEPROM_DEVID_START_ADDR;
if ( *(DevId + DevIdLen) != '\0' || DevId == NULL )
return EEPROM_ERR_ARG; // 没有结束符或参数为NULL
Flag_QRcodeShow = IapReadByte((WORD)EEPROM_QRCODE_FLAG_ADDR);// 先保存地址二维码显示否
DebugPrint(TAG, "frist, save QRcode flag: %bu", Flag_QRcodeShow);
//***********写入eeprom************
if ( IapEraseSector(IAP_ADDRESS2) )
goto _EEPROM_ERR;
DebugPrint(TAG, "erase successes... will write data: %s", DevId);
Delay_100ms();
for ( cnt = 0; cnt < DevIdLen; cnt++ )
{
if ( IapProgramByte((EEPROM_DEVID_START_ADDR + cnt), (*(DevId + cnt))) )
{
DebugPrint(TAG, "write eepRom error");
goto _EEPROM_ERR;
}
Delay_10ms();
DebugPrint(TAG, "write byte: %bu, read: %bu", *(DevId + cnt), IapReadByte(EEPROM_DEVID_START_ADDR + cnt));
}
IapProgramByte((WORD)EEPROM_QRCODE_FLAG_ADDR, Flag_QRcodeShow);//保存地址二维码显示否
DebugPrint(TAG, "devId writting successes...");
return (strcmp(DevId, eepRom_Read_DevAddr()) == 0) ? EEPROM_OK : EEPROM_FAIL;
_EEPROM_ERR:
CLEAR_BIT(IAP_CONTR, 4); // 清除IAP错误
return (int)IapEraseSector(IAP_ADDRESS2);
}
代码中,eeprom的读写是这样实现的( Soc设置的频率为33.1776MHz )
//********************关闭IAP*******************************ok
static void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
//************************从ISP/IAP/EEPROM区域读取一字节****************************ok
static BYTE IapReadByte(WORD addr)
{
BYTE dat; //数据缓冲区
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_TPS = iapTps; //设置等待参数 ********************************************STC8C2K64S2
IAP_CMD = CMD_READ; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //读ISP/IAP/EEPROM数据
IapIdle(); //关闭IAP功能
return dat; //返回
}
//*********写一字节数据到ISP/IAP/EEPROM区域*************************************ok
static BYTE IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_TPS = iapTps; //设置等待参数 ********************************************STC8C2K64S2
IAP_CMD = CMD_PROGRAM; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写ISP/IAP/EEPROM数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle(); //关闭IAP功能
return FIND_BIT(IAP_CONTR, 4);
}
//**************************************扇区擦除************************************ok
static BYTE IapEraseSector(WORD addr)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_ERASE; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle(); //关闭IAP功能
return FIND_BIT(IAP_CONTR, 4);
}
按照正常来说,我那保存字符串到eeprom的函数应该是正常生效的。但实际上却出错了,打印了以下的log
[eepRom]:frist, save QRcode flag: 255
[eepRom]:erase successes... will write data: BCDE
[eepRom]:write byte: 66, read: 0
[eepRom]:write byte: 67, read: 1
[eepRom]:write byte: 68, read: 0
[eepRom]:write byte: 69, read: 65
[eepRom]:devId writting successes...
[protocol]:save DevId status: fail
而我的另一个同样也是保存数据到eeprom的函数,读与写对比却是没有问题的
BYTE* eepRom_Read_Name(const int index)
{
BYTE MaxCnt = 0, cnt = 0;
memset(eepRomBuffer, 0, sizeof(eepRomBuffer));
switch ( index )
{
case 1:
{
MaxCnt = IapReadByte(EEPROM_NAME1_CNT_ADDR);
for ( cnt = 0; cnt < MaxCnt; cnt++ )
{
eepRomBuffer[cnt] = IapReadByte(EEPROM_NAME1STR_ADDR + cnt);
}
}break;
case 2:
{
MaxCnt = IapReadByte(EEPROM_NAME2_CNT_ADDR);
for ( cnt = 0; cnt < MaxCnt; cnt++ )
{
eepRomBuffer[cnt] = IapReadByte(EEPROM_NAME2STR_ADDR + cnt);
}
}break;
case 3:
{
MaxCnt = IapReadByte(EEPROM_NAME3_CNT_ADDR);
for ( cnt = 0; cnt < MaxCnt; cnt++ )
{
eepRomBuffer[cnt] = IapReadByte(EEPROM_NAME3STR_ADDR + cnt);
}
}break;
case 4:
{
MaxCnt = IapReadByte(EEPROM_NAME4_CNT_ADDR);
for ( cnt = 0; cnt < MaxCnt; cnt++ )
{
eepRomBuffer[cnt] = IapReadByte(EEPROM_NAME4STR_ADDR + cnt);
}
}break;
default:
DebugPrint(TAG, "ReadName index fail");
return NULL;
}
return eepRomBuffer;
}
BYTE eepRom_Read_NameLen(const int index)
{
BYTE len = 0;
switch ( index )
{
case 1:
len = IapReadByte(EEPROM_NAME1_CNT_ADDR);
break;
case 2:
len = IapReadByte(EEPROM_NAME2_CNT_ADDR);
break;
case 3:
len = IapReadByte(EEPROM_NAME3_CNT_ADDR);
break;
case 4:
len = IapReadByte(EEPROM_NAME4_CNT_ADDR);
break;
default:
DebugPrint(TAG, "ReadNameLen index fail");
break;
}
return len;
}
int eepRom_Save_Name(const char* Name, const unsigned int len, const unsigned int index)
{
unsigned int cnt = 0;
const unsigned int MaxCnt = EEPROM_NAME_END_ADDR - EEPROM_NAME_START_ADDR;
const unsigned char DataHead = EEPROM_NAME1STR_ADDR - EEPROM_NAME_START_ADDR;
//BYTE tmpSave[EEPROM_NAME_MAX_LEN] = {0};
if ( Name == NULL || len == 0 )
return EEPROM_ERR_ARG;
memset(eepRomBuffer, 0, sizeof(eepRomBuffer));
// 先读出数据
for ( cnt = 0; cnt < MaxCnt; cnt++ )
{
eepRomBuffer[cnt] = IapReadByte(EEPROM_NAME_START_ADDR);
}
switch ( index )
{
case 1:
{
eepRomBuffer[0] = len;
memcpy(eepRomBuffer + DataHead, Name, len);
}break;
case 2:
{
eepRomBuffer[1] = len;
memcpy(eepRomBuffer + DataHead + (EEPROM_NAME_MAX_LEN * 1), Name, len);
}break;
case 3:
{
eepRomBuffer[2] = len;
memcpy(eepRomBuffer + DataHead + (EEPROM_NAME_MAX_LEN * 2), Name, len);
}break;
case 4:
{
eepRomBuffer[3] = len;
memcpy(eepRomBuffer + DataHead + (EEPROM_NAME_MAX_LEN * 3), Name, len);
}break;
default:
DebugPrint(TAG, "SaveName index fail");
return EEPROM_ERR_ARG;
}
if ( IapEraseSector(EEPROM_NAME_START_ADDR) )
goto _EEPROM_ERROR;
for ( cnt = 0; cnt < MaxCnt; cnt++ )
{
if ( IapProgramByte(EEPROM_NAME_START_ADDR + cnt, eepRomBuffer[cnt]) )
goto _EEPROM_ERROR;
}
DebugPrint(TAG, "SaveName successes");
return (memcmp(eepRom_Read_Name(index), Name, len) == 0) ? EEPROM_OK : EEPROM_FAIL;
_EEPROM_ERROR:
DebugPrint(TAG, "erase or write error");
return IapEraseSector(EEPROM_NAME_START_ADDR);
}
[eepRom]:SaveName successes
[protocol]:1-Save name status: ok
[protocol]:Show string
[FrontLib]:parse fail
[protocol]:2-Display GB2312 status: FAIL, cnt: 0
[FrontLib]:parse fail
[protocol]:2-Display GB2312 status: FAIL, cnt: 0
[BT_Model]:parse status: ok
[main]:recv data ok
这么看起来,两个函数的保存与读取其实并没有什么区别。但函数 eepRom_Save_DeviceAddress()
就是返回了错误值。希望大佬能指导我该如何分析🙏🙏🙏