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