|
判断出卡片型号是必须的,但绝对不能破坏数据,为此我们还必须想办法解决这一问题:
下面我们谈谈另外一思路:通过页和地址来实现。
我们知道AT24C01为8字节一页, AT24C02/04/08/16为16字节一页, AT24C32/64为32字节为一页, AT24C128/256为64字节为一页。我们完全可以通过写页数据,通过判断是否有数据被覆盖实现,过程如下:
写入16字节数据->读写一致为AT24C02/04/08/16中一种,否则判断8字节是否一致,一致为AT24C01,否则为其他->通过写最大地址判断是否覆盖,来判断究竟是AT24C02/04/08/16中的那一致。其他型号过程一致,代码如下:- ATC_TYP ATCReadType(void)
- {
- u8 i;
- u8 tmpBuf[64] = {0};
- u8 tmpDat[64] = {0};
- u8 cmpDat[64] = {0};
-
- //--------------------------------- 单地址判断 -----------------------------
- for (i=0; i<16; i++) // 初始化
- {
- tmpDat[i] = i;
- cmpDat[i] = i;
- }
-
- // AT24C01的页为8字节,AT24C02/04/08/16的页为16字节
- // 通过读写16来判断页大小,从而区分AT24C01
- ATCReadNByte(AT24C02, 0, tmpBuf, 16); // 数据暂存
- ATCWriteNByte(AT24C02, 0, tmpDat, 16); // 写入验证数据
- memset(tmpDat, 0, 16);
- ATCReadNByte(AT24C02, 0, tmpDat, 16); // 读验证数据
-
- if (memcmp(tmpDat, cmpDat, 16) == 0) // AT24C02/04/08/16
- {
- ATCWriteNByte(AT24C02, 0, tmpBuf, 16); // 恢复数据
-
- // AT24C02/04/08/16中,通过页地址共同组成地址,故可以通过页区别型号
- for (i=4; i>0; i--)
- {
- ATCReadByte((ATC_TYP)(i), ATC_Par[(ATC_TYP)(i)].MaxAddr, &tmpDat[0]);
- ATCWriteByte((ATC_TYP)(i), ATC_Par[(ATC_TYP)(i)].MaxAddr, 0xAA);
- ATCReadByte((ATC_TYP)(i), ATC_Par[(ATC_TYP)(i)].MaxAddr, &tmpDat[1]);
- if (tmpDat[1] == 0xAA)
- {
- ATCWriteByte((ATC_TYP)(i), ATC_Par[(ATC_TYP)(i)].MaxAddr, tmpDat[0]);
- return ((ATC_TYP)(i));
- }
- }
- }
- else
- {
- if (memcmp(&tmpDat[8], cmpDat, 8) == 0) // AT24C01
- {
- ATCWriteNByte(AT24C01, 0, tmpBuf, 8); // 恢复数据
- return AT24C01;
- }
- }
- //--------------------------------- 双地址判断 -----------------------------
- for (i=0; i<64; i++) // 初始化
- {
- tmpDat[i] = i;
- cmpDat[i] = i;
- }
-
- ATCReadNByte(AT24C128, 0, tmpBuf, 64); // 数据暂存
- ATCWriteNByte(AT24C128, 0, tmpDat, 64); // 写入验证数据
- memset(tmpDat, 0, 64);
- ATCReadNByte(AT24C128, 0, tmpDat, 64); // 读验证数据
-
- if (memcmp(tmpDat, cmpDat, 64) == 0) // AT24C128/256
- {
- ATCWriteNByte(AT24C128, 0, tmpBuf, 64); // 恢复数据
-
- ATCReadByte(AT24C256, 0, &tmpDat[0]);
- ATCReadByte(AT24C256, ATC_Par[AT24C128].Capacity, &tmpDat[1]);
-
- ATCWriteByte(AT24C256, 0, 0xAA);
- ATCWriteByte(AT24C256, ATC_Par[AT24C128].Capacity, 0x55);
-
- ATCReadByte(AT24C256, 0, &tmpDat[2]);
- ATCReadByte(AT24C256, ATC_Par[AT24C128].Capacity, &tmpDat[3]);
- if ((tmpDat[2] == 0xAA) && (tmpDat[3] == 0x55))
- {
- ATCWriteByte(AT24C256, 0, tmpDat[0]);
- ATCWriteByte(AT24C256, ATC_Par[AT24C128].Capacity, tmpDat[1]);
- return AT24C256;
- }
- else
- {
- ATCWriteByte(AT24C128, 0, tmpDat[0]);
- return AT24C128;
- }
- }
- else // AT24C128/256
- {
- if (memcmp(&tmpDat[32], cmpDat, 32) == 0)
- {
- ATCWriteNByte(AT24C64, 0, tmpBuf, 32);
- ATCReadByte(AT24C64, 0, &tmpDat[0]);
- ATCReadByte(AT24C64, ATC_Par[AT24C32].Capacity, &tmpDat[1]);
-
- ATCWriteByte(AT24C64, 0, 0xAA);
- ATCWriteByte(AT24C64, ATC_Par[AT24C32].Capacity, 0x55);
-
- ATCReadByte(AT24C64, 0, &tmpDat[2]);
- ATCReadByte(AT24C64, ATC_Par[AT24C32].Capacity, &tmpDat[3]);
- if ((tmpDat[2] == 0xAA) && (tmpDat[3] == 0x55))
- {
- ATCWriteByte(AT24C64, 0, tmpDat[0]);
- ATCWriteByte(AT24C64, ATC_Par[AT24C32].Capacity, tmpDat[1]);
- return AT24C64;
- }
- else
- {
- ATCWriteByte(AT24C32, 0, tmpDat[0]);
- return AT24C32;
- }
- }
- }
- return ATC_TYP_MAX;
- }
复制代码 具体代码不再分析,代码确实能够实现型号识别,但是否破坏数据,暂时还没有发现,大家不妨试试,如果破坏了数据,我们再做进一步分析并改善。 |
|