I2C的Data是在時鐘上升沿采樣還是下降沿采樣?
I2C 總線的起始條件和終止條件通常由主機產(chǎn)生。起始條件是在 SCL 高電平時,SDA 從高電平轉為低電平;而終止條件則是當 SCL 高電平時,SDA 從低電平轉化為高電平。這兩個條件的準確識別對于 I2C 通信的正確啟動和結束至關重要。
關于 I2C 數(shù)據(jù)的采樣問題,一直存在諸多討論。在 I2C 通信過程中,SCL 作為時鐘信號,用于同步數(shù)據(jù)的傳輸。從大量的技術資料以及實際的電路設計和測試結果來看,I2C 判定 SDA 線上的數(shù)據(jù)是低電平還是高電平,并非簡單地在時鐘的上升沿或下降沿進行采樣,而是在 SCL 的高電平期間進行多次采樣。之所以采用這種方式,是因為 I2C 協(xié)議規(guī)定,SDA 上的數(shù)據(jù)必須在 SCL 的高電平期間保持穩(wěn)定。這是 I2C 通信能夠準確傳輸數(shù)據(jù)的關鍵要求之一。如果在 SCL 高電平期間 SDA 的數(shù)據(jù)發(fā)生變化,就可能會與起始條件或結束條件混淆,導致通信錯誤。例如,當 SCL 處于高電平時,如果 SDA 突然從高電平變?yōu)榈碗娖?,這可能會被誤判為起始條件,從而引發(fā)通信流程的混亂。
從具體的數(shù)據(jù)傳輸過程來看,以主機向從機發(fā)送數(shù)據(jù)為例。主機在發(fā)送數(shù)據(jù)時,首先會控制 SDA 產(chǎn)生起始條件,然后依次設置要尋址的 7 位從機地址(A6 - A0),外加 1 位的 R/W(讀 / 寫控制位,寫操作時置為 0)。從機接收到地址信息后,如果可以回應,就會在對應的時鐘周期內控制 SDA 發(fā)送 ACK 位(將 SDA 拉低),否則發(fā)送 NACK(將 SDA 拉高)。接下來,主機開始依次設置要發(fā)送的 8 位字節(jié)數(shù)據(jù)。在這個過程中,每個數(shù)據(jù)位的傳輸都對應一個時鐘脈沖。在 SCL 為高電平期間,SDA 上的數(shù)據(jù)必須保持穩(wěn)定,以便從機能夠準確采樣。也就是說,從機在 SCL 的高電平期間,通過多次采樣 SDA 的電平狀態(tài)來確定接收到的數(shù)據(jù)是 0 還是 1。只有當 SCL 變?yōu)榈碗娖綍r,SDA 的數(shù)據(jù)才允許發(fā)生改變,為下一個數(shù)據(jù)位的傳輸做好準備。
再看主機讀取從機數(shù)據(jù)的情況。主機先控制 SDA 產(chǎn)生起始條件,設置要尋址的從機地址和 R/W 位(讀操作時 R/W 位為 1)。從機回應 ACK 后,主機產(chǎn)生重復開始條件 Sr,重新設置從機地址和 R/W 位。之后,從機開始控制 SDA 發(fā)送字節(jié)數(shù)據(jù)。在這個過程中,主機同樣是在 SCL 的高電平期間對 SDA 上的數(shù)據(jù)進行采樣。主機在接收到每個字節(jié)的數(shù)據(jù)后,會根據(jù)自身的需求決定是否發(fā)送 ACK 或 NACK。如果主機還想繼續(xù)接收數(shù)據(jù),就會發(fā)送 ACK(將 SDA 拉低);如果主機不想再接收數(shù)據(jù),就會發(fā)送 NACK(將 SDA 拉高),并且通常會隨后產(chǎn)生停止條件,結束本次通信。
從硬件電路的角度來分析,在 SCL 高電平期間對 SDA 進行采樣,是為了保證數(shù)據(jù)的穩(wěn)定性和準確性。由于電路中存在各種干擾因素,例如電磁干擾、信號傳輸延遲等,如果僅在上升沿或下降沿采樣,很可能會因為這些干擾而導致采樣錯誤。而在高電平期間進行多次采樣,可以通過一些算法或邏輯來判斷 SDA 的真實電平狀態(tài),從而提高數(shù)據(jù)傳輸?shù)目煽啃?。例如,可以采用多?shù)表決的方式,即多次采樣中,如果大部分采樣結果為高電平,則認為 SDA 當前的數(shù)據(jù)為高電平;反之,則認為是低電平。
此外,I2C 總線的傳輸速率也會對數(shù)據(jù)采樣產(chǎn)生一定的影響。I2C 總線在標準模式下傳輸速率可達 100kbit/s,快速模式下可達 400kbit/s,高速模式下可達 3.4Mbit/s。在不同的傳輸速率下,SCL 的高低電平持續(xù)時間會有所不同,這就要求 SDA 的數(shù)據(jù)在相應的高電平期間保持穩(wěn)定的時間也有所變化。例如,在高速模式下,SCL 的高電平持續(xù)時間較短,這就對 SDA 數(shù)據(jù)的穩(wěn)定時間提出了更高的要求,以確保在高電平期間能夠準確完成數(shù)據(jù)采樣。
綜上所述,I2C 數(shù)據(jù)并非在時鐘的上升沿或下降沿采樣,而是在 SCL 的高電平期間進行采樣。這種采樣方式是由 I2C 協(xié)議的特性以及硬件電路的實際需求共同決定的,它能夠保證 I2C 通信在各種情況下都能準確、穩(wěn)定地傳輸數(shù)據(jù)。無論是主機向從機發(fā)送數(shù)據(jù),還是主機從從機讀取數(shù)據(jù),在 SCL 高電平期間對穩(wěn)定的 SDA 數(shù)據(jù)進行采樣,都是確保 I2C 通信可靠性的關鍵環(huán)節(jié)。理解這一點,對于深入掌握 I2C 通信原理以及進行相關的電路設計和調試工作具有重要的意義。