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