鄭安迪 林偉敏 富雅瓊
摘? 要:IIC總線設計自其誕生以來,由于其結構簡單、連線少,被廣泛運用于設備間的通信。針對現(xiàn)有的IIC驅動算法存在程序結構上的不足,無法勝任一些對時間控制精度較高的多任務工作的現(xiàn)狀,該文設計了基于狀態(tài)機原理的IIC驅動算法,該算法利用狀態(tài)轉換實現(xiàn)前臺接收、后臺處理,提高軟件運行效率,完成IIC通信,且不影響系統(tǒng)別的程式的運行。
關鍵詞:狀態(tài)機? IIC通信? 驅動算法? 分時操作
中圖分類號:TP336 ? ? ? ? ? 文獻標識碼:A 文章編號:1672-3791(2020)07(c)-0001-04
IIC Driving Algorithm Based on State Machine and Its Application
ZHENG Andi? LIN Weimin? FU Yaqiong
(College of Mechanical and Electrical Engineering, China Jiliang University, Hangzhou, Zhejiang Province, 310018 China)
Abstract: The IIC bus design, due to its simple structure and few connections, is widely used in the communication between devices since it was invented. The existing IIC driver algorithm has the deficiency of program structure, which is not competent for some multi-task work with high precision of time control. In this paper, we design the IIC driver algorithm which is based on state machines. This driver algorithm uses state transition to realize receiving frontend and processing background, this can improve the efficiency of the software, to complete IIC communication. It does not affect other programs in the system.
Key Words: State machine; IIC communication; Driving algorithm; Time-sharing operation
IIC是由飛利浦公司在1980年代為了使設備能夠連接低速周邊設備而發(fā)展出的一種串行通信總線。由于其結構簡單、連線少,簡化了硬件電路方面的設計,所以很多設備都采用該通信方式。軟件模擬IIC因為其可移植能力強,配置方便,使用過程簡單,在很多單片機程序設計中都用了軟件模擬IIC的編寫思路。因此,在不具備硬件IIC的單片機,一般采用軟件模擬IIC方法。目前常用的模擬IIC采用查詢式程序結構,其無法勝任一些對時間控制精確度較高的多任務工作。為了提高軟件模擬IIC的工作效率,該文設計了一種基于狀態(tài)機的IIC驅動算法。該文設計的基于狀態(tài)機的IIC驅動算法,通過狀態(tài)機狀態(tài)的改變運行相應的步驟程序,達到非占用式的多任務穿插運行,從而提高了效率,對于測量儀器和對時間要求高的任務尤其有效。
1? 算法設計
1.1 總體思路
IIC驅動算法由發(fā)送指令和接收指令兩個部分構成。
接收程序分前后臺,接收字符的(中斷)服務程序為前臺程序,處理主程序為后臺程序。前臺接收字符并存入緩沖區(qū),后臺從緩沖區(qū)讀取字符并進行處理。前臺程序通過讀取和改變狀態(tài)機狀態(tài)來控制IIC通信,以達到完整的IIC接收部分。
發(fā)送部分中程序也分前后臺,發(fā)送字符的(中斷)服務程序為前臺程序,處理主程序為后臺程序。后臺程序將要發(fā)送的字符存入緩存區(qū),前臺從緩沖區(qū)讀取字符并發(fā)送出去。
整個主程序采用時間片結構,每隔一段時間進入后臺程序進行任務處理,前臺程序主要由中斷觸發(fā)。該結構確保將空閑時間釋放給其他任務程序,以達到高效利用系統(tǒng)資源運行的目的。
1.2 前臺程序
在接收指令的前臺程序中,根據(jù)IIC通信協(xié)議,主機需先檢測總線狀態(tài)。如果總線空閑則產(chǎn)生START信號掌管總線,然后傳送7位地址加1位讀寫位(讀寫位為0表示寫),并等待從機檢測到發(fā)送的地址與自己的地址相匹配并反饋一個應答信號(ACK)。從機如檢測到發(fā)送地址與自己相匹配,則反饋應答信號(ACK),主機收到后會緊接著發(fā)送下一個START狀態(tài),然后重復第一個地址字節(jié)并將讀寫位變?yōu)?,表示讀取;主機釋放數(shù)據(jù)總線,開始接收數(shù)據(jù)字節(jié),主機接收每個數(shù)據(jù)字節(jié)后發(fā)送應答信號(ACK)表示繼續(xù)發(fā)送,無應答(NACK)表示傳輸數(shù)據(jù)結束。
發(fā)送指令的首字節(jié)與接收情況相同,主機首先要檢測總線狀態(tài),如果總線空閑則產(chǎn)生START信號掌管總線,然后傳送器件7位地址加1位讀寫位(讀寫位為0表示寫)。等待從機檢測到發(fā)送的地址與自己的地址相匹配并反饋一個應答信號(ACK),區(qū)別是從機應答后主機繼續(xù)發(fā)送字節(jié)數(shù)據(jù),如果從機發(fā)送無應答(NACK)則表示數(shù)據(jù)傳輸結束。主機發(fā)送完全部數(shù)據(jù)后,會發(fā)送一個停止位STOP,結束整個通信并且釋放總線。
基于狀態(tài)機的IIC驅動算法因此將IIC前臺程序分為空狀態(tài)、START信號發(fā)送、地址發(fā)送、等待應答、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、發(fā)送應答信號、STOP狀態(tài)。在每一部分進行完之后,通過改變狀態(tài)變量,在下一次進入前臺處理程序中,通過判斷狀態(tài)量來進入相應的程序部分,以達到完成IIC通信的效果。
1.3 后臺程序
IIC后臺程序也分為幾個狀態(tài),以期完成各項功能。在具體的功能中,首先判斷總線是否繁忙。若總線為空閑狀態(tài),可啟動相應的讀或寫的IIC任務,具體的任務設計可根據(jù)整套系統(tǒng)應用需求來設計,將任務交給前臺程序處理即可,即改變前臺狀態(tài)。接收到相應數(shù)據(jù)后就可進行數(shù)據(jù)處理,完成后臺程序數(shù)據(jù)處理的任務。
2? 算法應用
2.1 SHT20溫濕度傳感器介紹
SHT20是一款集成測量濕度和溫度為一體的傳感器,支持標準的IIC格式,采用數(shù)字輸出,優(yōu)異的長期工作的穩(wěn)定性。SHT20的分辨率可通過輸入命令進行改變,可選的分辨率有8/12bit乃至12/14bit的RH濕度/T溫度。
2.2 基于狀態(tài)機的SHT20通信程序
基于IIC狀態(tài)機的SHT20通 程序,前臺程序按照狀態(tài)相應的IIC通信協(xié)議完成其中的發(fā)送,接收程序部分的相應狀態(tài)編寫,并在每次狀態(tài)結束后更新狀態(tài)變量至新的狀態(tài),使程序能在運行時達到轉換狀態(tài)的效果。后臺程序根據(jù)程序需求編寫,將目標任務、測量溫度、測量濕度、修正數(shù)值分成幾塊狀態(tài)進行編寫,在每塊任務中向前臺程序發(fā)送指定命令,并更新狀態(tài)變量轉換相應的下一個狀態(tài)。主程序采用時間片結構,每隔一段時間(通常這段時間是極短的)執(zhí)行前臺程序和后臺程序,完成相應的IIC通信和前后臺程序的狀態(tài)轉換。
2.3 程序分析
前臺程序編寫根據(jù)IIC協(xié)議完成各個狀態(tài)的編寫,嚴格按照IIC時序來進行狀態(tài)轉換編寫;后臺程序也將溫濕度傳感器的測量任務主要分為若干個狀態(tài)部分,溫度與濕度測量同理,以溫度測量為例,分為啟動測量溫度、等待測量溫度、讀取測量溫度、等待讀取測量溫度、溫度值修正5個部分,通過狀態(tài)變量改變將5個部分串聯(lián)起來。啟動測量溫度這個狀態(tài)部分中是向前臺程序發(fā)送了IIC發(fā)送指令,將溫濕度傳感器SHT20的地址和所要測得的量以及讀寫位寫入了發(fā)送緩沖區(qū),且改變了前臺程序的狀態(tài),此時后臺程序狀態(tài)同時轉變,進入等待測量溫度。在下一次進入前臺程序時,會判定狀態(tài)變量的狀態(tài),確定進行IIC通信。后臺等待測量溫度結束后會自動改變狀態(tài)進入讀取測量溫度的狀態(tài),讀取測量溫度的狀態(tài)這個狀態(tài)部分中是向前臺程序發(fā)送了IIC接收指令,確定了溫濕度傳感器SHT20的地址和所要測得的量以及讀寫位,以及讀取的字節(jié)個數(shù),且改變了前臺程序的狀態(tài),此時后臺程序狀態(tài)同時改變,進入等待讀取測量溫度。在下一次進入前臺程序時,會判定狀態(tài)變量的狀態(tài),確定進行IIC通信。后臺等待讀取測量溫度結束后會自動改變狀態(tài)進入溫度值修正的狀態(tài)。在后臺程序溫度值修正的狀態(tài)下,后臺程序從接收緩沖區(qū)中讀取數(shù)據(jù)后進行相應的修正處理。至此,整個測量溫度的過程結束。整個系統(tǒng)采用時間片的程序結構,在整個主程序中以20μs的間隔進入一次前臺程序,以1ms的間隔進入一次后臺程序,既可以保證溫濕度測量任務、IIC通信正常進行,且不會因為采用軟件延時過多地占用系統(tǒng)資源,同時系統(tǒng)還能以相同時間片結構的方式加入其他傳感器測量或者其他任務,相互之間能夠不受影響,且只需要一個前臺程序即可,后臺程序只需要在進入需要IIC通信時的狀態(tài)時先判定總線是否繁忙即可。
相比之下,若用普通的軟件IIC程序,的確簡單易懂,操作簡單,容易上手,且易于在不同型號的單片機上移植程序。但不適用于任務數(shù)量較多,對采集頻率有較高要求的工程;基于狀態(tài)機的IIC驅動算法可以適用于需要高頻次、復雜的IIC通信的任務,如溫濕度數(shù)據(jù)的采集,傳感器數(shù)據(jù)發(fā)送回主機,通過狀態(tài)機狀態(tài)的改變來判定IIC通信的情況,程序的穿插式運行,提高整個單片機系統(tǒng)的效率,能夠保證主機從傳感器獲取數(shù)據(jù)頻率且不影響自身其他程序運行,且同樣具有良好的可移植性;而普通軟件IIC由于其查詢法程序結構限制,軟件延時占用系統(tǒng)資源,難以達到相應高的數(shù)據(jù)獲取頻率,且會阻塞系統(tǒng)其他程序的進行。
3? 結語
基于狀態(tài)機的IIC驅動算法將整個單片機程序結構切分為類似時間片的結構,如驅動算法中將IIC的各個過程步驟模塊化處理,將一個IIC通信任務分割,把原先軟件模擬IIC所特有的軟件延時的時間節(jié)省下來進行其他程序的運行操作,較普通軟件IIC能夠避免軟件延時占用系統(tǒng)資源,節(jié)約程序資源,結構也并非復雜,通過狀態(tài)改變來進行相應操作。使用該算法能夠使單片機在各個場景下更加輕松、靈活地處理任務,提高單片機程序效率。我們可以將這種基于狀態(tài)機的IIC驅動算法,運用到一些對時間精度要求高、讀取頻率高,且需要進行多從機IIC讀寫工作的單片機中去。值得一提的是,面對現(xiàn)在現(xiàn)有的一些實時操作系統(tǒng),如freeRTOS,也可以達到這種多任務系統(tǒng)設計。但大多數(shù)的RTOS的代碼量都是有一定規(guī)模的,在引入RTOS時不得不去考慮會不會帶入RTOS所附有的一些程序陷阱。若只是在一些任務種類簡單的單片機上使用RTOS的話,無疑需要權衡大量代碼可能帶來的問題和RTOS所帶來的效益之間的平衡。相比之下,基于狀態(tài)機的IIC驅動算法填補了RTOS在一定場合下的適用性的空缺,更能廣泛地應用于需要高可靠性的場合,單片機處理性能有限的場合,對程序編寫者來說也更加友好,程序可讀性也更好。
參考文獻
[1] 張毅剛,趙光權,劉旺.單片機原理及應用[M].北京:高等教育出版社,2016:301-312.
[2] Stephen Prata.C Primer Plus[M].北京:北京人民郵電出版社,2005:152-180.
[3] SENSIRION.Datasheet SHT20[EB/OL].https://www.sensirion.com.
[4] 李興建,李琨,馬文玲.分時操作系統(tǒng)思想在單片機中的具體應用[J].電子設計應用,2003(Z1):56-58.
[5] 唐飛,楊偉.基于多任務機制的STM32系統(tǒng)程序設計[J].安慶師范大學學報:自然科學版,2019,25(4):70-74.
[6] 王洪生.單片機的延時與中斷問題及解決方法[J].科技創(chuàng)新導報,2019,16(34):54-55.
[7] 關鑫.基于C語言的計算機編程技術分析[J].科技資訊,2019,17(16):16-17.
[8] 杜隆胤,方冰,鄭軍.51單片機循環(huán)輪詢多任務編程[J].計算機時代,2018(10):1-4.
[9] 楊旭.單片機編程中有限狀態(tài)機的應用[J].科技風,2017(15):71.
[10] 郭兆正,于鵬,于震.基于有限狀態(tài)機建模的單片機編程方法研究[J].渤海大學學報:自然科學版,2016,37(3):266-270.