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