• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

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

      鄭安迪 林偉敏 富雅瓊

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

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

      中圖分類號(hào):TP336 ? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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)簡(jiǎn)單、連線少,簡(jiǎn)化了硬件電路方面的設(shè)計(jì),所以很多設(shè)備都采用該通信方式。軟件模擬IIC因?yàn)槠淇梢浦材芰?qiáng),配置方便,使用過程簡(jiǎn)單,在很多單片機(jī)程序設(shè)計(jì)中都用了軟件模擬IIC的編寫思路。因此,在不具備硬件IIC的單片機(jī),一般采用軟件模擬IIC方法。目前常用的模擬IIC采用查詢式程序結(jié)構(gòu),其無(wú)法勝任一些對(duì)時(shí)間控制精確度較高的多任務(wù)工作。為了提高軟件模擬IIC的工作效率,該文設(shè)計(jì)了一種基于狀態(tài)機(jī)的IIC驅(qū)動(dòng)算法。該文設(shè)計(jì)的基于狀態(tài)機(jī)的IIC驅(qū)動(dòng)算法,通過狀態(tài)機(jī)狀態(tài)的改變運(yùn)行相應(yīng)的步驟程序,達(dá)到非占用式的多任務(wù)穿插運(yùn)行,從而提高了效率,對(duì)于測(cè)量?jī)x器和對(duì)時(shí)間要求高的任務(wù)尤其有效。

      1? 算法設(shè)計(jì)

      1.1 總體思路

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

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

      發(fā)送部分中程序也分前后臺(tái),發(fā)送字符的(中斷)服務(wù)程序?yàn)榍芭_(tái)程序,處理主程序?yàn)楹笈_(tái)程序。后臺(tái)程序?qū)⒁l(fā)送的字符存入緩存區(qū),前臺(tái)從緩沖區(qū)讀取字符并發(fā)送出去。

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

      1.2 前臺(tái)程序

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

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

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

      1.3 后臺(tái)程序

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

      2? 算法應(yīng)用

      2.1 SHT20溫濕度傳感器介紹

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

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

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

      2.3 程序分析

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

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

      3? 結(jié)語(yǔ)

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

      參考文獻(xiàn)

      [1] 張毅剛,趙光權(quán),劉旺.單片機(jī)原理及應(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] 李興建,李琨,馬文玲.分時(shí)操作系統(tǒng)思想在單片機(jī)中的具體應(yīng)用[J].電子設(shè)計(jì)應(yīng)用,2003(Z1):56-58.

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

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

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

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

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

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

      徐水县| 北碚区| 华坪县| 南开区| 泗洪县| 孟州市| 汤阴县| 铜鼓县| 左权县| 正宁县| 图片| 乌兰察布市| 伊金霍洛旗| 和静县| 萝北县| 新余市| 木里| 苍溪县| 秀山| 灵寿县| 丽江市| 永新县| 北海市| 阿图什市| 临夏县| 西和县| 拜城县| 成都市| 墨玉县| 故城县| 长顺县| 江津市| 勃利县| 吴旗县| 淮阳县| 手游| 噶尔县| 阿拉尔市| 汽车| 四平市| 柳河县|