I2C总线知识
I2C 信號的上升時間和下降時間一般要求都小于<300ns? (上拉電阻過大,總線電容過大,均會增大該時間)
I2C的時鐘可能被從設備拉低,從示波器看好像主少發了時鐘,實際是從設備拉低,這時候主設備最好檢查時鐘信號變高后,再發時鐘信號脈沖!
(問題:主發第九個時鐘未檢查總線,此時從設備把SCL拉低《此時從設備正在做相應數據處理,所以拉低總線》,導致ACK應答失敗,從示波器看好像少發了第九時鐘;方法發第九個時鐘的時候檢查SCL電平,發現它變高后,才發第九個時鐘)
?
I2C主和從通信異常
原因:主模擬寫,從由于準備數據原因拉低了SCL,而主沒有判斷SCL,繼續發送數據導致錯誤。
從準備(即拉低SCL):可能在字節和字節之間,也可能在回ACK的時候
解決方法:主在SCL=1時,后面判斷SCL是否為高,如果不為高則超時等待判斷
?
?
示波器帶I2C模塊--設置好觸發電平,默認1.4V,有事件保存功能,可將I2C數據自動保存在excel中
?
I2C 速率有三種模式
1.標準模式 100kbit/s
2.快速模式 400Kbit/s
3.高速模式(HS) 3.4Mbit/s
??? Hs模式的串行數據傳輸格式符合標準模式i2c總線規范。日s模式只能在下面的情況下(所有都在F/S模式)啟動:
??? 1.起始條件(S)
??? 2.8位的主機碼(00001XXX) --- I2C地址不能為主機碼,不能瞎設置
??? 3.不響應位(A)
?
I2C廣播地址為0x00
當總線空閑,SDA,SCL均為高電平
開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。
結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據。
?
SDA線上的數據狀態僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA被用來傳遞數據。
?
?一次典型的?I2C數據傳輸包括一個起始條件?START,一個地址字節(位?7-1: 7?位從地址;位0 R/W方向位),一個或多個字節的數據,?一個停止條件STOP .
?
?所有的數據傳輸都由主器件啟動
?
?主器件發送數據:
?
?主器件產生一個起始條件,然后主器件發送地址和方向位(共一個字節,位0 W),等待來自從器件的確認(ACK)
?
?如果本次數據傳輸是一個從主器件到從器件的寫操作,則主器件每發送一個數據字節后,等待來自從器件的確認(ACK);最后主器件發送停止條件
?
?Start() -> Write(addressDir)?-> GetAcK() ->?Write(data1)-> GetAcK().... Write(datan)-> GetAcK()?Stop();
?
?
?
?主器件接收數據:
?
?主器件產生一個起始條件,然后主器件發送地址和方向位(共一個字節,位1 R),等待來自從器件的確認(ACK)
?
?如果是一個讀操作則由從器件發送數據并等待主器件的確認(ACK),但主器件獲得最后一個數據時候,主器件發送不回應(NOACK),最后主器件發送停止條件.
?
?Start() -> Write(addressDir)?-> GetAcK() ->?Read(data1)-> AcK().... Read(datan)-> NAcK()?Stop();
???
應答:也稱為ACK,接收器件發送該信號表示確認。例如,在器件X收到一個字節后,它將發送一個ACK確認傳輸成功。ACK條件是在SCL為高時采樣到SDA為低電平。
?
非應答:也稱為NACK,這是在SCL為高電平時采樣到SDA為高電平。當接收器件不能產生ACK時,發送器件看到的是NACK。在典型的數據傳輸中,收到NACK信號表示所尋址的從器件沒有準備好或不在總線上。一個處于接收狀態的主器件發送NACK表示這是傳輸的最后一個字節。
I2C特殊地址
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
- 上一篇: I2C死锁原因及解决方法
- 下一篇: 修改mdev配置支持SD卡自动挂载