www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

出品 ?21ic論壇? gaoyang9992006

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


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

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

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

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

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

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


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

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

保持30us
 rt_hw_us_delay(30);

接下來傳感器就該響應(yīng)這個(gè)請(qǐng)求了,這個(gè)時(shí)候就要讓主控讀取信號(hào)的模式了

讀取相應(yīng),因?yàn)榻酉聛砥骷?huì)主動(dòng)拉低總線80us,然后再拉高80us.
我們先切換主控的這個(gè)IO到輸入模式,進(jìn)行讀取。然后判斷
器件準(zhǔn)備好的這個(gè)拉低拉高信號(hào)。

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

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


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

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

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

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

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



根據(jù)這個(gè)時(shí)序圖,可以看出來什么是1,什么是0.
我們看到總線在傳輸數(shù)據(jù)時(shí)候,拉低都是50us,只有拉高長(zhǎng)短不同,長(zhǎng)的表示1,短的表示0.
因此我們讀取每一位時(shí)候,只要先判斷是不是低電平或者高電平,就行了。
在低電平時(shí)候我們等待,當(dāng)高電平到來我們判斷是否大于28us,因?yàn)?6us~28us表示0,70us標(biāo)志1.
所以我們找一個(gè)介于28到70us之間的判斷閾值。
比如我以30us作為閾值,當(dāng)?shù)碗娖浇Y(jié)束后,我延時(shí)30us,如果是0,這個(gè)時(shí)候高電平肯定結(jié)束了,
如果是1,高電平還在持續(xù)。
因此我通過這個(gè)思路判斷是0還是1.
因?yàn)槲乙x取是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é)束后,進(jìn)入高電平,開始計(jì)時(shí)30us rt_hw_us_delay(30); tmp=0;//如果此時(shí)還是高電平,那么肯定是大于28us,確定是1來了,賦值1 if(Read_AM2301_PIN()) tmp=1; cnt=0;//等待高電平結(jié)束,號(hào)進(jìn)入下一位的讀取 while(Read_AM2301_PIN()) { if(++cnt>=2000) break; }//移位寫入剛剛得到的1個(gè)BIT buffer<<=1; buffer|=tmp; } return buffer;}

接下來實(shí)現(xiàn)什么呢?
實(shí)現(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ù),其實(shí)這么做是方便移植,如果你要去其他芯片下使用,你只需要實(shí)現(xiàn)這3個(gè)函數(shù)以及延時(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; //收到起始標(biāo)志位unsigned char Sensor_ErrorFlag; //讀取傳感器錯(cuò)誤標(biāo)志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)



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


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

21ic電子網(wǎng)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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