|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
I2C函數(shù)怎么理解? |
| 作者:wangyibo 欄目:單片機 |
使用pic的i2c模塊,有點問題,想請教大家,這是在他官方網(wǎng)站下的程序,是從I2C decive讀8個字節(jié)的函數(shù): EE_SEQU_Read(unsigned CHAR CTRL,unsigned CHAR addr,unsigned CHAR length,unsigned CHAR *dptr) { IdleI2C(); // ensure MODULE is idle StartI2C(); // Start condition I2C_Done(); // Wait Start condition completed WriteI2C(CTRL); // Write CONTROL to EEPROM while(SSPCON2bits.ACKSTAT) ; // TEST for ACK condition, if I2C_Done(); // Clear SSPIF flag WriteI2C(addr); // Write Address to EEPROM //SSPBUF=addr; while(SSPCON2bits.ACKSTAT); // TEST for ACK condition, if I2C_Done(); // Clear SSPIF flag RestartI2C(); // initiate Restart condition I2C_Done(); i=0; WriteI2C(CTRL+1); // Write CONTROL to EEPROM while(SSPCON2bits.ACKSTAT) ; // TEST for ACK condition, if received I2C_Done(); // Clear SSPIF flag while (length!=0) { *dptr=ReadI2C(); // Enable I2C RECEIVER & Store EEPROM data to Point buffer I2C_Done(); dptr++; length--; if (length==0) NotAckI2C(); else AckI2C(); // Continue read next data, send a acknowledge to EEPROM I2C_Done(); } StopI2C(); // send STOP condition I2C_Done(); // wait until stop condition is over } |
| 2樓: | >>參與討論 |
| 作者: wangyibo 于 2006/8/21 21:57:00 發(fā)布:
I2C函數(shù)怎么理解?(續(xù)) 使用pic的i2c模塊,有點問題,想請教大家,這是在他官方網(wǎng)站下的程序,是從I2C decive讀8個字節(jié)的函數(shù): EE_SEQU_Read(unsigned CHAR CTRL,unsigned CHAR addr,unsigned CHAR length,unsigned CHAR *dptr) { IdleI2C(); // ensure MODULE is idle StartI2C(); // Start condition I2C_Done(); // Wait Start condition completed WriteI2C(CTRL); // Write CONTROL to EEPROM while(SSPCON2bits.ACKSTAT) ; // TEST for ACK condition, if I2C_Done(); // Clear SSPIF flag WriteI2C(addr); // Write Address to EEPROM //SSPBUF=addr; while(SSPCON2bits.ACKSTAT); // TEST for ACK condition, if I2C_Done(); // Clear SSPIF flag RestartI2C(); // initiate Restart condition I2C_Done(); i=0; WriteI2C(CTRL+1); // Write CONTROL to EEPROM while(SSPCON2bits.ACKSTAT) ; // TEST for ACK condition, if received I2C_Done(); // Clear SSPIF flag while (length!=0) { *dptr=ReadI2C(); // Enable I2C RECEIVER & Store EEPROM data to Point buffer I2C_Done(); dptr++; length--; if (length==0) NotAckI2C(); else AckI2C(); // Continue read next data, send a acknowledge to EEPROM I2C_Done(); } StopI2C(); // send STOP condition I2C_Done(); // wait until stop condition is over } 1,關(guān)于函數(shù)WriteI2C(CTRL); 可否該為:SSPBUF=CTRL. 其實WriteI2C(CTRL);最終也是將CTRL給值給SSPBUF寄存器的.我改過,好象有問題,不一樣. 2,但外部的i2c decive沒有插上時,或者沒上電時(設(shè)計有這個要求),那么程序就在死循環(huán)了,當(dāng)然我可以在while(SSPCON2bits.ACKSTAT) ; 加語句改,但是死循環(huán)還沒到這句就已經(jīng)開始了,實際上在調(diào)這句WriteI2C(CTRL); 是就開始,那么出現(xiàn)這樣情況怎么從死循環(huán)推出了?(WriteI2C(CTRL); 是系統(tǒng)提供的庫函數(shù),是不沒辦法改造。浚 謝謝! |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |