掃描二維碼
隨時(shí)隨地手機(jī)看文章
引 言
在嵌入式系統(tǒng)設(shè)計(jì)中存在著大量的 IC 間通信,目前使用較多的為 I2C 通信。當(dāng)前大部分單片機(jī)均可采用硬件方式的 I2C 模式進(jìn)行通信,但也有少部分單片機(jī)為降低成本,并未設(shè)計(jì)硬件方式的 I2C 通信,因此只能采用軟件方式來(lái)實(shí)現(xiàn)芯片間通信。目前已有大量文獻(xiàn)討論了 I2C 通信時(shí)主控方的軟件編寫(xiě),但作為通信的另一方,從控方的程序編寫(xiě)很少有相關(guān)資料涉及,特別是從控方的程序相較于主控方的程序更為復(fù)雜。因此從主機(jī)通信要求出發(fā),總結(jié)了一套從機(jī)的通信軟件編寫(xiě)流程[1-3]。
通過(guò)主機(jī)發(fā)出的信號(hào)請(qǐng)求,要求從控機(jī)采取相應(yīng)應(yīng)答信號(hào)。為了實(shí)現(xiàn)從機(jī)的實(shí)時(shí)性,要求從機(jī)的 SCL 線輸入采用外部中斷方式進(jìn)行,可將中斷方式設(shè)置為上升沿觸發(fā)方式。
1 起始信號(hào)
圖 1 所示為主控機(jī)發(fā)送I2C 起始信號(hào)的波形圖。I2C 總線通過(guò)上拉電阻連接電源的正極,當(dāng)總線空閑時(shí),兩根線均為高電平。連到總線上的任一器件輸出的低電平都將使總線的信號(hào)變低,即各器件的 SDA及 SCL均為線“與”關(guān)系。進(jìn)行 I2C通信時(shí),首先要確認(rèn)總線是否空閑。圖 1中,主機(jī)先將數(shù)據(jù)線拉高,再將時(shí)鐘線拉高,但需注意在拉高時(shí)鐘線時(shí)從機(jī)的響應(yīng),其中時(shí)間 t1為從機(jī)響應(yīng)時(shí)間。從機(jī)應(yīng)立即釋放時(shí)鐘線,轉(zhuǎn)為輸入狀態(tài)。主機(jī)只有檢測(cè)到從機(jī)釋放時(shí)鐘線控制權(quán)時(shí)才能進(jìn)行下一步操作。主機(jī)在拉高時(shí)鐘線后,檢測(cè)時(shí)鐘線的狀態(tài),只有從機(jī)為輸入,時(shí)鐘線變高后,主機(jī)才可以發(fā)出起始命令 [4]。
圖 1 主機(jī)發(fā)送起始信號(hào)波形
時(shí)鐘信號(hào)線為高電平時(shí),主機(jī)將數(shù)據(jù)線拉低以發(fā)送起始命令,此時(shí)從機(jī)檢測(cè)到數(shù)據(jù)信號(hào)線產(chǎn)生由高到低的信號(hào)變化后,從機(jī)立即檢測(cè)時(shí)鐘信號(hào)線是否產(chǎn)生由高到低的變化, 如若產(chǎn)生,則說(shuō)明通信起始信號(hào)已發(fā)出,主機(jī)準(zhǔn)備與從機(jī)通信 [5]。從機(jī)控制流程如圖 2 所示。
圖 2 從機(jī)接收起始信號(hào)時(shí)的程序流程
2 停止信號(hào)
停止信號(hào)的產(chǎn)生比起始信號(hào)簡(jiǎn)單,從機(jī)對(duì)停止信號(hào)的要求也比起始信號(hào)簡(jiǎn)單。
圖 3所示為主機(jī)停止信號(hào)波形圖,對(duì)應(yīng)從機(jī)在主機(jī)時(shí)鐘信號(hào)進(jìn)入中斷服務(wù)程序后,通過(guò)檢測(cè)主機(jī)在數(shù)據(jù)線上發(fā)出的由低到高的電平變化來(lái)確認(rèn)通信結(jié)束。
圖 3 停止信號(hào)波形
3 應(yīng)答信號(hào)
主機(jī)發(fā)送 1 B 數(shù)據(jù)后,在第九個(gè)時(shí)鐘(CLOCK)脈沖時(shí)必須釋放數(shù)據(jù)線,由從機(jī)產(chǎn)生一個(gè)應(yīng)答信號(hào)。從機(jī)回復(fù)低電平為有效應(yīng)答(ACK),表示從機(jī)已成功接收到該字節(jié) ;從機(jī)回復(fù)高電平為非應(yīng)答信號(hào)(NACK),表示從機(jī)未成功接收該字節(jié)。如果是有效的應(yīng)答信號(hào)位,要求從機(jī)在第九個(gè)時(shí)鐘脈沖之前的低電平時(shí)間將數(shù)據(jù)線拉低,并確保在第九個(gè)時(shí)鐘的高電平期間為穩(wěn)定的低電平。如果主機(jī)從從機(jī)讀取信息, 則在讀完 1 B 數(shù)據(jù)后,主機(jī)向從機(jī)發(fā)送一個(gè)應(yīng)答信號(hào) ACK, 讀完最后一個(gè)數(shù)據(jù)后,主機(jī)向從機(jī)發(fā)送一個(gè) NACK 信號(hào),通知從機(jī)結(jié)束數(shù)據(jù)發(fā)送,并在最后發(fā)送一個(gè)停止信號(hào)給從機(jī)。應(yīng)答信號(hào)波形如圖 4 所示。在每 8 位數(shù)據(jù)傳送完成后,第九個(gè)時(shí)鐘脈沖傳送一個(gè)應(yīng)答信號(hào)。向從機(jī)中寫(xiě)信息即由從機(jī)發(fā)出應(yīng)答信號(hào) ;從從機(jī)中讀信息,即由主機(jī)發(fā)出應(yīng)答信號(hào)。應(yīng)答信號(hào)為低即為成功,為高則為失敗。
圖 4 應(yīng)答信號(hào)波形
從機(jī)必須配合主機(jī)工作,從機(jī)在第九個(gè)時(shí)鐘脈沖上升沿產(chǎn)生中斷時(shí),將根據(jù)自己的接收情況產(chǎn)生應(yīng)答信號(hào)。從機(jī)工作程序流程如圖 5 所示。
4 數(shù)據(jù)傳送
4.1 字節(jié)傳送與應(yīng)答格式
數(shù)據(jù)傳送時(shí)先高位后低位,9 位為一幀。如果從機(jī)未應(yīng)答主機(jī)信號(hào),如從機(jī)正在進(jìn)行其他工作而無(wú)法接收總線上的數(shù)據(jù),則此時(shí)從機(jī)在應(yīng)答時(shí)必須將數(shù)據(jù)線置于高電平,產(chǎn)生一個(gè)非應(yīng)答信號(hào),主機(jī)產(chǎn)生一個(gè)終止信號(hào)以結(jié)束總線的數(shù)據(jù)傳送。每傳送完一個(gè) 8 位數(shù)據(jù),主機(jī)都要與從機(jī)通過(guò)應(yīng)答與非應(yīng)答信號(hào)進(jìn)行溝通以確定是否繼續(xù)進(jìn)行數(shù)據(jù)傳送。在主機(jī)從從機(jī)中讀取數(shù)據(jù)時(shí),主機(jī)收到最后一個(gè)數(shù)據(jù)字節(jié)后,必須向從機(jī)發(fā)出一個(gè)非應(yīng)答信號(hào)(此時(shí)的應(yīng)答信號(hào)由主機(jī)發(fā)出)作為線束標(biāo)志。從機(jī)釋放 SDA 線,允許主機(jī)產(chǎn)生終止信號(hào)。
4.2 數(shù)據(jù)幀格式
從機(jī)地址為 7 位,分別占據(jù)一個(gè)字節(jié)的 D7 ~ D1 位。D0 位為讀寫(xiě)標(biāo)志位,D0=0 為寫(xiě)入從機(jī)操作 ;D0=1,為從從機(jī)讀取數(shù)據(jù)操作。從機(jī)地址格式與讀寫(xiě)格式如圖 6 所示。
(1)主機(jī)向從機(jī)寫(xiě)數(shù)據(jù),以 8 位數(shù)據(jù)加一位應(yīng)答為一幀, 從機(jī)負(fù)責(zé)應(yīng)答。主機(jī)先寫(xiě)入從機(jī)地址,再寫(xiě)入從機(jī)存儲(chǔ)器地址,后面為要寫(xiě)入的數(shù)據(jù),以一個(gè)字節(jié)加一個(gè)應(yīng)答位(非應(yīng)答位)為一幀寫(xiě)入。如果只寫(xiě)一個(gè)字節(jié),寫(xiě)完后主機(jī)可發(fā)停止信號(hào),如果繼續(xù)寫(xiě)入數(shù)據(jù),則主機(jī)繼續(xù)寫(xiě)入數(shù)據(jù)即可,不必再次輸入存儲(chǔ)器地址,從機(jī)會(huì)在上一地址上自動(dòng)加 1 進(jìn)行數(shù)據(jù)存儲(chǔ)。此時(shí)要特別注意的是 :從機(jī)一定要有應(yīng)答信號(hào)(ACK),否則主機(jī)將終止數(shù)據(jù)的繼續(xù)傳送。從機(jī)無(wú)論是產(chǎn)生非應(yīng)答信號(hào)還是在規(guī)定時(shí)間內(nèi)未產(chǎn)生應(yīng)答信號(hào),主機(jī)都視為無(wú)應(yīng)答,將終止數(shù)據(jù)傳送。寫(xiě)數(shù)據(jù)格式如圖 7 所示。
從機(jī)接收數(shù)據(jù)時(shí)程序較簡(jiǎn)單,只要在 CLOCK 時(shí)鐘線上升沿產(chǎn)生的中斷中依次接收數(shù)據(jù),并在接收完 8 位數(shù)據(jù)后產(chǎn)生應(yīng)答信號(hào)即可。然后對(duì)數(shù)據(jù)進(jìn)行判斷,如果為從機(jī)地址數(shù)據(jù),則判斷此數(shù)據(jù)是否與己方地址相同,相同則繼續(xù)接收,不同則放棄接收。然后接收存儲(chǔ)器地址,并接收數(shù)據(jù),在接收數(shù)據(jù)時(shí)將所接收的數(shù)據(jù)依次存儲(chǔ)。從機(jī)程序流程如圖8所示。
圖 8 從機(jī)讀寫(xiě)數(shù)據(jù)程序流程
(2)主機(jī)從從機(jī)讀數(shù)據(jù)
讀取數(shù)據(jù)與寫(xiě)入數(shù)據(jù)時(shí)的格式存在一定區(qū)別,從機(jī)地址信息需寫(xiě) 2 次,且需發(fā) 2 次起始信息。數(shù)據(jù)框圖如圖 9所示。
由于接收數(shù)據(jù)時(shí)從機(jī)程序比較簡(jiǎn)單,在此不再討論。
5 結(jié) 語(yǔ)
I2C 通信是單片機(jī)與單片機(jī)之間,或單片機(jī)與存儲(chǔ)器之間的通信,對(duì)于經(jīng)濟(jì)型單片機(jī)而言,能有效節(jié)省單片機(jī)的I/O 口,因此 I2C 通信也在通信領(lǐng)域得到廣泛應(yīng)用。本文是長(zhǎng)期編程過(guò)程中的經(jīng)驗(yàn)總結(jié),希望能給讀者提供一定參考。
隨著人工智能概念的爆發(fā),越來(lái)越多的企業(yè)開(kāi)始關(guān)注并布局智能家居領(lǐng)域。有研究機(jī)構(gòu)預(yù)測(cè)預(yù)測(cè),2022年中國(guó)智能家居的整體產(chǎn)值將突破萬(wàn)億元,前景一片向榮。
關(guān)鍵字: 全屋智能 智慧生活 小愛(ài)同學(xué)5G領(lǐng)先讓我們信心大增,但是這不能成為我們高枕無(wú)憂的理由。隨著我們認(rèn)識(shí)到通訊技術(shù)在科技領(lǐng)域的重要性之后,競(jìng)爭(zhēng)必然會(huì)更加激烈起來(lái)。在5G還未成熟的年代,通訊商們就已經(jīng)開(kāi)始將目光瞄準(zhǔn)了6G,并開(kāi)始相關(guān)的研發(fā)和布局。
關(guān)鍵字: 5G 6G 虛擬數(shù)字世界小米智能家居現(xiàn)在已經(jīng)能實(shí)現(xiàn)聯(lián)動(dòng)和自動(dòng)化了,比如指紋鎖進(jìn)屋就打開(kāi)窗簾電視,播放天氣預(yù)報(bào),根據(jù)設(shè)定溫度決定是否打開(kāi)空調(diào),根據(jù)空氣質(zhì)量檢測(cè)儀決定是否打開(kāi)新風(fēng)機(jī)~結(jié)合人體移動(dòng)和光線傳感器開(kāi)燈就更是不用說(shuō)了~最近也在搞全屋智能化,...
關(guān)鍵字: 全屋智能 溫度感應(yīng) 小米擁有 5G、人工智能、物聯(lián)網(wǎng)等新技術(shù)的支撐,智能家居行業(yè)逐漸從單品智能邁入全屋智能階段 。其由于全屋智能產(chǎn)品特殊性,落地安裝涉及到方案場(chǎng)景設(shè)計(jì)、布線,安裝,施工、后期維護(hù)更新等多個(gè)環(huán)節(jié),整體最好的實(shí)施路徑是通過(guò)房屋整體裝...
關(guān)鍵字: 全屋智能 5G 物聯(lián)網(wǎng)5G時(shí)代,我們實(shí)現(xiàn)了彎道超車,一躍超越高通,愛(ài)立信,領(lǐng)先于世界。現(xiàn)如今,5G正在全世界加速普及和應(yīng)用。通訊和實(shí)業(yè)的結(jié)合,已助力生產(chǎn)效率進(jìn)一步提高,讓我們的生活變得更加美好。
關(guān)鍵字: 5G 6G 中國(guó)移動(dòng)