當前位置:首頁 > 公眾號精選 > 21ic電子網(wǎng)
[導讀]有很多傳感器手冊給了我們時序圖,我們只要按照時序圖操作就行了,還有一些是標準接口,例如SPI,IIC,UART,這些可以利用硬件提供的收發(fā)器通信,還有一些我們沒有足夠的接口,或者沒有對應(yīng)的接口與之通信,我們可以按照手冊提供的時序圖,利用IO來完成讀寫操作。完成的思路是模塊化編程思想,將問題逐個分解。由大化小,實現(xiàn)小的功能。

出品 ?21ic論壇? gaoyang9992006

網(wǎng)站:bbs.21ic.com


有很多傳感器手冊給了我們時序圖,我們只要按照時序圖操作就行了,還有一些是標準接口,例如SPI,IIC,UART,這些可以利用硬件提供的收發(fā)器通信,還有一些我們沒有足夠的接口,或者沒有對應(yīng)的接口與之通信,我們可以按照手冊提供的時序圖,利用IO來完成讀寫操作。完成的思路是模塊化編程思想,將問題逐個分解。由大化小,實現(xiàn)小的功能。

比如常用的單線協(xié)議的溫濕度傳感器DHT21。

工程師為你講解,如何看懂時序圖!
可以看到一共40BIT,并注意到是以8BIT為單位的,因此我們可以先規(guī)劃成每次讀取8BIT,讀取5次,完成讀取。
工程師為你講解,如何看懂時序圖!

開始讀取時候,假設(shè)傳感器是空閑的,那么這個時候傳感器就是在高電平,主控想要發(fā)起讀取,要給傳感器一個讀取的信號,這個信號就是先拉低至少500us,然后拉高20到40us。
因此這個時候,主控的IO要處于輸出狀態(tài),我們可以輸出1,也可以輸出0,先輸出1,然后輸出0,將0持續(xù)的事件大于500us,然后輸出1
保持20us到40us。

為了靠譜,我這里拉低持續(xù)2ms,拉高持續(xù)30us,先設(shè)置IO的模式為輸出模式。
 Write_AM2301_PIN_Init();

拉低這個端口,即輸出0
 RESET_AM2301_PIN();


保持2ms,這樣就滿足最少500us了。
 HAL_Delay(2);

然后拉高它,輸出1
 SET_AM2301_PIN();

保持30us
 rt_hw_us_delay(30);

接下來傳感器就該響應(yīng)這個請求了,這個時候就要讓主控讀取信號的模式了

讀取相應(yīng),因為接下來器件會主動拉低總線80us,然后再拉高80us.
我們先切換主控的這個IO到輸入模式,進行讀取。然后判斷
器件準備好的這個拉低拉高信號。

第一步,切斷刀輸入模式,準備讀取IO信號
 Read_AM2301_PIN_Init(); Sensor_AnswerFlag=0;

判斷是否傳感器拉低了總線,拉低表示傳感器要發(fā)送準備好信號了
 if(Read_AM2301_PIN()==GPIO_PIN_RESET) { Sensor_AnswerFlag=1; Sys_CNT=0;


等待準備好的拉低段80us結(jié)束,并計數(shù),看看是否超時。
 while(Read_AM2301_PIN()==GPIO_PIN_RESET) { if(++Sys_CNT>3000) { Sensor_ErrorFlag=1; return 0; } } Sys_CNT=0;

如果準備拉低狀態(tài)順利結(jié)束,再看看準備信號的拉高狀態(tài)是否OK
 while(Read_AM2301_PIN()==GPIO_PIN_SET) { if(++Sys_CNT>3000) { Sensor_ErrorFlag=1; return 0; } }

一切OK的話,就該讀取實際的傳感器輸出值了。這個時候要寫入到存儲傳感器40BIT數(shù)值的變量里了
每次讀取8BIT,一共5此,所以用個循環(huán)。方到準備好的變量數(shù)組里
 for(i=0;i<5;i++) { AM2301_Data = Read_AM2301_Data();i> }</i>

接下來我們還要實現(xiàn)什么呢,當然是基本的讀取8BIT的操作了。

工程師為你講解,如何看懂時序圖!



根據(jù)這個時序圖,可以看出來什么是1,什么是0.
我們看到總線在傳輸數(shù)據(jù)時候,拉低都是50us,只有拉高長短不同,長的表示1,短的表示0.
因此我們讀取每一位時候,只要先判斷是不是低電平或者高電平,就行了。
在低電平時候我們等待,當高電平到來我們判斷是否大于28us,因為26us~28us表示0,70us標志1.
所以我們找一個介于28到70us之間的判斷閾值。
比如我以30us作為閾值,當?shù)碗娖浇Y(jié)束后,我延時30us,如果是0,這個時候高電平肯定結(jié)束了,
如果是1,高電平還在持續(xù)。
因此我通過這個思路判斷是0還是1.
因為我要讀取是8BIT,因此我用循環(huán)8次的操作。

unsigned char Read_AM2301_Data(void){ unsigned char i,cnt,buffer,tmp;//要讀取8次 for (i = 0; i < 8; i++) { cnt=0;//判斷低電平是否結(jié)束 while(!Read_AM2301_PIN()) { if(++cnt>=3000) break; }//低電平結(jié)束后,進入高電平,開始計時30us rt_hw_us_delay(30); tmp=0;//如果此時還是高電平,那么肯定是大于28us,確定是1來了,賦值1 if(Read_AM2301_PIN()) tmp=1; cnt=0;//等待高電平結(jié)束,號進入下一位的讀取 while(Read_AM2301_PIN()) { if(++cnt>=2000) break; }//移位寫入剛剛得到的1個BIT buffer<<=1; buffer|=tmp; } return buffer;}

接下來實現(xiàn)什么呢?
實現(xiàn)讀取IO狀態(tài)和寫高低電平。
unsigned char Read_AM2301_PIN(void){ return HAL_GPIO_ReadPin(AM2301_PORT, AM2301_PIN);}
void SET_AM2301_PIN(void){ HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_SET);}
void RESET_AM2301_PIN(void){ HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_RESET);}

這里我直接調(diào)用的HAL庫函數(shù),其實這么做是方便移植,如果你要去其他芯片下使用,你只需要實現(xiàn)這3個函數(shù)以及延時函數(shù)就行了。邏輯順序無需修改。最后奉上源碼
#include "stm32f0xx_hal.h"
//讀傳感器 端口位定義,可修改//*#define AM2301_PIN GPIO_PIN_10#define AM2301_PORT GPIOA#define AM2301_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()#define AM2301_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE()

unsigned char Sensor_AnswerFlag; //收到起始標志位unsigned char Sensor_ErrorFlag; //讀取傳感器錯誤標志unsigned int Sys_CNT;unsigned char AM2301_Data[5]={0x00,0x00,0x00,0x00,0x00};
void Read_AM2301_PIN_Init(void){ AM2301_GPIO_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pin = AM2301_PIN; HAL_GPIO_Init(AM2301_PORT, &GPIO_InitStruct);}
void Write_AM2301_PIN_Init(void){ AM2301_GPIO_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pin = AM2301_PIN; HAL_GPIO_Init(AM2301_PORT, &GPIO_InitStruct);}
unsigned char Read_AM2301_PIN(void){ return HAL_GPIO_ReadPin(AM2301_PORT, AM2301_PIN);}
void SET_AM2301_PIN(void){ HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_SET);}
void RESET_AM2301_PIN(void){ HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_RESET);}
unsigned char Read_AM2301_Data(void){ unsigned char i,cnt,buffer,tmp; for (i = 0; i < 8; i++) { cnt=0; while(!Read_AM2301_PIN()) { if(++cnt>=3000) break; } rt_hw_us_delay(30); tmp=0; if(Read_AM2301_PIN()) tmp=1; cnt=0; while(Read_AM2301_PIN()) { if(++cnt>=2000) break; } buffer<<=1; buffer|=tmp; } return buffer;}
unsigned char Read_Sensor(void){ unsigned char i; Write_AM2301_PIN_Init(); RESET_AM2301_PIN();// rt_thread_mdelay(2); HAL_Delay(2); SET_AM2301_PIN(); rt_hw_us_delay(30); SET_AM2301_PIN();
Read_AM2301_PIN_Init(); Sensor_AnswerFlag=0; if(Read_AM2301_PIN()==GPIO_PIN_RESET) { Sensor_AnswerFlag=1; Sys_CNT=0; while(Read_AM2301_PIN()==GPIO_PIN_RESET) { if(++Sys_CNT>3000) { Sensor_ErrorFlag=1; return 0; } } Sys_CNT=0; while(Read_AM2301_PIN()==GPIO_PIN_SET) { if(++Sys_CNT>3000) { Sensor_ErrorFlag=1; return 0; } } for(i=0;i<5;i++) { AM2301_Data[i] = Read_AM2301_Data(); } } else { Sensor_AnswerFlag=0; } return 1;}



本文系21ic論壇網(wǎng)友gaoyang9992006原創(chuàng)



工程師為你講解,如何看懂時序圖!


免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

21ic電子網(wǎng)

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉