DS18B20 init failed! Please check the connection! 需要外接上拉电阻?
qiaowei361 opened this issue · 11 comments
你接的是单个 DS18B20 传感器呢?还是接的是 DS18B20 模块?如果是后者的话一般上面已经有上拉电阻的,如果是前者,则需要自己在 DS18B20 数据 IO 口上接一个上拉电阻。同时需要确保 DS18B20 的 VCC 和 GND 没有接反,如果接反了则会把传感器烧坏,后面再继续用也不能正常工作的。
这个你需要联系厂家,或者看看数据手册上的说明,看是否已经接了上拉电阻。
这个你需要联系厂家,或者看看数据手册上的说明,看是否已经接了上拉电阻。
这个说明说不需要,为何连接失败?
单步调试,扒寄存器看
单步调试,扒寄存器看
我用万能表测VCC和 GND线不是导通的,是不是说明这个传感器坏的?
单步调试,扒寄存器看
我用万能表测VCC和 GND线不是导通的,是不是说明这个传感器坏的?
VCC 和 GNC 两者肯定是不相通的呀.... 建议你换一个 DS18B20 试试看,排除硬件故障导致软件提示错误。
单步调试,扒寄存器看
我用万能表测VCC和 GND线不是导通的,是不是说明这个传感器坏的?
VCC 和 GNC 两者肯定是不相通的呀.... 建议你换一个 DS18B20 试试看,排除硬件故障导致软件提示错误。
感谢您的回复,刚说错了,万通表调在二极管档位,测试DS18B20的VCC和GND始终为1不变,而我测试AM2320B传感器的VCC和GND的数值会1会有变动。我现在再尝试购买一个试一下,卖家说距离远需要上拉电阻..
厂家提供的不锈钢美信DS18B20 的读写时序代码,作者你的读写时序是这样的吗?
` Write_Match_Rom(group,0xB8); //从EE拷回暂存器
Write_Match_Rom(group,0x44); //温度转换
Delay_ms(750);
Write_Match_Rom(group,0xBE);
p_wendu_thtl[num_18b20][3] = Read_One_Char(group);//温度低8位
p_wendu_thtl[num_18b20][2] = Read_One_Char(group);//温度高8位
p_wendu_thtl[num_18b20][0] = Read_One_Char(group);//TH
p_wendu_thtl[num_18b20][1] = Read_One_Char(group);//TL
Read_One_Char(group);
Read_One_Char(group);
Read_One_Char(group);
Read_One_Char(group);
Read_One_Char(group);
wendu = (p_wendu_thtl[num_18b20][2] << 8) + p_wendu_thtl[num_18b20][3];
void Write_Match_Rom(u8 group,u8 command)
{
u8 i = 0;
u8 (* p_rom)[8] = NULL;//指向ROM数组的指针
switch (group)
{
case 1:{p_rom = ROM_1;break;}
case 2:{p_rom = ROM_2;break;}
case 3:{p_rom = ROM_3;break;}
case 4:{p_rom = ROM_4;break;}
case 5:{p_rom = ROM_5;break;}
case 6:{p_rom = ROM_6;break;}
case 7:{p_rom = ROM_7;break;}
case 8:{p_rom = ROM_8;break;}
default:break;
}
Chip_18b20_Init(group);
Write_One_Char(group,0x55);
for (i=0; i<8;i++)
Write_One_Char(group,p_rom[num_18b20][i]);
Write_One_Char(group,command);
}enableInterrupts();
/* 芯片初始化程序*****************************************************************/
u8 Chip_18b20_Init(u8 group)
{
u8 temp = 1;
switch (group)
{
case 1:{SLOTTIME = SLOTTIME_1;break;}
case 2:{SLOTTIME = SLOTTIME_2;break;}
case 3:{SLOTTIME = SLOTTIME_3;break;}
case 4:{SLOTTIME = SLOTTIME_4;break;}
default:break;
}
DQ_Weak_Pull_On(group); //弱上拉开
Delay_us(9); //延时9+1=10us
DQ_Weak_Pull_Off(group); //弱上拉关
//拉低,出现下降沿,初始化信号
DQ_Pull_Down_On(group); //下拉开
Delay_us(32*SLOTTIME); //延时32个slottime 32*15=480us
DQ_Pull_Down_Off(group); //下拉关
DQ_Weak_Pull_On(group); //弱上拉开
Delay_us(SLOTTIME); //延时1个slottime
DQ_Weak_Pull_Off(group); //弱上拉关
Delay_us(10);
temp = DQ_Read(group);
if (temp)
{
DQ_Weak_Pull_On(group); //弱上拉开
Delay_us(249); //延时250us
DQ_Weak_Pull_Off(group); //弱上拉关
}
else
{
DQ_Pull_Down_On(group); //下拉开
Delay_us(249); //延时250us0
DQ_Pull_Down_Off(group); //下拉关
}
DQ_Weak_Pull_On(group); //弱上拉开
Delay_us(29); //延时9+1=10us
DQ_Weak_Pull_Off(group); //弱上拉关
return temp;
}
/读一位程序******************************************************调时序/
u8 Read_One_Bit(u8 group)
{
u8 temp = 0;
DQ_Pull_Down_On(group); //下拉开
Delay_us(*time); //延时4+1=5us
DQ_Pull_Down_Off(group); //下拉关
DQ_Weak_Pull_On(group); //弱上拉开
Delay_us(*(time+1)); //4us
DQ_Weak_Pull_Off(group); //弱上拉关
Delay_us(*(time+2));
temp = DQ_Read(group);
if (temp)
{
DQ_Weak_Pull_On(group); //弱上拉开
Delay_us(45); //延时45us
DQ_Weak_Pull_Off(group); //弱上拉关
}
else
{
DQ_Pull_Down_On(group); //下拉开
Delay_us(45); //延时45us
DQ_Pull_Down_Off(group); //下拉开
}
DQ_Weak_Pull_On(group);
Delay_us(40); //延时40us/45us
DQ_Weak_Pull_Off(group);
return temp;
}
/*读一个字节程序*****************************************************调时序/
u8 Read_One_Char(u8 group)
{
u8 temp = 0;
u8 i = 0;
for (i=0; i<8; i++)
{
temp >>= 1;
if (Read_One_Bit(group))
temp |= 0x80;
}
return temp;
}
/写一位程序********************************************************调时序/
void Write_One_Bit(u8 group, u8 dat)
{
DQ_Pull_Down_On(group); //下拉开
Delay_us(9); //延时9+1=10us
DQ_Pull_Down_Off(group); //下拉关
if (dat)
{
DQ_Weak_Pull_On(group); //弱上拉开
Delay_us(79); //延时79+1=80us 79
DQ_Weak_Pull_Off(group); //弱上拉关
}
else
{
DQ_Pull_Down_On(group); //下拉开
Delay_us(79); //延时79+1=80us 79
DQ_Pull_Down_Off(group); //下拉关
}
DQ_Weak_Pull_On(group); //弱上拉开
Delay_us(49); //延时4+1=5us 49
DQ_Weak_Pull_Off(group); //弱上拉关
}
/写一个字节********************************************************调时序/
void Write_One_Char(u8 group, u8 dat)
{
u8 i =0;
for (i=0; i<8; i++)
{
Write_One_Bit(group,dat&0x01);
dat >>= 1;
}
}
`
厂家提供的不锈钢美信DS18B20 的读写时序代码,作者你的读写时序是这样的吗?
` Write_Match_Rom(group,0xB8); //从EE拷回暂存器 Write_Match_Rom(group,0x44); //温度转换 Delay_ms(750);
Write_Match_Rom(group,0xBE); p_wendu_thtl[num_18b20][3] = Read_One_Char(group);//温度低8位 p_wendu_thtl[num_18b20][2] = Read_One_Char(group);//温度高8位 p_wendu_thtl[num_18b20][0] = Read_One_Char(group);//TH p_wendu_thtl[num_18b20][1] = Read_One_Char(group);//TL Read_One_Char(group); Read_One_Char(group); Read_One_Char(group); Read_One_Char(group); Read_One_Char(group); wendu = (p_wendu_thtl[num_18b20][2] << 8) + p_wendu_thtl[num_18b20][3];
void Write_Match_Rom(u8 group,u8 command) { u8 i = 0; u8 (* p_rom)[8] = NULL;//指向ROM数组的指针 switch (group) { case 1:{p_rom = ROM_1;break;} case 2:{p_rom = ROM_2;break;} case 3:{p_rom = ROM_3;break;} case 4:{p_rom = ROM_4;break;} case 5:{p_rom = ROM_5;break;} case 6:{p_rom = ROM_6;break;} case 7:{p_rom = ROM_7;break;} case 8:{p_rom = ROM_8;break;} default:break; } Chip_18b20_Init(group); Write_One_Char(group,0x55); for (i=0; i<8;i++) Write_One_Char(group,p_rom[num_18b20][i]); Write_One_Char(group,command); }enableInterrupts();
/* 芯片初始化程序*****************************************************************/ u8 Chip_18b20_Init(u8 group) { u8 temp = 1;
switch (group) { case 1:{SLOTTIME = SLOTTIME_1;break;} case 2:{SLOTTIME = SLOTTIME_2;break;} case 3:{SLOTTIME = SLOTTIME_3;break;} case 4:{SLOTTIME = SLOTTIME_4;break;} default:break; } DQ_Weak_Pull_On(group); //弱上拉开 Delay_us(9); //延时9+1=10us DQ_Weak_Pull_Off(group); //弱上拉关 //拉低,出现下降沿,初始化信号 DQ_Pull_Down_On(group); //下拉开 Delay_us(32*SLOTTIME); //延时32个slottime 32*15=480us DQ_Pull_Down_Off(group); //下拉关 DQ_Weak_Pull_On(group); //弱上拉开 Delay_us(SLOTTIME); //延时1个slottime DQ_Weak_Pull_Off(group); //弱上拉关
Delay_us(10); temp = DQ_Read(group); if (temp) { DQ_Weak_Pull_On(group); //弱上拉开 Delay_us(249); //延时250us DQ_Weak_Pull_Off(group); //弱上拉关 } else { DQ_Pull_Down_On(group); //下拉开 Delay_us(249); //延时250us0 DQ_Pull_Down_Off(group); //下拉关 }
DQ_Weak_Pull_On(group); //弱上拉开 Delay_us(29); //延时9+1=10us DQ_Weak_Pull_Off(group); //弱上拉关 return temp;
} /读一位程序******************************************************调时序/ u8 Read_One_Bit(u8 group) { u8 temp = 0;
DQ_Pull_Down_On(group); //下拉开 Delay_us(*time); //延时4+1=5us DQ_Pull_Down_Off(group); //下拉关 DQ_Weak_Pull_On(group); //弱上拉开 Delay_us(*(time+1)); //4us DQ_Weak_Pull_Off(group); //弱上拉关 Delay_us(*(time+2)); temp = DQ_Read(group); if (temp) { DQ_Weak_Pull_On(group); //弱上拉开 Delay_us(45); //延时45us DQ_Weak_Pull_Off(group); //弱上拉关 } else { DQ_Pull_Down_On(group); //下拉开 Delay_us(45); //延时45us DQ_Pull_Down_Off(group); //下拉开 } DQ_Weak_Pull_On(group); Delay_us(40); //延时40us/45us DQ_Weak_Pull_Off(group); return temp;
}
/*读一个字节程序*****************************************************调时序/ u8 Read_One_Char(u8 group) { u8 temp = 0; u8 i = 0;
for (i=0; i<8; i++) { temp >>= 1; if (Read_One_Bit(group)) temp |= 0x80; } return temp;
} /写一位程序********************************************************调时序/ void Write_One_Bit(u8 group, u8 dat) { DQ_Pull_Down_On(group); //下拉开 Delay_us(9); //延时9+1=10us DQ_Pull_Down_Off(group); //下拉关
if (dat) { DQ_Weak_Pull_On(group); //弱上拉开 Delay_us(79); //延时79+1=80us 79 DQ_Weak_Pull_Off(group); //弱上拉关 } else { DQ_Pull_Down_On(group); //下拉开 Delay_us(79); //延时79+1=80us 79 DQ_Pull_Down_Off(group); //下拉关 } DQ_Weak_Pull_On(group); //弱上拉开 Delay_us(49); //延时4+1=5us 49 DQ_Weak_Pull_Off(group); //弱上拉关
}
/写一个字节********************************************************调时序/ void Write_One_Char(u8 group, u8 dat) { u8 i =0; for (i=0; i<8; i++) { Write_One_Bit(group,dat&0x01); dat >>= 1; } } `
压根不用看代码
你直接把你的传感器引线 VCC与DATA之间加个10K电阻再试
不用怀疑作者的代码
我已经跑过了
基本读取没有问题
除了读写时序偶会被 其它线程打乱 读出错误值