亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        STM32-MCU片內(nèi)IIC接口的驅(qū)動(dòng)程序設(shè)計(jì)

        2018-08-31 05:54:34河南馳誠(chéng)電氣股份有限公司怯肇乾
        電子世界 2018年16期
        關(guān)鍵詞:指令

        河南馳誠(chéng)電氣股份有限公司 朱 斌 張 磊 怯肇乾

        1 引言

        意法半導(dǎo)體STM(STMicroelectronics)的Cortex-M系列微控制器MCU(Micro Control Unit),性價(jià)比高,應(yīng)用廣泛。然而,其片內(nèi)集成的硬件IIC總線(Inter-Integrated Circuit)接口運(yùn)用,幾乎是共認(rèn)的“雞肋”。此類MCU外接IIC設(shè)備,如數(shù)據(jù)隨機(jī)存儲(chǔ)器RAM(Ramdom Access Memory)、傳感器Sensor、液晶顯示模塊LCM()等,很多工程師,寧可用通用輸入輸出端口GPIO(General Purpose Input Output)模擬實(shí)現(xiàn)IIC通信,也不用其片內(nèi)集成的IIC接口。

        選用片內(nèi)IIC接口,即使采用STM提供的庫(kù)驅(qū)動(dòng)函數(shù),程序卡死或跑飛,是“家常便飯”。GPIO模擬IIC通信,盡管容易實(shí)現(xiàn),但它耗用MCU資源多,形成的IIC時(shí)序不規(guī)范,而且為保證IIC時(shí)序的完整性而在通信期間關(guān)閉系統(tǒng)中斷又會(huì)嚴(yán)重影響嵌入式軟件體系的整體調(diào)度性能。

        GPIO模擬IIC“得不償失”,閑置片內(nèi)IIC“棄之可惜”。深入研究STM-MCU-IIC時(shí)序,借鑒GPIO模擬和STM庫(kù)函數(shù)通信經(jīng)驗(yàn),充分運(yùn)用并簡(jiǎn)化片內(nèi)IIC驅(qū)動(dòng)通信,勢(shì)在必行。

        2 片內(nèi)IIC驅(qū)動(dòng)現(xiàn)狀[1][4]

        選用片內(nèi)IIC接口,采用STM-IIC驅(qū)動(dòng)庫(kù)函數(shù)或自編驅(qū)動(dòng),進(jìn)行IIC總線主從通信,通常MCU為主,設(shè)備為從,很容易捕捉發(fā)現(xiàn):發(fā)送數(shù)據(jù)沒(méi)有問(wèn)題,接收多個(gè)數(shù)據(jù)沒(méi)有問(wèn)題,讀入1個(gè)數(shù)據(jù),IIC總線停止。對(duì)于RAM等外設(shè)的訪問(wèn),多讀幾個(gè)數(shù)據(jù)很容易回避讀入1個(gè)數(shù)據(jù)時(shí)的“尷尬”,但必需讀入1個(gè)字節(jié)的寄存器時(shí),就不得不“面對(duì)”了。

        圖1下面給出的是示波器測(cè)量空氣質(zhì)量傳感器CSS811的配置與狀態(tài)回讀時(shí)序,CSS811作為從機(jī),地址為0x5A,對(duì)CSS811內(nèi)部寄存器0x01地址寫入0x38完成配置,之后對(duì)狀態(tài)寄存器0x00回讀1 字節(jié),即:發(fā)送0x01、0x38完成配置,發(fā)送0x00啟動(dòng)狀態(tài)讀,之后讀入1 字節(jié)。

        圖1說(shuō)明,按1個(gè)字讀,沒(méi)有結(jié)果;按2個(gè)以上字節(jié)讀,數(shù)據(jù)線拉低,致使IIC總線停止。

        圖1 片內(nèi)IIC原始收發(fā)時(shí)序展示圖Dig.1 Transmit & receive Timing Diagram for Primitive IIC on Chip

        圖2 STM-CortexMx-MCU-IIC主發(fā)送器傳送序列及其說(shuō)明圖Dig.2 STM-CortexMx-MCU-IIC Master Sender Timing Diagram

        圖3 STM-CortexMx-MCU-IIC主接收器傳送序列及其說(shuō)明圖Dig.3 STM-CortexMx-MCU-IIC Slaver Sender Timing Diagram

        3 片內(nèi)IIC操作研究[1][3][4]

        深入研究各類STM-CortexMx-MCU參考手冊(cè)的IIC總線控制器,以7位地址主機(jī)收發(fā)為例,歸納IIC操作控制時(shí)序,如圖2、3所示。

        對(duì)比圖2、3的傳送序列和片內(nèi)IIC驅(qū)動(dòng)的現(xiàn)狀,可以看到:IIC發(fā)送和多字節(jié)接收,各個(gè)操控時(shí)刻點(diǎn)和內(nèi)容非常明確,所以很容易編程實(shí)現(xiàn);而單字節(jié)接收的操控時(shí)刻點(diǎn)EV6_1極難把握,幾乎沒(méi)有辦法及時(shí)發(fā)出清除位和產(chǎn)生停止位。在發(fā)出“從設(shè)備地址slvAddr+讀r”后,產(chǎn)生停止位,就會(huì)收不到任何數(shù)據(jù);在收好數(shù)據(jù)后產(chǎn)生停止位,就出現(xiàn)數(shù)據(jù)線拉低的IIC總線停止現(xiàn)象。

        4 片內(nèi)IIC恰當(dāng)驅(qū)動(dòng)設(shè)計(jì)[2][3][5]

        確定單字節(jié)接收的操控時(shí)刻點(diǎn)EV6_1,準(zhǔn)確給出操控指令,是片內(nèi)IIC驅(qū)動(dòng)程序設(shè)計(jì)的關(guān)鍵。

        針對(duì)單字節(jié)數(shù)據(jù)接收,先標(biāo)記“發(fā)出從設(shè)備地址slvAddr+讀r”,再在收到數(shù)據(jù)標(biāo)識(shí)并且有“發(fā)出從設(shè)備地址slvAddr+讀r”標(biāo)識(shí)后“控制發(fā)送停止位并清除發(fā)出從設(shè)備地址slvAddr+讀r標(biāo)識(shí),之后讀入數(shù)據(jù)。跟蹤試驗(yàn),問(wèn)題解決,并且不響應(yīng)2個(gè)以上數(shù)據(jù)的接收。綜合設(shè)計(jì)恰當(dāng)?shù)钠瑑?nèi)IIC驅(qū)動(dòng)程序流程如圖4所示,這里采用GPIO模擬IIC的中斷關(guān)閉經(jīng)驗(yàn),在中斷中進(jìn)行IIC數(shù)據(jù)收發(fā),并且設(shè)置IIC收發(fā)中斷事件優(yōu)先級(jí)僅次于系統(tǒng)調(diào)度時(shí)鐘,以確保不因其它事件插入時(shí)間過(guò)長(zhǎng)而破壞IIC操控時(shí)序的完整性。

        圖4 恰當(dāng)?shù)钠瑑?nèi)IIC驅(qū)動(dòng)程序流程圖Dig.4 Fitting Driver Flow Chart for IIC on Chip

        驅(qū)動(dòng)程序有4個(gè)部分啟動(dòng)準(zhǔn)備、從機(jī)訪問(wèn)、數(shù)據(jù)接收和數(shù)據(jù)發(fā)送,前2部分是操控,后2部分是收發(fā),字節(jié)流形式,每次進(jìn)入僅完成1個(gè)部分操作,不同于傳統(tǒng)的軟件流。

        主要實(shí)現(xiàn)程序代碼如下,篇幅限制,略去初始化部分:

        unsigned char slvAddr = 0x07; // 主機(jī)欲尋址的從機(jī)地址

        unsigned char IIC2_Buf[Iic2BufSize]; // IIC2: 收發(fā)數(shù)據(jù)緩沖

        int IIC2_DtaPrt;

        char IIC2_MsgFlag,IIC2_EvtFlag = 0; // 接收標(biāo)識(shí): 公共信息[0-是/1-非],事件

        short IIC2_DataCts; // 收發(fā)計(jì)數(shù)器

        char IIC2_Mode; // 收發(fā)標(biāo)識(shí): 0--收,1--發(fā)

        char IIC2_Read(unsigned int count) // IIC2數(shù)據(jù)接收(指定數(shù)量,返回標(biāo)識(shí)公共信息標(biāo)識(shí))

        { IIC2_Mode = 0;IIC2_DtaPrt = 0;

        IIC2_DataCts = count;

        IIC2_MsgFlag = 0;IIC2_EvtFlag = 0;

        IIC2_CR1 |= 1 << 8; // 啟動(dòng)IIC控制傳輸[主模式]

        if(IIC2_DataCts>1) IIC2_CR1 |= 1 << 10; // 允許應(yīng)答

        while(IIC2_DataCts) ; // 等待數(shù)據(jù)接收完成(中斷方式)

        return IIC2_MsgFlag;

        }

        void IIC2_Write(unsigned int count) // IIC2數(shù)據(jù)發(fā)送(指定數(shù)據(jù)數(shù)量)

        { IIC2_Mode = 1;IIC2_DtaPrt = 0;

        IIC2_DataCts = count;IIC2_EvtFlag = 0;

        IIC2_CR1 |= 1 << 8; // 啟動(dòng)IIC控制傳輸[主模式]

        IIC2_CR1 |= 1 << 10; // 允許應(yīng)答

        while(IIC2_DataCts) ; // 等待數(shù)據(jù)接收完成(中斷方式)

        IIC2_CR1 |= 1 << 9; // 停止IIC控制傳輸[主模式]

        }

        void Iic2Evt_Process(void) // IIC2數(shù)據(jù)收發(fā)處理

        { unsigned int iicSt = IIC2_SR2; // 獲得IIC2工作狀態(tài)

        iicSt <<= 16;iicSt |= IIC2_SR1;

        if((iicSt&0x00030001)==0x00030001) // 主機(jī)收發(fā): 啟動(dòng)位已經(jīng)發(fā)出,準(zhǔn)備SLA+W/R

        { if(IIC2_Mode) IIC2_DR = slvAddr << 1; // 寫W

        else IIC2_DR = (slvAddr << 1) | 1; // 讀R

        }

        if(!IIC2_Mode) // 主機(jī)接收

        { if((iicSt&0x00030002)==0x00030002) // 已經(jīng)發(fā)出SLA+R,收到了ACK

        { if(IIC2_DataCts==1) // 只有一個(gè)字節(jié),NACK

        { IIC2_CR1 &= ~(1 << 10);

        IIC2_CR1 &= ~(1 << 9);

        IIC2_EvtFlag |= 1;

        }

        }

        else if((iicSt&0x00030040)==0x00030040) // 數(shù)據(jù)接收

        { if(IIC2_EvtFlag&1)

        { IIC2_CR1 |= 1 << 9;

        IIC2_EvtFlag &= ~1;

        }

        IIC2_Buf[IIC2_DtaPrt++] = IIC2_DR;

        IIC2_DataCts--;

        if(IIC2_DataCts==1) // 最后字節(jié),NACK

        { IIC2_CR1 &= ~(1 << 10);

        IIC2_CR1 |= 1 << 9;

        }

        }}

        if(IIC2_Mode) // 主機(jī)發(fā)送

        { if((iicSt&0x00070082)==0x00070082) // 已經(jīng)發(fā)出SLA+W,收到了ACK

        IIC2_EvtFlag |= 1;

        else if((IIC2_EvtFlag&1)&& // 第一個(gè)數(shù)據(jù)發(fā)送

        ((iicSt&0x00070080)==0x00070080))

        { IIC2_DR = IIC2_Buf[IIC2_DtaPrt++];

        IIC2_DataCts--;IIC2_EvtFlag &= ~1;

        }

        else if((iicSt&0x00070084)==0x00070084) // 數(shù)據(jù)已經(jīng)傳輸,收到了ACK

        { if(IIC2_DataCts) // 繼續(xù)發(fā)送數(shù)據(jù)

        { IIC2_DR = IIC2_Buf[IIC2_DtaPrt++];

        IIC2_DataCts--;

        }

        }}

        }

        所有驅(qū)動(dòng)代碼,不過(guò)200行,相對(duì)GPIO模擬IIC和STM-IIC庫(kù)函數(shù),得到了最大的簡(jiǎn)化。

        5 實(shí)踐應(yīng)用測(cè)試

        圖5是示波器捕捉的前述空氣質(zhì)量傳感器CSS811(從地址0x5A)配置后的狀態(tài)查詢過(guò)程時(shí)序,先發(fā)送指令0x00,再做1字節(jié)數(shù)據(jù)接收。

        圖5 空質(zhì)傳感器的1字節(jié)狀態(tài)指令讀取時(shí)序圖Dig.5 1 Byte State-Receiving Timing Diagram for Air-Sensor

        圖6 是示波器捕捉的溫濕度傳感器CTH21(從地址0x40)的溫度讀取時(shí)序,發(fā)送指令0xE3后做3字節(jié)數(shù)據(jù)接收。

        圖6 溫濕度傳感器的3字節(jié)數(shù)據(jù)讀取時(shí)序Dig.6 3 Bytes Data-Receiving Timing Diagram for Temperature-Humidity-Sensor

        圖7 是示波器捕捉的CTH21測(cè)量的電池供電時(shí)序狀況,發(fā)送指令0xE7后做1字節(jié)數(shù)據(jù)接收。

        結(jié)合圖5~7和程序仿真跟蹤,可以看出設(shè)計(jì)驅(qū)動(dòng)程序,很好實(shí)現(xiàn)了各種數(shù)據(jù)的收發(fā),無(wú)論單個(gè)數(shù)據(jù)還是多個(gè)數(shù)據(jù)讀寫。之后,運(yùn)用到空質(zhì)測(cè)控終端,從數(shù)個(gè)月的連續(xù)運(yùn)行的結(jié)果看,新設(shè)計(jì)的片內(nèi)IIC驅(qū)動(dòng),非常給力的。

        圖7 電池供電傳感器的1字節(jié)數(shù)據(jù)讀取時(shí)序Dig.1 1 Byte State-Receiving Timing Diagram for Bettery-Sensor

        6 結(jié)束語(yǔ)

        經(jīng)過(guò)深入的查閱分析思考和反復(fù)的測(cè)量鑒定與跟蹤仿真,找準(zhǔn)了片內(nèi)IIC接口驅(qū)動(dòng)程序合適的操控點(diǎn)并及時(shí)發(fā)出了操控指令,在借鑒GPIO模擬操控的基礎(chǔ)上,終于實(shí)現(xiàn)了STM-MCU-IIC硬件接口全面可靠高效的驅(qū)動(dòng),既提升了功能和性能,還充分簡(jiǎn)化了驅(qū)動(dòng)設(shè)計(jì)。仔細(xì)觀察IIC接收時(shí)序,無(wú)論單字節(jié)接收或多字節(jié)接收,無(wú)意中在最后都多發(fā)了一個(gè)字節(jié)的操作時(shí)鐘,這個(gè)字節(jié)數(shù)據(jù)進(jìn)入了接收寄存器,只是沒(méi)有理會(huì)它罷了,是“得意”中的“敗筆”,有待徹底去除,以求“完美”。

        猜你喜歡
        指令
        聽(tīng)我指令:大催眠術(shù)
        ARINC661顯控指令快速驗(yàn)證方法
        LED照明產(chǎn)品歐盟ErP指令要求解讀
        殺毒軟件中指令虛擬機(jī)的脆弱性分析
        巧用G10指令實(shí)現(xiàn)橢圓輪廓零件倒圓角
        中斷與跳轉(zhuǎn)操作對(duì)指令串的影響
        科技傳播(2015年20期)2015-03-25 08:20:30
        基于匯編指令分布的惡意代碼檢測(cè)算法研究
        一種基于滑窗的余度指令判別算法
        歐盟修訂電氣及電子設(shè)備等產(chǎn)品安全規(guī)定
        家電科技(2014年5期)2014-04-16 03:11:28
        MAC指令推動(dòng)制冷劑行業(yè)發(fā)展
        汽車零部件(2014年2期)2014-03-11 17:46:27
        日韩欧美亚洲综合久久影院d3| 免费无码又爽又刺激聊天app| 国产一区二区波多野结衣| 饥渴的熟妇张开腿呻吟视频| 亚洲av无码专区国产乱码不卡| 精品一区二区三区在线观看视频| 亚洲AV无码成人网站久久精品| 一本一道波多野结衣一区| 最新69国产成人精品视频免费| 国产午夜精品一区二区三区视频| 国产亚洲日本人在线观看| 亚洲av有码精品天堂| 视频国产一区二区在线| 狠色人妻丝袜中文字幕| 少妇真实被内射视频三四区| 狠狠色噜噜狠狠狠777米奇小说| 国产精品视频露脸| 久久人人97超碰超国产| 2021国产精品一区二区在线| 白白色发布永久免费观看视频| 亚洲精品中文字幕乱码3| 国产av在线观看一区二区三区| 国产熟妇疯狂4p交在线播放| 国产精品一区二区在线观看| 吃奶还摸下面动态图gif| 无码人妻少妇久久中文字幕蜜桃 | 无码国产精品一区二区AV| 青青草伊人视频在线观看| 中文字幕有码在线人妻| 久久亚洲道色综合久久| 国精产品一区一区二区三区mba| 亚洲小说图区综合在线| 欧美日韩亚洲成人| 国产日韩欧美视频成人| 91久久国产露脸国语对白| 中文字日产幕码三区的做法步| 亚洲人成精品久久久久| 99精品国产99久久久久久97| 色婷婷综合激情| 亚洲精品午夜精品国产| 人妻少妇中文字幕久久hd高清|