|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
24c64的問題 |
| 作者:sophiewang 欄目:單片機(jī) |
/*********************24C64.html">24C64讀寫操作************************/ /************ 啟動總線 *************/ void Start() { SDA=1; /*發(fā)送起始條件的數(shù)據(jù)信號*/ _nop_(); SCL=1; _nop_(); _nop_(); SDA=0; /*發(fā)送起始信號*/ _nop_(); _nop_(); SCL=0; /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */ } /*************************************************************************** 停止IIC總線 ****************************************************************************/ void Stop() { SCL=0; _nop_(); SDA=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/ _nop_(); SCL=1; /*發(fā)送結(jié)束條件的時鐘信號*/ _nop_(); SDA=1; } /*************************************************************************** 對總線產(chǎn)生應(yīng)答 ****************************************************************************/ void Ack() { SDA=0; /*在此發(fā)出應(yīng)答信號 */ _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); SCL=0; /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/ _nop_(); _nop_(); SDA=1; } /*************************************************************************** 不對總線產(chǎn)生應(yīng)答 ****************************************************************************/ void NoAck() { SDA=1; /*在此發(fā)出非應(yīng)答信號 */ _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); SCL=0; /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/ } /*************************************************************************** 檢查應(yīng)答位 /***************************************************************************/ bit TestAck() { SDA=1;_nop_(); SCL=0;_nop_(); SCL=1;_nop_(); _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); if(SDA==1)return(1); SCL=0;_nop_(); return(0); } /*************************************************************************** 向IIC總線寫一字節(jié)數(shù)據(jù) ****************************************************************************/ void Send(uchar input) { uchar j=8; SCL=0;_nop_(); while(j--) { SDA=(bit)(input&0x80);_nop_(); input=input<<1; SCL=1;_nop_(); SCL=0;_nop_(); } } /*************************************************************************** 向24C64寫入多字節(jié) 輸入:地址指針,E2ROM地址,字節(jié)數(shù) ****************************************************************************/ uchar Write24C64.html">24C64(uchar *Wdata,uint RomAddr,uchar num) { uchar VALUE; Start(); Send(WriteDeviceAddr); //設(shè)置控制字 if(TestAck()==1)return(1); VALUE=RomAddr/256; Send(VALUE); if(TestAck()==1)return(1); VALUE=RomAddr%256; Send(VALUE); if(TestAck()==1)return(1); for(;num>0;num--) { Send(*Wdata); Wdata++; if(TestAck()==1)return(1); } Stop(); delayNms(100); return(0); } /************************* 向24C64寫入單字節(jié) 輸入:E2ROM地址,數(shù)據(jù) *************************/ uchar Write24C64.html">24C64_byte(uint address,uchar ddata) { uchar VALUE; Start(); Send(WriteDeviceAddr); _nop_(); if(TestAck()==1)return(1); VALUE=address/256; Send(VALUE); _nop_(); if(TestAck()==1)return(1); VALUE=address%256; Send(VALUE); _nop_(); if(TestAck()==1)return(1); Send(ddata); _nop_(); if(TestAck()==1)return(1); Stop(); delayNms(100); return(0); } /*************************************************************************** 從IIC總線上讀一字節(jié)數(shù)據(jù) ****************************************************************************/ uchar Receive() { uchar j=8,rbyte=0; while(j--) { SCL=1; rbyte=rbyte<<1; rbyte=rbyte|SDA; SCL=0;_nop_();_nop_(); } return(rbyte); } /*************************************************************************** 向 24C64.html">24C64讀多字節(jié); 輸入:存放的地址指針,E2ROM地址,字節(jié)數(shù) ****************************************************************************/ uchar Read24C64.html">24C64(uchar *RamAddr,uint RomAddr,uchar bytes) { uchar VALUE; Start(); Send(WriteDeviceAddr); delayNms(1); if(TestAck()==1)return(1); VALUE=RomAddr/256; Send(VALUE); delayNms(1); if(TestAck()==1)return(1); VALUE=RomAddr%256; Send(VALUE); delayNms(1); if(TestAck()==1)return(1); delayNms(10); Start(); Send(ReadDviceAddr); delayNms(1); if(TestAck()==1)return(1); while(bytes) { *RamAddr=Receive(); Ack(); RamAddr++; bytes--; } NoAck(); Stop(); delayNms(100); return(0); } 數(shù)據(jù)寫入正常,讀出不太穩(wěn)定,有時必須讀兩次才能讀出正確的值. |
| 2樓: | >>參與討論 |
| 作者: isoar 于 2006/1/23 16:24:00 發(fā)布:
寫入之后不要馬上讀,加個延時后再讀試試 |
|
| 3樓: | >>參與討論 |
| 作者: 后學(xué) 于 2006/1/23 16:58:00 發(fā)布:
看datasheet上寫的需要多少延時 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |