通过这些方法我们就可以实现IC型号的判断了:
/**************************************************************************************
* FunctionName : ATC_ReadType()
* Description : 写器件型号
* EntryParameter : None
* ReturnValue : 返回卡片类型
**************************************************************************************/
void ATC_ReadType(void)
{
u8 i;
u8 tmpBuf[3] = {0};
u8 tmpDat[3] = {0};
ATC_ICType = AT24C32;
ATCReadNByte(0, tmpBuf, 1); // 读取双地址0的一字节暂存
ATC_ICType = AT24C16;
ATCReadNByte(0, &tmpBuf[1], 2); // 读取单地址0的二字节暂存
ATC_ICType = AT24C32;
ATCWriteNByte(0, "\xA5", 1); // 按照双地址格式写入一字节数据
ATCReadNByte(0, tmpDat, 1); // 按照双地址格式读取一字节数据
ATC_ICType = AT24C16;
ATCReadNByte(0, &tmpDat[1], 2); // 按照单地址格式读取二字节数据
if ((tmpDat[1] == 0x00) && (tmpDat[2] == 0xA5)) // 单地址芯片
{
ATCWriteNByte(0, &tmpBuf[1], 2); // 恢复数据
//-------------------------------- AT24c04/08/16 -----------------------
for (i=AT24C16; i>AT24C02; i--) // AT24c04/08/16
{
ATC_ICType = i;
ATCReadByte(ATC_Par.MaxAddr, &tmpBuf[0]);
ATCWriteByte(ATC_Par.MaxAddr, 0xAA);
ATCReadByte(ATC_Par.MaxAddr, &tmpDat[0]);
ATCWriteByte(ATC_Par.MaxAddr, tmpBuf[0]);
if (tmpDat[0] == 0xAA)
{
return ;
}
}
//-------------------------------- AT24c01/02 --------------------------
ATC_ICType = AT24C02;
ATCReadByte(0, &tmpBuf[0]);
ATCReadByte(128, &tmpBuf[1]);
ATCWriteByte(0, 0xAA);
ATCWriteByte(128, 0x55);
ATCReadByte(0, &tmpDat[0]);
ATCReadByte(128, &tmpDat[1]);
ATCWriteByte(0, tmpBuf[0]);
ATCWriteByte(128, tmpBuf[1]);
ATC_ICType = (tmpDat[0] == 0x55) ? AT24C01 : AT24C02;
return ;
}
else
{
if (tmpDat[0] == 0xA5) // 双地址芯片
{
ATC_ICType = AT24C256;
ATCWriteNByte(0, &tmpBuf[0], 1); // 恢复数据
//-------------------------------- AT24c32/64/128/256 --------------
for (i=AT24C256; i>AT24C16; i--)
{
ATC_ICType = i;
ATCReadByte(0, &tmpBuf[0]);
ATCReadByte(ATC_Par[i-1].Capacity, &tmpBuf[1]);
ATCWriteByte(0, 0xAA);
ATCWriteByte(ATC_Par[i-1].Capacity, 0x55);
ATCReadByte(0, &tmpDat[0]);
ATCReadByte(ATC_Par[i-1].Capacity, &tmpDat[1]);
ATCWriteByte(0, tmpBuf[0]);
ATCWriteByte(ATC_Par[i-1].Capacity, tmpBuf[1]);
if ((tmpDat[0] == 0xAA) && (tmpDat[1] == 0x55))
{
return ;
}
}
ATC_ICType = AT24C256;
return ;
}
else // 非AT系列芯片
{
ATC_ICType = ATC_TYP_MAX;
return ;
}
}
}
引用: feng_mailx 发表于 2016-3-10 15:35
楼主这个方法验证过嘛? 如果EEPROM存的数据量较大,这样子判断岂不是会造成已存的数据错误?