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