OK6410開發(fā)板裸機(jī)DS18B20驅(qū)動
相信玩過51的童鞋應(yīng)該都玩過DS18B20吧,雖然用在ARM11上面,但是操作還是一樣,多了一點(diǎn)就是讀寫IO前需要切換IO方向,其實(shí)51在讀取之前需要切換到高電平的,這個一般由編譯器完成的,
/*************************************************************************************************************
*文件名:ds18b20.c
*功能:S3C6410DS18B20驅(qū)動
*作者:cp1300@139.com
*創(chuàng)建時間:2012年9月17日22:45
*最后修改時間:2012年9月17日
*詳細(xì):需要延時函數(shù)支持
*注意延時精度盡可能的高
*讀取的時候不要長時間的被中斷,因?yàn)?wire對時間要求很嚴(yán)格
*************************************************************************************************************/
#include"system.h"
#include"timer.h"
#include"delay.h"
#include"ds18b20.h"
//DS18B20使用的是GPIOE0
#defineSet18b20IOout()(rGPECON|=1)//設(shè)置DS18B20IO為輸出,
#defineSet18b20IOin()(rGPECON&=(~0xf))//設(shè)置DS18B20IO為浮空輸入,
#defineRead18b20IO()((rGPEDAT&BIT0)?1:0)//讀取DS18B20IO
#defineWrite18b20IO(x)(x?(rGPEDAT|=BIT0):(rGPEDAT&=~BIT0))//寫DS18B20IO
/*************************************************************************************************************************
*函數(shù):u8DS18B20_Reset(void)
*功能:復(fù)位DS18B20
*參數(shù):無
*返回:0:成功;1:失敗
*依賴:底層宏定義
*作者:cp1300@139.com
*時間:20120917
*最后修改時間:20120917
*說明:無
*************************************************************************************************************************/
u8DS18B20_Reset(void)
{
u8i=0;
Set18b20IOout();//主機(jī)端口推挽輸出模式
Write18b20IO(1);
Delay_US(1);
Write18b20IO(0);//拉低總線480us~240us
Delay_US(500);//>480US延時
Write18b20IO(1);
Delay_US(2);//復(fù)位完成
Set18b20IOin();//主機(jī)端口浮空輸入模式
while(Read18b20IO())//等待低電平應(yīng)答信號
{
i++;
Delay_US(1);
if(i>100)
return1;//等待超時,初始化失敗,返回1;
}
Delay_US(250);//跳過回復(fù)信號
return0x00;//檢測到DS18B20,并且初始化成功
}
/*************************************************************************************************************************
*函數(shù):u8DS18B20_ReadData(void)
*功能:讀取DS18B20數(shù)據(jù)
*參數(shù):無
*返回:數(shù)據(jù)
*依賴:底層宏定義
*作者:cp1300@139.com
*時間:20120917
*最后修改時間:20120917
*說明:無
*************************************************************************************************************************/
u8DS18B20_ReadData(void)
{
u8i,data=0;
for(i=0;i<8;i++)
{
Set18b20IOout();//主機(jī)端口推挽輸出模式
Write18b20IO(0);//拉低總線10-15us
data>>=1;
Delay_US(12);
Write18b20IO(1);//釋放總線
Set18b20IOin();//主機(jī)端口浮空輸入模式
Delay_US(1);
if(Read18b20IO())//讀取數(shù)據(jù),讀取后大約延時40-45us
data|=0x80;
Delay_US(42);
}
returndata;
}
/*************************************************************************************************************************
*函數(shù):voidDS18B20_WriteData(u8data)
*功能:向DS18B20寫數(shù)據(jù)
*參數(shù):數(shù)據(jù)
*返回:無
*依賴:底層宏定義
*作者:cp1300@139.com
*時間:20120917
*最后修改時間:20120917
*說明:無
*************************************************************************************************************************/
voidDS18B20_WriteData(u8data)
{
u8i;
Set18b20IOout();//主機(jī)端口推挽輸出模式
for(i=0;i<8;i++)
{
Write18b20IO(0);//拉低總線10-15us
Delay_US(12);
Write18b20IO(data&0x01);//寫入數(shù)據(jù)位,保持20-45us
Delay_US(30);
Write18b20IO(1);//釋放總線
data>>=1;
Delay_US(2);
}
}
/*************************************************************************************************************************
*函數(shù):s16DS18B20_ReadTemper(void)
*功