999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

STM32-MCU片內IIC接口的驅動程序設計

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

河南馳誠電氣股份有限公司 朱 斌 張 磊 怯肇乾

1 引言

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

選用片內IIC接口,即使采用STM提供的庫驅動函數,程序卡死或跑飛,是“家常便飯”。GPIO模擬IIC通信,盡管容易實現,但它耗用MCU資源多,形成的IIC時序不規范,而且為保證IIC時序的完整性而在通信期間關閉系統中斷又會嚴重影響嵌入式軟件體系的整體調度性能。

GPIO模擬IIC“得不償失”,閑置片內IIC“棄之可惜”。深入研究STM-MCU-IIC時序,借鑒GPIO模擬和STM庫函數通信經驗,充分運用并簡化片內IIC驅動通信,勢在必行。

2 片內IIC驅動現狀[1][4]

選用片內IIC接口,采用STM-IIC驅動庫函數或自編驅動,進行IIC總線主從通信,通常MCU為主,設備為從,很容易捕捉發現:發送數據沒有問題,接收多個數據沒有問題,讀入1個數據,IIC總線停止。對于RAM等外設的訪問,多讀幾個數據很容易回避讀入1個數據時的“尷尬”,但必需讀入1個字節的寄存器時,就不得不“面對”了。

圖1下面給出的是示波器測量空氣質量傳感器CSS811的配置與狀態回讀時序,CSS811作為從機,地址為0x5A,對CSS811內部寄存器0x01地址寫入0x38完成配置,之后對狀態寄存器0x00回讀1 字節,即:發送0x01、0x38完成配置,發送0x00啟動狀態讀,之后讀入1 字節。

圖1說明,按1個字讀,沒有結果;按2個以上字節讀,數據線拉低,致使IIC總線停止。

圖1 片內IIC原始收發時序展示圖Dig.1 Transmit & receive Timing Diagram for Primitive IIC on Chip

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

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

3 片內IIC操作研究[1][3][4]

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

對比圖2、3的傳送序列和片內IIC驅動的現狀,可以看到:IIC發送和多字節接收,各個操控時刻點和內容非常明確,所以很容易編程實現;而單字節接收的操控時刻點EV6_1極難把握,幾乎沒有辦法及時發出清除位和產生停止位。在發出“從設備地址slvAddr+讀r”后,產生停止位,就會收不到任何數據;在收好數據后產生停止位,就出現數據線拉低的IIC總線停止現象。

4 片內IIC恰當驅動設計[2][3][5]

確定單字節接收的操控時刻點EV6_1,準確給出操控指令,是片內IIC驅動程序設計的關鍵。

針對單字節數據接收,先標記“發出從設備地址slvAddr+讀r”,再在收到數據標識并且有“發出從設備地址slvAddr+讀r”標識后“控制發送停止位并清除發出從設備地址slvAddr+讀r標識,之后讀入數據。跟蹤試驗,問題解決,并且不響應2個以上數據的接收。綜合設計恰當的片內IIC驅動程序流程如圖4所示,這里采用GPIO模擬IIC的中斷關閉經驗,在中斷中進行IIC數據收發,并且設置IIC收發中斷事件優先級僅次于系統調度時鐘,以確保不因其它事件插入時間過長而破壞IIC操控時序的完整性。

圖4 恰當的片內IIC驅動程序流程圖Dig.4 Fitting Driver Flow Chart for IIC on Chip

驅動程序有4個部分啟動準備、從機訪問、數據接收和數據發送,前2部分是操控,后2部分是收發,字節流形式,每次進入僅完成1個部分操作,不同于傳統的軟件流。

主要實現程序代碼如下,篇幅限制,略去初始化部分:

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

unsigned char IIC2_Buf[Iic2BufSize]; // IIC2: 收發數據緩沖

int IIC2_DtaPrt;

char IIC2_MsgFlag,IIC2_EvtFlag = 0; // 接收標識: 公共信息[0-是/1-非],事件

short IIC2_DataCts; // 收發計數器

char IIC2_Mode; // 收發標識: 0--收,1--發

char IIC2_Read(unsigned int count) // IIC2數據接收(指定數量,返回標識公共信息標識)

{ IIC2_Mode = 0;IIC2_DtaPrt = 0;

IIC2_DataCts = count;

IIC2_MsgFlag = 0;IIC2_EvtFlag = 0;

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

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

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

return IIC2_MsgFlag;

}

void IIC2_Write(unsigned int count) // IIC2數據發送(指定數據數量)

{ IIC2_Mode = 1;IIC2_DtaPrt = 0;

IIC2_DataCts = count;IIC2_EvtFlag = 0;

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

IIC2_CR1 |= 1 << 10; // 允許應答

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

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

}

void Iic2Evt_Process(void) // IIC2數據收發處理

{ unsigned int iicSt = IIC2_SR2; // 獲得IIC2工作狀態

iicSt <<= 16;iicSt |= IIC2_SR1;

if((iicSt&0x00030001)==0x00030001) // 主機收發: 啟動位已經發出,準備SLA+W/R

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

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

}

if(!IIC2_Mode) // 主機接收

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

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

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

IIC2_CR1 &= ~(1 << 9);

IIC2_EvtFlag |= 1;

}

}

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

{ if(IIC2_EvtFlag&1)

{ IIC2_CR1 |= 1 << 9;

IIC2_EvtFlag &= ~1;

}

IIC2_Buf[IIC2_DtaPrt++] = IIC2_DR;

IIC2_DataCts--;

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

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

IIC2_CR1 |= 1 << 9;

}

}}

if(IIC2_Mode) // 主機發送

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

IIC2_EvtFlag |= 1;

else if((IIC2_EvtFlag&1)&& // 第一個數據發送

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

{ IIC2_DR = IIC2_Buf[IIC2_DtaPrt++];

IIC2_DataCts--;IIC2_EvtFlag &= ~1;

}

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

{ if(IIC2_DataCts) // 繼續發送數據

{ IIC2_DR = IIC2_Buf[IIC2_DtaPrt++];

IIC2_DataCts--;

}

}}

}

所有驅動代碼,不過200行,相對GPIO模擬IIC和STM-IIC庫函數,得到了最大的簡化。

5 實踐應用測試

圖5是示波器捕捉的前述空氣質量傳感器CSS811(從地址0x5A)配置后的狀態查詢過程時序,先發送指令0x00,再做1字節數據接收。

圖5 空質傳感器的1字節狀態指令讀取時序圖Dig.5 1 Byte State-Receiving Timing Diagram for Air-Sensor

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

圖6 溫濕度傳感器的3字節數據讀取時序Dig.6 3 Bytes Data-Receiving Timing Diagram for Temperature-Humidity-Sensor

圖7 是示波器捕捉的CTH21測量的電池供電時序狀況,發送指令0xE7后做1字節數據接收。

結合圖5~7和程序仿真跟蹤,可以看出設計驅動程序,很好實現了各種數據的收發,無論單個數據還是多個數據讀寫。之后,運用到空質測控終端,從數個月的連續運行的結果看,新設計的片內IIC驅動,非常給力的。

圖7 電池供電傳感器的1字節數據讀取時序Dig.1 1 Byte State-Receiving Timing Diagram for Bettery-Sensor

6 結束語

經過深入的查閱分析思考和反復的測量鑒定與跟蹤仿真,找準了片內IIC接口驅動程序合適的操控點并及時發出了操控指令,在借鑒GPIO模擬操控的基礎上,終于實現了STM-MCU-IIC硬件接口全面可靠高效的驅動,既提升了功能和性能,還充分簡化了驅動設計。仔細觀察IIC接收時序,無論單字節接收或多字節接收,無意中在最后都多發了一個字節的操作時鐘,這個字節數據進入了接收寄存器,只是沒有理會它罷了,是“得意”中的“敗筆”,有待徹底去除,以求“完美”。

猜你喜歡
指令
聽我指令:大催眠術
ARINC661顯控指令快速驗證方法
測控技術(2018年5期)2018-12-09 09:04:26
LED照明產品歐盟ErP指令要求解讀
電子測試(2018年18期)2018-11-14 02:30:34
殺毒軟件中指令虛擬機的脆弱性分析
電信科學(2016年10期)2016-11-23 05:11:56
巧用G10指令實現橢圓輪廓零件倒圓角
時代農機(2015年3期)2015-11-14 01:14:29
中斷與跳轉操作對指令串的影響
科技傳播(2015年20期)2015-03-25 08:20:30
基于匯編指令分布的惡意代碼檢測算法研究
一種基于滑窗的余度指令判別算法
歐盟修訂電氣及電子設備等產品安全規定
家電科技(2014年5期)2014-04-16 03:11:28
MAC指令推動制冷劑行業發展
汽車零部件(2014年2期)2014-03-11 17:46:27
主站蜘蛛池模板: 欧美在线中文字幕| 玖玖免费视频在线观看| 91破解版在线亚洲| 毛片视频网址| 色九九视频| 午夜性刺激在线观看免费| 中文字幕波多野不卡一区| 无码一区二区波多野结衣播放搜索| 国产乱肥老妇精品视频| 久久青青草原亚洲av无码| 九色91在线视频| 亚洲欧美色中文字幕| 青青草原国产av福利网站| 亚洲综合色在线| 国产成+人+综合+亚洲欧美| 漂亮人妻被中出中文字幕久久| 自拍偷拍欧美日韩| 久一在线视频| 久久综合婷婷| 国产亚洲精品97在线观看| 色哟哟精品无码网站在线播放视频| 亚洲欧洲日韩久久狠狠爱| 欧美激情一区二区三区成人| 又大又硬又爽免费视频| 色首页AV在线| 丁香六月激情综合| 国产亚洲美日韩AV中文字幕无码成人| 亚洲综合色婷婷| 国精品91人妻无码一区二区三区| 青草国产在线视频| 色国产视频| 天天躁夜夜躁狠狠躁图片| 亚洲AV色香蕉一区二区| 精品无码一区二区三区在线视频| 国产精品白浆在线播放| 亚洲成人网在线播放| 5388国产亚洲欧美在线观看| 久99久热只有精品国产15| 2022国产91精品久久久久久| 在线观看欧美国产| 国产精品蜜芽在线观看| 国产成+人+综合+亚洲欧美| 狠狠躁天天躁夜夜躁婷婷| 九色在线观看视频| 亚洲综合狠狠| 亚洲人成日本在线观看| 看av免费毛片手机播放| 99国产精品免费观看视频| 精品国产成人a在线观看| 国产一在线观看| 全部毛片免费看| 成人在线亚洲| 国产精品免费p区| 国产欧美视频在线观看| 波多野结衣无码视频在线观看| 日韩无码视频网站| 永久免费精品视频| 国产精品无码AV中文| 日韩AV无码免费一二三区| 国产二级毛片| 亚洲第一香蕉视频| 91福利在线看| 国产一级在线播放| 国产视频一区二区在线观看| 国产欧美精品一区aⅴ影院| 美女扒开下面流白浆在线试听| 日本不卡在线播放| 中文字幕va| 久久网欧美| 欧美黄网站免费观看| 国产精品亚洲精品爽爽| 无码精品一区二区久久久| 国产成人h在线观看网站站| 国产精品美女在线| 国产aaaaa一级毛片| 高h视频在线| 九九免费观看全部免费视频| 亚洲综合日韩精品| 在线国产毛片| 国产欧美日韩免费| 国产精品自在线天天看片| 麻豆精品国产自产在线|