STM32 AM2305高精度溫濕度傳感器驅(qū)動(dòng)
最近用到的溫濕度傳感器,AM2305驅(qū)動(dòng),單總線,上電后至少要延時(shí)2S才能讀取溫濕度,溫度精度很高,跟DS18B20一樣,數(shù)據(jù)帶校驗(yàn),不會(huì)出現(xiàn)DS18B20那樣,并且時(shí)序要求不高
/*************************************************************************************************************
*文件名:AM2305.c
*功能:STM32AM2305高精度溫濕度傳感器驅(qū)動(dòng)
*作者:cp1300@139.com
*創(chuàng)建時(shí)間:2014-09-20
*最后修改時(shí)間:2014-09-20
*詳細(xì):需要延時(shí)函數(shù)支持
*注意延時(shí)精度盡可能的高
*讀取的時(shí)候不要長(zhǎng)時(shí)間的被中斷,因?yàn)?wire對(duì)時(shí)間要求很嚴(yán)格
*************************************************************************************************************/
#include"system.h"
#include"delay.h"
#include"AM2305.h"
//DS18B20使用的是GPIOE0
#defineAM2305_CLK_INIT()DeviceClockEnable(AM2305_DEV,ENABLE);//時(shí)鐘使能
#defineAM2305_IO_OUT()GPIOx_Init(AM2305_GPIOx,AM2305_BITx,OUT_PP,SPEED_10M);//設(shè)置AM2305IO為輸出,
#defineAM2305_IO_IN()GPIOx_Init(AM2305_GPIOx,AM2305_BITx,IN_IPU,0);//設(shè)置AM2305IO為上拉輸入,
#defineAM2305_DQ_IN()((AM2305_IN)?1:0)//讀取AM2305IO
#defineAM2305_DQ_OUT(x)(AM2305_OUT=x)//寫AM2305IO
#defineAM2305_IODown()GPIOx_Init(AM2305_GPIOx,AM2305_BITx,IN_IPT,0);//掉電,下拉輸入
//精確us延時(shí)
#defineAM2305_Delay_US(x)delay_us(x)
//AM2305掉電
voidAM2305_PowerDown(void)
{
AM2305_IODown();
}
/*************************************************************************************************************************
*函數(shù):voidAM2305_Reset(void)
*功能:AM2305復(fù)位
*參數(shù):無
*返回:無
*依賴:底層宏定義
*作者:cp1300@139.com
*時(shí)間:2014-09-20
*最后修改時(shí)間:2014-09-20
*說明:無
*************************************************************************************************************************/
voidAM2305_Reset(void)
{
AM2305_IO_OUT();//SETOUTPUT
AM2305_DQ_OUT(0);//拉低DQ
AM2305_Delay_US(1000);//拉低至少800uS
AM2305_DQ_OUT(1);//DQ=1
AM2305_Delay_US(30);//主機(jī)拉高20~40us
}
/*************************************************************************************************************************
*函數(shù):boolAM2305_Check(void)
*功能:等待AM2305的回應(yīng)
*參數(shù):無
*返回:FALSE:檢測(cè)失敗;TRUE:檢測(cè)成功
*依賴:底層宏定義
*作者:cp1300@139.com
*時(shí)間:2014-09-20
*最后修改時(shí)間:2014-09-20
*說明:檢測(cè)AM2305的存在
*************************************************************************************************************************/
boolAM2305_Check(void)
{
u32retry=0;
AM2305_IO_IN();//SETINPUT
while(AM2305_DQ_IN()&&retry<100)//AM2305會(huì)拉低75~85us
{
retry++;
AM2305_Delay_US(1);
}
if(retry>=100)
{
uart_printf("AM2305:retry1:%drn",retry);
returnFALSE;
}
retry=0;
while(!AM2305_DQ_IN()&&retry<100)//AM2305拉低后會(huì)再次拉高75~85us
{
retry++;
AM2305_Delay_US(1);
}
if(retry>=100)
{
uart_printf("AM2305:retry2:%drn",retry);
returnFALSE;
}
returnTRUE;
}
/*************************************************************************************************************************
*函數(shù):u8AM2305_ReadBit(void)
*功能:讀取AM23051bit數(shù)據(jù)
*參數(shù):無
*返回:數(shù)據(jù)
*依賴:底層宏定義
*作者:cp1300@139.com
*時(shí)間:2014-09-20
*最后修改時(shí)間:2014-09-20
*說明:
*************************************************************************************************************************/
u8AM2305_ReadBit(void)
{
u8retry=0;
while(AM2305_DQ_IN()&&retry<80)//等待變?yōu)榈碗娖?/p>
{