打印
[AT32F403/403A]

DS18B20采集到的全是0xff

[复制链接]
1558|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DS18B20已经有应答了,但是返回回来的数据全是0xff,延时我用示波器看了,应该是准的。时序也没问题啊,除了返回的数据以外,其他的波形也满足。输出口的上拉电阻也加了4.7K的。有大佬指点一下为什么数据会这样么。波形如下:



代码如下:
//复位DS18B20
void DS18B20_Rst(void)
{
    DS18B20_IO_OUT();
    DS18B20_DQ_OUT=0;   //拉低DQ
    delay_us(750);      //拉低750us
    DS18B20_DQ_OUT=1;   //DQ=1
    delay_us(15);       //15US
}


//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)
{
    u8 retry=0;
    DS18B20_IO_IN();    //SET PG11 INPUT
    delay_us(10);
    while (DS18B20_DQ_IN&&retry<200)
    {
        retry++;
        delay_us(1);
    };
    if(retry>=200)return 1;
    else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
    {
        retry++;
        delay_us(1);
    };
    if(retry>=240)return 1;
    return 0;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void)
{
    u8 data;
    DS18B20_IO_OUT();
    DS18B20_DQ_OUT=0;
    delay_us(2);
    DS18B20_DQ_OUT=1;
    DS18B20_IO_IN();
    delay_us(12);
    if(DS18B20_DQ_IN)data=1;
    else data=0;
    delay_us(50);
    return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)
{
    u8 i,j,dat;
    dat=0;
    for (i=1;i<=8;i++)
    {
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }
    return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)
{
    u8 j;
    u8 testb;
    DS18B20_IO_OUT();
    for (j=1;j<=8;j++)
    {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)
        {
            DS18B20_DQ_OUT=0;   // Write 1
            delay_us(2);
            DS18B20_DQ_OUT=1;
            delay_us(60);

        }
        else
        {
            DS18B20_DQ_OUT=0;   // Write 0
            delay_us(60);
            DS18B20_DQ_OUT=1;
            delay_us(2);
        }

    }
}
//开始温度转换
void DS18B20_Start(void)
{
    DS18B20_Rst();
    DS18B20_Check();
    DS18B20_Write_Byte(0xcc);   // skip rom
    DS18B20_Write_Byte(0x44);   // convert
}

//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在
u8 DS18B20_Init(void)
{
    GPIO_InitStructure.GPIO_Pins = GPIO_Pins_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
    GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

    GPIO_SetBits(GPIOB,GPIO_Pins_6);
    DS18B20_Rst();

    return DS18B20_Check();
}
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
    u8 flag;
    short tem;
    DS18B20_Start ();           // ds1820 start convert
    DS18B20_Rst();
    flag= DS18B20_Check();
    DS18B20_Write_Byte(0xcc);   // skip rom
    DS18B20_Write_Byte(0xBE);   // convert
    TL=DS18B20_Read_Byte();     // LSB
    TH=DS18B20_Read_Byte();     // MSB

    if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;                 //温度为负
    }else temp=1;               //温度为正
    tem=TH;                     //获得高八位
    tem<<=8;
    tem+=TL;                    //获得底八位
    tem=(float)tem*0.625;       //转换
    if(temp)return tem;         //返回温度值
    else return -tem;
}

使用特权

评论回复
沙发
LcwSwust| | 2022-4-23 14:46 | 只看该作者
从波形看,读数据时发出低电平但实际没低下去啊。

使用特权

评论回复
评论
LcwSwust 2022-4-24 09:26 回复TA
@1109346714 :好的 
1109346714 2022-4-24 09:24 回复TA
@LcwSwust :感谢指正,今天去读和发送的低电平的延时都增加到了13us(因为我看数据手册说要15us内响应)就能正常读取到数据了 
LcwSwust 2022-4-23 15:55 回复TA
@1109346714 :可能因为示波器此时采样率低,没能展现细节,建议将横轴展开些测仔细一些,对照器件手册上的时序要求来判断。 
1109346714 2022-4-23 15:09 回复TA
应该是低下去了的吧,示波器这个至少因为延时较短,所以没走下去。如果是真的没低下去的话,我应该怎么做改进呢,是增加拉低的延时么,还是怎么 
板凳
muyichuan2012| | 2022-4-23 20:13 | 只看该作者
这个波形太糟糕了吧     是有干扰吗?

使用特权

评论回复
评论
1109346714 2022-4-24 09:26 回复TA
感谢指正,今天去读和发送的低电平的延时都增加到了13us(因为我看数据手册说要15us内响应)就能正常读取到数据了 
地板
coody| | 2022-4-23 22:49 | 只看该作者
仔细核对时序,都是时序不对造成的。我虽然讨厌单总线,但是不管什么MCU,8位、16位、32位,只要时序对,就没有问题。

使用特权

评论回复
5
laocuo1142| | 2022-4-24 08:07 | 只看该作者
1.复位时序不对造成的,仔细检查 2.单总线读取的时序不对

使用特权

评论回复
评论
1109346714 2022-4-24 09:29 回复TA
感谢指正,今天去读和发送的低电平的延时都增加到了13us(因为我看数据手册说要15us内响应)就能正常读取到数据了 
6
laocuo1142| | 2022-4-24 08:10 | 只看该作者
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
    u8 flag;
    short tem;
    DS18B20_Start ();           // ds1820 start convert
    DS18B20_Rst();
    flag= DS18B20_Check();
    DS18B20_Write_Byte(0xcc);   // skip rom
    DS18B20_Write_Byte(0xBE);   // convert
    TL=DS18B20_Read_Byte();     // LSB
    TH=DS18B20_Read_Byte();     // MSB

    if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;                 //温度为负
    }else temp=1;               //温度为正
    tem=TH;                     //获得高八位
    tem<<=8;
    tem+=TL;                    //获得底八位
    tem=(float)tem*0.625;       //转换
    if(temp)return tem;         //返回温度值
    else return -tem;
}
发送转换命令之后,有个转换时间,要见延时,看手册,应该要等待几百个ms再采集数据

使用特权

评论回复
7
laocuo1142| | 2022-4-24 08:10 | 只看该作者
laocuo1142 发表于 2022-4-24 08:10
short DS18B20_Get_Temp(void)
{
    u8 temp;

   DS18B20_Write_Byte(0xcc);   // skip rom
    DS18B20_Write_Byte(0xBE);   // convert
这个后面要加延时

使用特权

评论回复
8
binoo7| | 2022-4-24 08:29 | 只看该作者
18B20对时序要求非常严格,所以还是仔细看一下你的时序吧

使用特权

评论回复
9
1109346714|  楼主 | 2022-4-24 09:27 | 只看该作者
coody 发表于 2022-4-23 22:49
仔细核对时序,都是时序不对造成的。我虽然讨厌单总线,但是不管什么MCU,8位、16位、32位,只要时序对,就 ...

感谢指正,今天去读和发送的低电平的延时都增加到了13us(因为我看数据手册说要15us内响应)就能正常读取到数据了

使用特权

评论回复
10
1109346714|  楼主 | 2022-4-24 09:31 | 只看该作者
感谢各位前辈的指正,的确是时序的问题引起的,读取和发送的低电平延时一开始只设置了2us(规格书上说的不小于1us,15us内),但是实际上可能并没有低得下去,最终我增加到了13us,就能正常的读取到数据了,其他的设置没变

使用特权

评论回复
11
coody| | 2022-4-24 16:56 | 只看该作者
1109346714 发表于 2022-4-24 09:31
感谢各位前辈的指正,的确是时序的问题引起的,读取和发送的低电平延时一开始只设置了2us(规格书上说的不 ...

这时候示波器就很有用了

使用特权

评论回复
12
fey| | 2022-4-24 20:25 | 只看该作者
大佬能把这个驱动发我一下吗,我的ds18b20调了一个星期了就是调不通,有应答就是读到FF。头都炸了。1403942847@qq.com。。万分感谢

使用特权

评论回复
13
ningling_21| | 2022-4-25 08:45 | 只看该作者
很多都是由于延时不准确造成的

使用特权

评论回复
14
zpcj| | 2023-3-23 15:20 | 只看该作者
前辈,您好,就是我目前在课程设计上也遇到这个问题,读的时候无论怎么调都是1,延时函数在2-3us的误差太大,能麻烦发一份文件给我吗?非常感谢。2637050929@qq.com

使用特权

评论回复
15
xiaoyaodz| | 2023-6-6 12:35 | 只看该作者
可能是 算法或者其他地方出了问题

使用特权

评论回复
16
mnynt121| | 2023-6-6 13:10 | 只看该作者
检查时序控制是否正确,并根据需要调整时序参数。

使用特权

评论回复
17
timfordlare| | 2023-6-6 13:16 | 只看该作者
读取DS18B20一般主要控制好读取数据时的时序

使用特权

评论回复
18
sanfuzi| | 2023-6-6 13:21 | 只看该作者
可能是由于硬件故障或程序问题引起的。

使用特权

评论回复
19
burgessmaggie| | 2023-6-6 13:27 | 只看该作者
建议自己网上找找可用的源代码              

使用特权

评论回复
20
qiufengsd| | 2023-6-6 13:59 | 只看该作者
DS18B20的接线是否正确,确认数据线、电源线和地线都已连接好。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝