我的PCLK等于50MHZ
Temp.h里面的:
#define Set18b20IOout() (rGPGCON = (rGPGCON & 0xFFFFFFFC)|0x01)
#define Set18b20IOin() (rGPGCON &= 0xFFFFFFFC)
#define Read18b20IO() ((rGPGDAT & 1) ? 1 : 0)
#define Write18b20IO(x) (x ? (rGPGDAT |= 1) : (rGPGDAT &= 0))
s16 DS18B20_ReadTemper(void);
Temp.c里面的:
#include "s3c2440_type.h"
#include "Temp.h"
#include "2440addr.h"
void Delay_US(u32 Delay)
{
rTCFG0 &= (0xff);
rTCFG0 |= 24; //1us
rTCFG1 &= ~(0xf);
rTCFG1 |= 0x0;
rTCNTB0 = Delay;
rTCON |= (1<<1);
rTCON = 0x09;
while(!(rSRCPND & (1<<10))); //等待延时到达
rSRCPND |= (1<<10) ; //清除中断标志
}
u8 DS18B20_Reset(void)
{
u8 i = 0;
Set18b20IOout(); //主机端口推挽输出模式
Write18b20IO(1);
Delay_US(1);
Write18b20IO(0); //拉低总线480us~240us
Delay_US(700); //>480US延时
Write18b20IO(1);
Delay_US(30); //复位完成
Set18b20IOin(); //主机端口浮空输入模式
while(Read18b20IO()) //等待低电平应答信号
{
i ++;
Delay_US(1);
if(i > 100)
return 1; //等待超时,初始化失败,返回1;
}
Delay_US(400); //跳过回复信号
return 0x00; //检测到DS18B20,并且初始化成功
}
u8 DS18B20_ReadData(void)
{
u8 i,data = 0;
for(i = 0;i < 8;i ++)
{
Set18b20IOout(); //主机端口推挽输出模式
Write18b20IO(0); //拉低总线10-15us
data >>= 1;
Delay_US(12);
Write18b20IO(1); //释放总线
Set18b20IOin(); //主机端口浮空输入模式
Delay_US(1);
if(Read18b20IO()) //读取数据,读取后大约延时40-45us
data |= 0x80;
Delay_US(42);
}
return data;
}
void DS18B20_WriteData(u8 data)
{
u8 i;
Set18b20IOout(); //主机端口推挽输出模式
for(i = 0;i < 8;i ++)
{
Write18b20IO(0); //拉低总线10-15us
Delay_US(12);
Write18b20IO(data & 0x01); //写入数据位,保持20-45us
Delay_US(30);
Write18b20IO(1); //释放总线
data >>= 1;
Delay_US(2);
}
}
s16 DS18B20_ReadTemper(void)
{
u8 th, tl;
s16 data;
if(DS18B20_Reset())
{
return 0xffff; //返回错误
}
DS18B20_WriteData(0xcc); //跳过读序列号
DS18B20_WriteData(0x44); //启动温度转换
DS18B20_Reset();
DS18B20_WriteData(0xcc); //跳过读序列号
DS18B20_WriteData(0xbe); //读取温度
tl = DS18B20_ReadData(); //读取低八位
th = DS18B20_ReadData(); //读取高八位
data = th;
data <<= 8;
data |= tl;
data *= 6.25; //温度值扩大100倍,精确到2位小数
return data;
} |