|
/*———————————————————— 〖說明〗24LC65 I2C EEPROM字節(jié)讀寫驅(qū)動程序,芯片A0-A1-A2要接VCC。 現(xiàn)缺頁寫、頁讀,和CRC校驗程序。以下程序經(jīng)過50臺驗證,批量的效果有待考 察。 為了安全起見,程序中很多NOP是冗余的,希望讀者能進一步精簡,但必須經(jīng)過驗 證。 51晶振為11.0592MHz 〖文件〗24LC65.c ﹫2001/03/23 〖作者〗龍嘯九天 c51@yeah.net http://mcs51.yeah.net 〖修改〗修改建議請到論壇公布 http://c51bbs.yeah.net 〖版本〗V1.00A Build 0323 —————————————————————*/ #define SDA P0_0 #define SCL P0_1
/*---------------------------------------------------------------------------- 調(diào)用方式:write_8bit(uchar ch) ﹫2001/03/23 函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。 ------------------------------------------------------------------------------*/ write_8bit(uchar ch) { uchar i=8; SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); while (i--) { SDA=(bit)(ch&0x80); _nop_();_nop_();_nop_();_nop_();_nop_(); ch<<=1; SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_(); SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); } _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
}
/*------------------------------------------------------------------------------ -- 調(diào)用方式:void ACK(void) ﹫2001/03/23 函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。 -------------------------------------------------------------------------------- -*/ void ACK(void) { SDA=1; SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); SCL=1; time_1=5; while(SDA) {if (!time_1) break;} //ACK SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); }
/*------------------------------------------------------------------------------ -- 調(diào)用方式:void Write24LC65(uint address,uchar ddata) ﹫2001/03/23 函數(shù)說明:在指定地址address(address<0x2000)寫入一個字節(jié)ddata -------------------------------------------------------------------------------- -*/ void Write24LC65(uint address,uchar ddata) { SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA SCL=0; //START write_8bit(0xae); //寫從地址 ACK(); write_8bit(address>>8); ACK(); write_8bit(address&0x00FF); ACK(); write_8bit(ddata); ACK(); SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_ ();SDA=1; //STOP _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); delay(10); }
/*------------------------------------------------------------------------------ -- 調(diào)用方式:uchar Read24LC65(uint address) ﹫2001/03/23 函數(shù)說明:讀取24LC65指定地址address(address<0x2000)的數(shù)據(jù)。 -------------------------------------------------------------------------------- -*/ uchar Read24LC65(uint address) { uchar ddata=0; uchar i=8; SDA=0;_nop_();SCL=0; //START write_8bit(0xae); //寫從地址 ACK(); write_8bit(address>>8); ACK(); write_8bit(address&0x00FF); ACK(); //以上是一個“啞”寫操作,相當于設(shè)置當前地址
SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA SCL=0; //START write_8bit(0xaf); //寫從地址,置為讀模式 ACK(); while (i--) { SDA=1; ddata<<=1; SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1; if (SDA) ddata|=0x01; }
SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_ ();SDA=1; //STOP _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); delay(5); return ddata; }
- 24c65 和24c64 可通用,俺的編程器就這樣 [haotz] [50次] 01-3-24 下午 09:50:14
- 24LC65 I2C EEPROM字節(jié)讀寫驅(qū)動程序(修正版) [龍嘯九天] [645次] 01-5-12 下午 12:27:07
修改,在讀寫EEPROM過程中關(guān)閉掉中斷,否則在同時讀寫EEPROM和串口通訊時 會有隨機的誤碼,請大家注意!
/*--------------------------------------------------------------------------- 調(diào)用方式:void Write24LC65(uint address,uchar ddata) ﹫2001/03/23 函數(shù)說明:在指定地址address(address<0x2000)寫入一個字節(jié)ddata -----------------------------------------------------------------------------*/ void Write24LC65(uint address,uchar ddata) { EA=0; SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA SCL=0; //START write_8bit(0xae); //寫從地址 ACK(); write_8bit(address>>8); ACK(); write_8bit(address&0x00FF); ACK(); write_8bit(ddata); ACK(); SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_ ();SDA=1; //STOP _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); EA=1; delay(10); }
/*------------------------------------------------------------------------------ 調(diào)用方式:uchar Read24LC65(uint address) ﹫2001/03/23 函數(shù)說明:讀取24LC65指定地址address(address<0x2000)的數(shù)據(jù)。 ------------------------------------------------------------------------------*/ uchar Read24LC65(uint address) { uchar ddata=0; uchar i=8; EA=0; SDA=0;_nop_();SCL=0; //START write_8bit(0xae); //寫從地址 ACK(); write_8bit(address>>8); ACK(); write_8bit(address&0x00FF); ACK(); //以上是一個“啞”寫操作,相當于設(shè)置當前地址 SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA SCL=0; //START write_8bit(0xaf); //寫從地址,置為讀模式 ACK(); while (i--) { SDA=1; ddata<<=1; SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1; if (SDA) ddata|=0x01; } SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_ ();SDA=1; //STOP _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); EA=1; delay(5); return ddata; }
|