新闻中心

EEPW首页>嵌入式系统>设计应用> 一个24C读写函数,支持检测器件型号

一个24C读写函数,支持检测器件型号

作者: 时间:2016-11-29 来源:网络 收藏
//------------------------------------------------------------------------------------------------------//--检测24C32器件的地址溢出//BOOL RW24(BYTE IIC_Addr,UINT Address,BOOL Type,BYTE *Data);//ADDRESS 2为猜测的最高地址BOOL Write_Test(UINT Address2,BOOL Add_Type){BYTE tmp[3];RW24(AT24C02_DeviceAdd_R,0,Add_Type,&tmp[0],1);//读出0x0000单元数据RW24(AT24C02_DeviceAdd_R,Address2,Add_Type,&tmp[1],1);//读出0x1000单元数据RW24(AT24C02_DeviceAdd_W,0,Add_Type,&TEST_DATA[1],1);//改变原有数据,避免干扰RW24(AT24C02_DeviceAdd_W,Address2,Add_Type,&TEST_DATA[0],1);//写入0xAA到单元去,产生地址溢出RW24(AT24C02_DeviceAdd_R,0,Add_Type,&tmp[2],1);//读出0000单元内容RW24(AT24C02_DeviceAdd_W,0,Add_Type,&tmp[0],1);//写回数据if(tmp[2]==0xAA)//先前改变的数据,如果产生溢出可以检测到{//RW24(AT24C02_DeviceAdd_W,0x0000,Add_Type,&tmp[0],1);//写回被(1)步骤更改的数据return TRUE;//返回正确}//RW24(AT24C02_DeviceAdd_W,0x0000,ADD_TYPE_16,&tmp[0],1);//写回数据RW24(AT24C02_DeviceAdd_W,Address2,Add_Type,&tmp[1],1);//写回数据return FALSE;}//------------调用此函数返回芯片类型BYTE Test24(){//测试24系列的容量//24C16:Address=1010 P2 P1 P0 R/WBYTE tmp[3];//// read:// 8 Bit series: |start|address_w|address|start|address_r|data|stop|// 16 bit series:|start|address_w|address|address|start|address_r|data|stop|// TEST: |START|address_w|address|start|address_r|data|stop|// write:// 8bit series: |start|address_w|address|data|stop|// 16bit series: |start|address_w|address|address|data|stop|// tmp[0]=0xff;if(RW24(AT24C02_DeviceAdd_R,0x00,ADD_TYPE_8,&tmp[0],1)==TRUE)//读出0单元{//判断是否是8bit seriesRW24(AT24C02_DeviceAdd_W,0x00,ADD_TYPE_8,&TEST_DATA[1],1);//写入AARW24(AT24C02_DeviceAdd_R,0x00,ADD_TYPE_8,&tmp[1],1);//再次读出 if(tmp[1]==0xBB){//8bit series无误//我发现我还是在实际上出错了%……实际上写页还是写的进可是只有一个页……RW24(AT24C02_DeviceAdd_W,0x00,ADD_TYPE_8,&tmp[0],1);//写回数据,RW搞错了//测试是否24C01//24C01的地址范围从0~127(0~7F),OK,向80H读出,然后写一个数据/*RW24(AT24C02_DeviceAdd_R,0x0000,ADD_TYPE_8,&tmp[0],1);//读出0x0000单元数据【0】RW24(AT24C02_DeviceAdd_R,0x0080,ADD_TYPE_8,&tmp[1],1);//读出0x80单元数据【1】RW24(AT24C02_DeviceAdd_W,0x0000,ADD_TYPE_8,&TEST_DATA[1],1);//写入0000单元防止原来数据干扰RW24(AT24C02_DeviceAdd_W,0x0080,ADD_TYPE_8,&TEST_DATA[0],1);//写入0000单元防止原来数据干扰RW24(AT24C02_DeviceAdd_R,0x0000,ADD_TYPE_8,&tmp[2],1);//写入0000单元防止原来数据干扰RW24(AT24C02_DeviceAdd_W,0x0000,ADD_TYPE_8,&tmp[0],1);//写回0单元数据if(tmp[2]==0xAA){//24C01return AT24C01;}*/if(Write_Test(0x80,ADD_TYPE_8)){return AT24C01;}//这应该是24C02 etc……绝对不可能是24C01,除非器件的80H单元正好坏了//24C16:Address=1010 P2 P1 P0 R/W//RW24(AT24C02_DeviceAdd_W,0x00,ADD_TYPE_8,&tmp[0],1);//写回原来的数据到0x80//RW24(AT24C02_DeviceAdd_W,0x80,ADD_TYPE_8,&tmp[1],1);//写回原来的数据0x00//----------------------------------------------------------------//MAX——PAGE 02 04 08 16// 000 001 011 111//-------TEST 24C02if(Page_Test(0x02)){return AT24C02;}if(Page_Test(0x06)){return AT24C04;}if(Page_Test(0x0E)){return AT24C08;}return AT24C16; }else{//AT24C32的地址范围从0~4095(0xFFF)//AT24C64从0~8191(0x1FFF)//AT24C128从0~16383(0x3FFF)//AT24C256从0~32767(0x7FFF)//AT24C512从0~65535(0xFFFF)//AT24C1024从0~65535(0xFFFF),地址中多一个P1选择位//从小试到大//测试24C1024//1010 0010 = 0x02//就是产生传说中的地址溢出了……//-----24C1024if(RW24(AT24C02_DeviceAdd_R | 0x02,0xFFFF,ADD_TYPE_16,&tmp[0],1))//读出第二页的0xFFFE{//成功代表是24C1024return AT24C1024;}//优化算法//-----24C32if(Write_Test(0x1000,ADD_TYPE_16)){return AT24C32;}//24C64if(Write_Test(0x2000,ADD_TYPE_16)){return AT24C64;}//24C128if(Write_Test(0x4000,ADD_TYPE_16)){return AT24C128;}//24C256if(Write_Test(0x8000,ADD_TYPE_16)){return AT24C32;}//-------------24C512*/return AT24C512;}}else{return SCAN_ERROR;}}

完整版本的代码下载地址:http://www.51hei.com/f/dfd33.rar

本文引用地址://m.amcfsurvey.com/article/201611/323429.htm

上一页 1 2 下一页

评论


技术专区

关闭