我在编写DS18B20的驱动程序(主芯片LM3s9b92)时,读温度数据时一直全是高电平。不知道初始化有没有成功,资料上说初始化时读到低电平就说明总线上有器件,在我调试过程中读到了低电平,是不是说明我的初始化成功了呢?下面是我的程序,请高手们帮我看看,不胜感激!!!!
unsigned char Ds18b20_Init(void)
{ unsigned char flag;
Ds18b20_DatType_OUT(); //数据引脚默认为输出
// DS18B20_DAT_H(); //先将数据线拉高
// delayus_ds18b20(6); //延时6us,然后将数据线拉低
DS18B20_DAT_L();
delayus_ds18b20(500); //略微延时约600微秒
//以向DS18B20发出一持续480~960us的低电平复位脉冲
DS18B20_DAT_H(); //释放数据线,将数据线拉高
delayus_ds18b20(30); //延时约30us,释放总线后需等待15~60us让DS18B20输出存在脉冲)
Ds18b20_DatType_IN();
flag = ROM_GPIOPinRead(DS18B20_DAT_PORT, DS18B20_DAT_PIN); //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
ROM_GPIOPinTypeGPIOOutput(DS18B20_DAT_PORT, DS18B20_DAT_PIN);
delayus_ds18b20(600); //延时足够长时间,等待存在脉冲输出完毕
// Ds18b20_DatType_OUT();
return flag; //返回检测成功标志
}
/*
*--------------------------------------------------------------------------------*
*功能:向DS18B20芯片写一个字节的数据
*--------------------------------------------------------------------------------*
*/
void Ds18b20_Write_Byte(unsigned char dat)
{
unsigned char i=0;
Ds18b20_DatType_OUT();
for (i=0; i<8; i++)
{
delayus_ds18b20(2);
// DS18B20_DAT_H(); // 先将数据线拉高
// SysCtlDelay(1); //等待一个机器周期
DS18B20_DAT_L(); //将数据线从高拉低时即启动写时序
SysCtlDelay(1); //等待一个机器周期
if(dat & 0x01) { delayus_ds18b20(2);
DS18B20_DAT_H();//ROM_GPIOPinWrite(DS18B20_DAT_PORT, DS18B20_DAT_PIN, 0xff);
}
else {
DS18B20_DAT_L();// ROM_GPIOPinWrite(DS18B20_DAT_PORT, DS18B20_DAT_PIN, 0x00);
} // ROM_GPIOPinWrite(DS18B20_DAT_PORT, DS18B20_DAT_PIN, 0X00);
// 利用与运算取出要写的某位二进制数据,
// 并将其送到数据线上等待DS18B20采样
delayus_ds18b20(65); //延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DS18B20_DAT_H(); //释放数据线?????????????????????////
// delayus_ds18b20(5); //延时3us,两个写时序间至少需要1us的恢复期
dat>>=1; //将dat中的各二进制位数据右移1位
}
delayus_ds18b20(3); //稍作延时,给硬件一点反应时间
}
unsigned char Ds18b20_Read_Byte(void)
{
unsigned char i=0;
unsigned char dat=0,DQ_flag; //储存读出的一个字节数据
for (i=0;i<8;i++)
{
delayus_ds18b20(2);
Ds18b20_DatType_OUT();
// DS18B20_DAT_H(); // 先将数据线拉高
// delayus_ds18b20(1); //延时1us
DS18B20_DAT_L(); //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
delayus_ds18b20(2); //延时1us
DS18B20_DAT_H(); //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
Ds18b20_DatType_IN(); //配置为输入,准备读数据
delayus_ds18b20(6); //延时约6us,使主机在15us内采样
DQ_flag = ROM_GPIOPinRead(DS18B20_DAT_PORT, DS18B20_DAT_PIN); //读引脚
dat >>= 1;
if((DQ_flag & DQ_FLAG) == DQ_FLAG){
dat |=0X80; //如果读到的数据是1,则将1存入dat
}
else{
dat &= 0x7f;
}
delayus_ds18b20(65);
Ds18b20_DatType_OUT(); //配置为输出
DS18B20_DAT_H();
delayus_ds18b20(3); //延时5us,两个读时序之间必须有大于1us的恢复期
}
return(dat); //返回读出的十六进制数据
} |