国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于狀態(tài)機的IIC驅(qū)動算法及其應(yīng)用

2020-12-24 07:59鄭安迪林偉敏富雅瓊
科技資訊 2020年21期

鄭安迪 林偉敏 富雅瓊

摘? 要:IIC總線設(shè)計自其誕生以來,由于其結(jié)構(gòu)簡單、連線少,被廣泛運用于設(shè)備間的通信。針對現(xiàn)有的IIC驅(qū)動算法存在程序結(jié)構(gòu)上的不足,無法勝任一些對時間控制精度較高的多任務(wù)工作的現(xiàn)狀,該文設(shè)計了基于狀態(tài)機原理的IIC驅(qū)動算法,該算法利用狀態(tài)轉(zhuǎn)換實現(xiàn)前臺接收、后臺處理,提高軟件運行效率,完成IIC通信,且不影響系統(tǒng)別的程式的運行。

關(guān)鍵詞:狀態(tài)機? IIC通信? 驅(qū)動算法? 分時操作

中圖分類號:TP336 ? ? ? ? ? 文獻(xiàn)標(biāo)識碼: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年代為了使設(shè)備能夠連接低速周邊設(shè)備而發(fā)展出的一種串行通信總線。由于其結(jié)構(gòu)簡單、連線少,簡化了硬件電路方面的設(shè)計,所以很多設(shè)備都采用該通信方式。軟件模擬IIC因為其可移植能力強,配置方便,使用過程簡單,在很多單片機程序設(shè)計中都用了軟件模擬IIC的編寫思路。因此,在不具備硬件IIC的單片機,一般采用軟件模擬IIC方法。目前常用的模擬IIC采用查詢式程序結(jié)構(gòu),其無法勝任一些對時間控制精確度較高的多任務(wù)工作。為了提高軟件模擬IIC的工作效率,該文設(shè)計了一種基于狀態(tài)機的IIC驅(qū)動算法。該文設(shè)計的基于狀態(tài)機的IIC驅(qū)動算法,通過狀態(tài)機狀態(tài)的改變運行相應(yīng)的步驟程序,達(dá)到非占用式的多任務(wù)穿插運行,從而提高了效率,對于測量儀器和對時間要求高的任務(wù)尤其有效。

1? 算法設(shè)計

1.1 總體思路

IIC驅(qū)動算法由發(fā)送指令和接收指令兩個部分構(gòu)成。

接收程序分前后臺,接收字符的(中斷)服務(wù)程序為前臺程序,處理主程序為后臺程序。前臺接收字符并存入緩沖區(qū),后臺從緩沖區(qū)讀取字符并進(jìn)行處理。前臺程序通過讀取和改變狀態(tài)機狀態(tài)來控制IIC通信,以達(dá)到完整的IIC接收部分。

發(fā)送部分中程序也分前后臺,發(fā)送字符的(中斷)服務(wù)程序為前臺程序,處理主程序為后臺程序。后臺程序?qū)⒁l(fā)送的字符存入緩存區(qū),前臺從緩沖區(qū)讀取字符并發(fā)送出去。

整個主程序采用時間片結(jié)構(gòu),每隔一段時間進(jìn)入后臺程序進(jìn)行任務(wù)處理,前臺程序主要由中斷觸發(fā)。該結(jié)構(gòu)確保將空閑時間釋放給其他任務(wù)程序,以達(dá)到高效利用系統(tǒng)資源運行的目的。

1.2 前臺程序

在接收指令的前臺程序中,根據(jù)IIC通信協(xié)議,主機需先檢測總線狀態(tài)。如果總線空閑則產(chǎn)生START信號掌管總線,然后傳送7位地址加1位讀寫位(讀寫位為0表示寫),并等待從機檢測到發(fā)送的地址與自己的地址相匹配并反饋一個應(yīng)答信號(ACK)。從機如檢測到發(fā)送地址與自己相匹配,則反饋應(yīng)答信號(ACK),主機收到后會緊接著發(fā)送下一個START狀態(tài),然后重復(fù)第一個地址字節(jié)并將讀寫位變?yōu)?,表示讀取;主機釋放數(shù)據(jù)總線,開始接收數(shù)據(jù)字節(jié),主機接收每個數(shù)據(jù)字節(jié)后發(fā)送應(yīng)答信號(ACK)表示繼續(xù)發(fā)送,無應(yīng)答(NACK)表示傳輸數(shù)據(jù)結(jié)束。

發(fā)送指令的首字節(jié)與接收情況相同,主機首先要檢測總線狀態(tài),如果總線空閑則產(chǎn)生START信號掌管總線,然后傳送器件7位地址加1位讀寫位(讀寫位為0表示寫)。等待從機檢測到發(fā)送的地址與自己的地址相匹配并反饋一個應(yīng)答信號(ACK),區(qū)別是從機應(yīng)答后主機繼續(xù)發(fā)送字節(jié)數(shù)據(jù),如果從機發(fā)送無應(yīng)答(NACK)則表示數(shù)據(jù)傳輸結(jié)束。主機發(fā)送完全部數(shù)據(jù)后,會發(fā)送一個停止位STOP,結(jié)束整個通信并且釋放總線。

基于狀態(tài)機的IIC驅(qū)動算法因此將IIC前臺程序分為空狀態(tài)、START信號發(fā)送、地址發(fā)送、等待應(yīng)答、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、發(fā)送應(yīng)答信號、STOP狀態(tài)。在每一部分進(jìn)行完之后,通過改變狀態(tài)變量,在下一次進(jìn)入前臺處理程序中,通過判斷狀態(tài)量來進(jìn)入相應(yīng)的程序部分,以達(dá)到完成IIC通信的效果。

1.3 后臺程序

IIC后臺程序也分為幾個狀態(tài),以期完成各項功能。在具體的功能中,首先判斷總線是否繁忙。若總線為空閑狀態(tài),可啟動相應(yīng)的讀或?qū)懙腎IC任務(wù),具體的任務(wù)設(shè)計可根據(jù)整套系統(tǒng)應(yīng)用需求來設(shè)計,將任務(wù)交給前臺程序處理即可,即改變前臺狀態(tài)。接收到相應(yīng)數(shù)據(jù)后就可進(jìn)行數(shù)據(jù)處理,完成后臺程序數(shù)據(jù)處理的任務(wù)。

2? 算法應(yīng)用

2.1 SHT20溫濕度傳感器介紹

SHT20是一款集成測量濕度和溫度為一體的傳感器,支持標(biāo)準(zhǔn)的IIC格式,采用數(shù)字輸出,優(yōu)異的長期工作的穩(wěn)定性。SHT20的分辨率可通過輸入命令進(jìn)行改變,可選的分辨率有8/12bit乃至12/14bit的RH濕度/T溫度。

2.2 基于狀態(tài)機的SHT20通信程序

基于IIC狀態(tài)機的SHT20通 程序,前臺程序按照狀態(tài)相應(yīng)的IIC通信協(xié)議完成其中的發(fā)送,接收程序部分的相應(yīng)狀態(tài)編寫,并在每次狀態(tài)結(jié)束后更新狀態(tài)變量至新的狀態(tài),使程序能在運行時達(dá)到轉(zhuǎn)換狀態(tài)的效果。后臺程序根據(jù)程序需求編寫,將目標(biāo)任務(wù)、測量溫度、測量濕度、修正數(shù)值分成幾塊狀態(tài)進(jìn)行編寫,在每塊任務(wù)中向前臺程序發(fā)送指定命令,并更新狀態(tài)變量轉(zhuǎn)換相應(yīng)的下一個狀態(tài)。主程序采用時間片結(jié)構(gòu),每隔一段時間(通常這段時間是極短的)執(zhí)行前臺程序和后臺程序,完成相應(yīng)的IIC通信和前后臺程序的狀態(tài)轉(zhuǎn)換。

2.3 程序分析

前臺程序編寫根據(jù)IIC協(xié)議完成各個狀態(tài)的編寫,嚴(yán)格按照IIC時序來進(jìn)行狀態(tài)轉(zhuǎn)換編寫;后臺程序也將溫濕度傳感器的測量任務(wù)主要分為若干個狀態(tài)部分,溫度與濕度測量同理,以溫度測量為例,分為啟動測量溫度、等待測量溫度、讀取測量溫度、等待讀取測量溫度、溫度值修正5個部分,通過狀態(tài)變量改變將5個部分串聯(lián)起來。啟動測量溫度這個狀態(tài)部分中是向前臺程序發(fā)送了IIC發(fā)送指令,將溫濕度傳感器SHT20的地址和所要測得的量以及讀寫位寫入了發(fā)送緩沖區(qū),且改變了前臺程序的狀態(tài),此時后臺程序狀態(tài)同時轉(zhuǎn)變,進(jìn)入等待測量溫度。在下一次進(jìn)入前臺程序時,會判定狀態(tài)變量的狀態(tài),確定進(jìn)行IIC通信。后臺等待測量溫度結(jié)束后會自動改變狀態(tài)進(jìn)入讀取測量溫度的狀態(tài),讀取測量溫度的狀態(tài)這個狀態(tài)部分中是向前臺程序發(fā)送了IIC接收指令,確定了溫濕度傳感器SHT20的地址和所要測得的量以及讀寫位,以及讀取的字節(jié)個數(shù),且改變了前臺程序的狀態(tài),此時后臺程序狀態(tài)同時改變,進(jìn)入等待讀取測量溫度。在下一次進(jìn)入前臺程序時,會判定狀態(tài)變量的狀態(tài),確定進(jìn)行IIC通信。后臺等待讀取測量溫度結(jié)束后會自動改變狀態(tài)進(jìn)入溫度值修正的狀態(tài)。在后臺程序溫度值修正的狀態(tài)下,后臺程序從接收緩沖區(qū)中讀取數(shù)據(jù)后進(jìn)行相應(yīng)的修正處理。至此,整個測量溫度的過程結(jié)束。整個系統(tǒng)采用時間片的程序結(jié)構(gòu),在整個主程序中以20μs的間隔進(jìn)入一次前臺程序,以1ms的間隔進(jìn)入一次后臺程序,既可以保證溫濕度測量任務(wù)、IIC通信正常進(jìn)行,且不會因為采用軟件延時過多地占用系統(tǒng)資源,同時系統(tǒng)還能以相同時間片結(jié)構(gòu)的方式加入其他傳感器測量或者其他任務(wù),相互之間能夠不受影響,且只需要一個前臺程序即可,后臺程序只需要在進(jìn)入需要IIC通信時的狀態(tài)時先判定總線是否繁忙即可。

相比之下,若用普通的軟件IIC程序,的確簡單易懂,操作簡單,容易上手,且易于在不同型號的單片機上移植程序。但不適用于任務(wù)數(shù)量較多,對采集頻率有較高要求的工程;基于狀態(tài)機的IIC驅(qū)動算法可以適用于需要高頻次、復(fù)雜的IIC通信的任務(wù),如溫濕度數(shù)據(jù)的采集,傳感器數(shù)據(jù)發(fā)送回主機,通過狀態(tài)機狀態(tài)的改變來判定IIC通信的情況,程序的穿插式運行,提高整個單片機系統(tǒng)的效率,能夠保證主機從傳感器獲取數(shù)據(jù)頻率且不影響自身其他程序運行,且同樣具有良好的可移植性;而普通軟件IIC由于其查詢法程序結(jié)構(gòu)限制,軟件延時占用系統(tǒng)資源,難以達(dá)到相應(yīng)高的數(shù)據(jù)獲取頻率,且會阻塞系統(tǒng)其他程序的進(jìn)行。

3? 結(jié)語

基于狀態(tài)機的IIC驅(qū)動算法將整個單片機程序結(jié)構(gòu)切分為類似時間片的結(jié)構(gòu),如驅(qū)動算法中將IIC的各個過程步驟模塊化處理,將一個IIC通信任務(wù)分割,把原先軟件模擬IIC所特有的軟件延時的時間節(jié)省下來進(jìn)行其他程序的運行操作,較普通軟件IIC能夠避免軟件延時占用系統(tǒng)資源,節(jié)約程序資源,結(jié)構(gòu)也并非復(fù)雜,通過狀態(tài)改變來進(jìn)行相應(yīng)操作。使用該算法能夠使單片機在各個場景下更加輕松、靈活地處理任務(wù),提高單片機程序效率。我們可以將這種基于狀態(tài)機的IIC驅(qū)動算法,運用到一些對時間精度要求高、讀取頻率高,且需要進(jìn)行多從機IIC讀寫工作的單片機中去。值得一提的是,面對現(xiàn)在現(xiàn)有的一些實時操作系統(tǒng),如freeRTOS,也可以達(dá)到這種多任務(wù)系統(tǒng)設(shè)計。但大多數(shù)的RTOS的代碼量都是有一定規(guī)模的,在引入RTOS時不得不去考慮會不會帶入RTOS所附有的一些程序陷阱。若只是在一些任務(wù)種類簡單的單片機上使用RTOS的話,無疑需要權(quán)衡大量代碼可能帶來的問題和RTOS所帶來的效益之間的平衡。相比之下,基于狀態(tài)機的IIC驅(qū)動算法填補了RTOS在一定場合下的適用性的空缺,更能廣泛地應(yīng)用于需要高可靠性的場合,單片機處理性能有限的場合,對程序編寫者來說也更加友好,程序可讀性也更好。

參考文獻(xiàn)

[1] 張毅剛,趙光權(quán),劉旺.單片機原理及應(yīng)用[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)思想在單片機中的具體應(yīng)用[J].電子設(shè)計應(yīng)用,2003(Z1):56-58.

[5] 唐飛,楊偉.基于多任務(wù)機制的STM32系統(tǒng)程序設(shè)計[J].安慶師范大學(xué)學(xué)報:自然科學(xué)版,2019,25(4):70-74.

[6] 王洪生.單片機的延時與中斷問題及解決方法[J].科技創(chuàng)新導(dǎo)報,2019,16(34):54-55.

[7] 關(guān)鑫.基于C語言的計算機編程技術(shù)分析[J].科技資訊,2019,17(16):16-17.

[8] 杜隆胤,方冰,鄭軍.51單片機循環(huán)輪詢多任務(wù)編程[J].計算機時代,2018(10):1-4.

[9] 楊旭.單片機編程中有限狀態(tài)機的應(yīng)用[J].科技風(fēng),2017(15):71.

[10] 郭兆正,于鵬,于震.基于有限狀態(tài)機建模的單片機編程方法研究[J].渤海大學(xué)學(xué)報:自然科學(xué)版,2016,37(3):266-270.

西林县| 开鲁县| 吉林省| 邯郸市| 比如县| 石狮市| 长宁县| 深州市| 遂昌县| 安义县| 中牟县| 双峰县| 南乐县| 德安县| 台山市| 孟州市| 土默特右旗| 泸西县| 团风县| 玉环县| 沁水县| 历史| 大足县| 克山县| 宕昌县| 隆回县| 扎赉特旗| 邻水| 西青区| 建水县| 铜山县| 桐梓县| 葵青区| 浮山县| 高淳县| 于都县| 吉林市| 治多县| 道孚县| 广水市| 盐山县|