|
lp2323 發(fā)表于 2020-8-14 11:18 謝謝大佬的指教。 |
Y_G_G 發(fā)表于 2020-8-14 13:57 好的,謝謝哈 |
梯度 發(fā)表于 2020-8-14 11:45 I2cReadRespon后面不是完整的代碼,沒有看到時鐘的操作 讀取數(shù)據(jù)的應(yīng)答是為了告訴IIC器件下一個動作要做什么 應(yīng)答:繼續(xù)輸出數(shù)據(jù) 不應(yīng)答:停止輸出數(shù)據(jù) |
Y_G_G 發(fā)表于 2020-8-13 22:03 哪為什么I2cReadRespon哪里注釋了呢? |
| 首先baiIIC通信要分清主機與從機的關(guān)系,在du主機對從機進行寫操zhi作時,一般dao是在傳送完一個數(shù)據(jù)之后單片機就進入檢測應(yīng)答信號狀態(tài):先將兩個腳置位SDA=1;SCL=1;然后在一定時間內(nèi)不斷檢測SDA腳的電平狀態(tài),比如說你弄個循環(huán)for(i=255;i>0;i--){..;if(...)break;...}進行不斷判斷,當SDA的電平為低時就跳出循環(huán),說明此時從機已經(jīng)ACK,就可說明是I2C器件拉低;如果為高時,則一直判斷完整個循環(huán),到最后還為高時,就說明沒有應(yīng)答。 2、寫應(yīng)答和讀應(yīng)答肯定有所區(qū)別的。寫應(yīng)答是在你讀從機數(shù)據(jù)期間,當你接收到一個數(shù)據(jù)時,可以應(yīng)答的(想繼續(xù)通信就應(yīng)答),就將SDA復(fù)位(拉低),不想應(yīng)答(想結(jié)束通信時)就置位(SDA=1)。讀應(yīng)答則在主機寫數(shù)據(jù)給從機期間,每當從機接收到一個數(shù)據(jù)就會應(yīng)答一下(將數(shù)據(jù)SDA線拉低),主機將不斷檢測SDA線的電平,主機就是憑SDA的電平狀態(tài)才知道從機是否已經(jīng)正確地接收了主機發(fā)送的 |
|
應(yīng)答就是從機告訴主機我在聽你說話,你可以繼續(xù)說。如果從機不在聽主機說話,那么主機就不會接著往下說了。 51里面如果把io口置高就是輸入模式。如果置低就是輸出模式,顯然應(yīng)答是要把io口置高來接收從機的信息。 |
|
應(yīng)答: 200us時間內(nèi),等待從機回答一個ACK信號(就是拉低SDA);如果超過200us,從機不會答,則拉低SCL,等待下一個操作。 I2cReadRespon怎么注釋了 這個有沒有后續(xù)程序? 如果沒有的話,I2CReadByte()函數(shù)最后第三步 把SCL 拉低了,就不用再重復(fù)低SCL。 |
| 還有在主機發(fā)送應(yīng)答哪里,等待應(yīng)答是SCL=1,不是應(yīng)該為零才對嘛? |
|
C語言不會 IIC的應(yīng)答是這樣子的:不管是讀還是寫,每8個位(一個字節(jié))之后,一定要有一個應(yīng)答. 向IIC器件寫入:寫入完成一個字節(jié)之后,由IIC器件產(chǎn)生應(yīng)答(低電平),單片機等待低電平,出現(xiàn)低電平就表示器件已經(jīng)有了應(yīng)答 讀取:在讀取完一個字節(jié)之后,由單片機向IIC器件發(fā)送應(yīng)答信號(低電平) |
| 對方連續(xù)發(fā)送的時候,也可以不產(chǎn)生應(yīng)答 |
Powered by 單片機教程網(wǎng)