I2C 總線:固件實現(xiàn)細(xì)節(jié)
出處:維庫電子市場網(wǎng) 發(fā)布于:2023-05-09 16:36:33
通過 I2C 通信的設(shè)備必須符合特定的事件序列。每個事件對應(yīng)于控制時鐘(SCL)和數(shù)據(jù)(SDA)線的某種方式;正如上面列出的“支持信息”文章中所討論的,這兩個信號是總線上的設(shè)備可以共享信息的方式。我們將一個通信序列稱為“事務(wù)”;這個詞比“傳輸”更合適,因為每個事務(wù)都涉及傳輸數(shù)據(jù)和接收數(shù)據(jù),但在某些情況下,接收的數(shù)據(jù)是主機(jī)檢測到的確認(rèn) (ACK) 或非確認(rèn) (NACK) 位。下面的時序圖顯示了一個典型的 I2C 事務(wù)。
請注意以下事項:
- 與時鐘的邏輯高電平部分對應(yīng)的虛線提醒我們邏輯高電平(對于 SCL 和 SDA)是“隱性”狀態(tài)——換句話說,信號通過上拉電阻自然地上升到邏輯高電平. “顯性”狀態(tài)是邏輯低電平,因為只有當(dāng)設(shè)備實際將其驅(qū)動為低電平時,信號才會為低電平。
- 事務(wù)以“起始位”開始。每個 I2C 事務(wù)都必須以起始位開始,該位定義為 SDA 上的下降沿,而 SCL 為邏輯高電平。
- 事務(wù)以“停止位”結(jié)束,定義為 SDA 上的上升沿,而 SCL 為邏輯高電平。I2C 事務(wù)必須以停止位結(jié)束;但是,如本文后面所述,在生成停止位之前可能會出現(xiàn)多個起始位。
- 時鐘高時數(shù)據(jù)有效,時鐘低時改變狀態(tài);數(shù)字通信系統(tǒng)通常是邊沿驅(qū)動的,因此實際上數(shù)據(jù)在時鐘的上升沿讀取并在時鐘的下降沿更新。
- 信息一個字節(jié)地交換,從有效位開始,每個字節(jié)后跟一個 ACK 或 NACK。
- 您可能希望 ACK 由邏輯高指示,NACK 由邏輯低指示,但事實并非如此。ACK 為邏輯低電平,NACK 為邏輯高電平。這是必要的,因為高電平是隱性狀態(tài)——如果從機(jī)不起作用,信號自然會上升到 NACK。同樣,ACK(由顯性邏輯低表示)只有在設(shè)備可操作并準(zhǔn)備好繼續(xù)事務(wù)時才能傳輸。
以下列表描述了上述交易中的事件順序:
- 主機(jī)生成一個起始位來啟動事務(wù)。
- 主機(jī)發(fā)送對應(yīng)于它要與之通信的從機(jī)的 7 位地址。
- 個字節(jié)段的一位是讀/寫指示符。如果主機(jī)想從從機(jī)讀取數(shù)據(jù),則主機(jī)將此位設(shè)置為邏輯高電平,如果要向從機(jī)寫入數(shù)據(jù),則將此位設(shè)置為邏輯低電平。
- 下一個字節(jié)是個數(shù)據(jù)字節(jié)。這來自主機(jī)或從機(jī),具體取決于讀/寫位的狀態(tài)。像往常一樣,我們有 8 位數(shù)據(jù),從有效位開始。
- 數(shù)據(jù)字節(jié)后跟一個 ACK 或 NACK,如果這是一個讀事務(wù),則由主機(jī)生成,如果這是一個寫事務(wù),則由從機(jī)生成。ACK 和 NACK 可能表示不同的含義,具體取決于通信設(shè)備的固件或低級硬件設(shè)計。例如,主機(jī)可以使用 NACK 表示“這是一個數(shù)據(jù)字節(jié)”,或者如果從機(jī)知道要發(fā)送多少數(shù)據(jù),它可以使用 ACK 來確認(rèn)數(shù)據(jù)已成功接收。
- 事務(wù)以主設(shè)備生成的停止位終止。
多少字節(jié)?
每個事務(wù)都以相同的方式開始:起始位、地址、讀/寫、ACK/NACK。之后,可以從主機(jī)向從機(jī)或從機(jī)向主機(jī)發(fā)送任意數(shù)量的字節(jié),每個字節(jié)后跟 ACK 或 NACK。NACK 可以用作“停止發(fā)送數(shù)據(jù)!”的一種方式。例如,主設(shè)備可能希望從從設(shè)備(例如溫度傳感器)接收連續(xù)的數(shù)據(jù)流;每個字節(jié)后面都會跟著 ACK,如果主機(jī)需要將注意力轉(zhuǎn)移到其他事情上,它可以 NACK 從機(jī)并在它準(zhǔn)備好時開始新的事務(wù)。
不停地開始
I2C 協(xié)議允許所謂的“重復(fù)啟動”條件。當(dāng)主機(jī)用一個起始位啟動一個事務(wù),然后在沒有中間停止位的情況下通過另一個起始位啟動一個新事務(wù)時,就會發(fā)生這種情況,如下所示:
只要單個主機(jī)需要執(zhí)行兩個或多個單獨的事務(wù),就可以使用此功能。但是,有一種情況重復(fù)啟動條件特別好用:
假設(shè)您有一個從屬設(shè)備,它將信息存儲在一組寄存器中。您想要從寄存器地址 160,十六進(jìn)制的 0xA0 中檢索數(shù)據(jù)。I2C 協(xié)議不允許主機(jī)在單個事務(wù)中發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。因此,您必須執(zhí)行寫入事務(wù)來指定寄存器地址,然后執(zhí)行單獨的讀取事務(wù)來檢索數(shù)據(jù)。但是,這種方法可能會導(dǎo)致問題,因為主機(jī)會釋放總線在個事務(wù)結(jié)束時,因此另一個主控可以占用總線并阻止個主控獲得它需要的數(shù)據(jù)。此外,第二個主機(jī)可能與同一個從機(jī)通信并指定不同的寄存器地址。. . 如果個主控然后在沒有重新指定寄存器地址的情況下聲明總線并讀取數(shù)據(jù),它將讀取錯誤的數(shù)據(jù)!如果第二個主機(jī)然后嘗試在其先寫后讀過程中執(zhí)行讀取事務(wù),它也將以錯誤數(shù)據(jù)結(jié)束!這是等待發(fā)生的系統(tǒng)故障——幸運的是,重復(fù)啟動條件可以通過啟動第二個(讀取)事務(wù)而不 釋放總線來防止這種混亂:
當(dāng)大師無法相處時
使 I2C 如此通用的部分原因是它支持多個主機(jī)。但正如上一節(jié)所展示的,高手并不總是能很好地相處。設(shè)備的 I2C 邏輯必須能夠確定總線是否空閑;如果另一個主設(shè)備已占用總線,設(shè)備將等待當(dāng)前事務(wù)結(jié)束,然后再啟動自己的事務(wù)。但是當(dāng)兩個(或更多)master 試圖同時發(fā)起一個事務(wù)時會發(fā)生什么?I2C 為這個令人厭煩的問題提供了一種有效且簡單得驚人的解決方案。該過程稱為“仲裁”,它依賴于 I2C 開漏總線配置的靈活性:如果一個主機(jī)試圖將信號驅(qū)動為邏輯高電平而另一個嘗試將信號驅(qū)動為邏輯低電平,則邏輯低主機(jī)將“獲勝, ” 而且,
該圖傳達(dá)了 I2C 仲裁的基礎(chǔ);該過程發(fā)生如下:
- 兩個主機(jī)都生成一個起始位并繼續(xù)進(jìn)行傳輸。
- 如果大師們碰巧選擇了相同的邏輯電平,則什么也不會發(fā)生。
- 一旦主機(jī)嘗試施加不同的邏輯電平,將信號拉低的主機(jī)就被宣布為贏家;失敗者檢測到邏輯不匹配并放棄其傳輸。
花點時間欣賞一下這種安排的簡單性和有效性:
- 贏家繼續(xù)傳輸而不中斷——沒有損壞的數(shù)據(jù),沒有驅(qū)動程序爭用,不需要重新啟動事務(wù)。
- 從理論上講,失敗者可以在仲裁過程中監(jiān)視從機(jī)地址,如果恰好是被尋址的從機(jī),則實際上可以做出適當(dāng)?shù)捻憫?yīng)。
- 如果競爭的主機(jī)都向同一個從機(jī)請求數(shù)據(jù),則仲裁過程不會不必要地中斷任何一個事務(wù)——不會檢測到不匹配,并且從機(jī)會將其數(shù)據(jù)輸出到總線,以便多個主機(jī)可以接收它。
結(jié)論
本文涵蓋了影響固件或低級硬件設(shè)計的重要 I2C 細(xì)節(jié)。如果您的微控制器包含專用 I2C 或 SMBus 硬件,一些實現(xiàn)細(xì)節(jié)將自動處理。這很方便,但肯定不是無知的借口,因為您仍然需要至少了解一點(可能不止一點)I2C 的真正工作原理。此外,如果您發(fā)現(xiàn)自己被困在沒有 I2C 外設(shè)的荒島上,此處提供的信息將幫助您順利設(shè)計僅固件(也稱為“位碰撞”)I2C 例程。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://udpf.com.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 簡述計算機(jī)總線的分類2025/9/4 17:12:23
- 深度剖析三進(jìn)線兩母聯(lián)供電系統(tǒng)設(shè)計方案2025/9/3 10:37:39
- 匯流排是什么匯流排好還是線接好2025/8/28 17:13:00
- 安森美 USB - C 電池充電器解決方案2025/8/28 15:45:10
- I2C 總線加上拉電阻的必要性2025/8/25 16:42:09