OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2325|回复: 2

有关DS18B20的问题,找了好几天了不知道具体哪里出现了问题,请大神指点!谢谢

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2022-10-12
在线时间
3 小时
发表于 2022-10-13 21:32:45 | 显示全部楼层 |阅读模式
1金钱
有关DS18B20问题,我跟着时序图写的代码,
但是始终不明白是哪个环节出了问题,,我已经找了好好几天了,一直没找到具体问题,请大神帮忙看看

//DS18B20 data pin Connected GPIO PI4   GPIO端口输入输出选择
void Initializ_ds18b20_GPIO(u8 In_Out_Select)
{
    if(1 == In_Out_Select)          //输出模式
    {
        PI_DDR_DDR4 = 1;            //1: Output mode
        PI_CR1_C14  = 0;            //Float output
        PI_CR2_C24  = 0;            //Low Speed Output
        DS = 1;
    }
    else                            //输入模式
    {
        PI_DDR_DDR4 = 0;            //1: input mode
        PI_CR1_C14  = 0;            //Input with pull-up
        PI_CR2_C24  = 0;            //External interrupt disabled
    }
}


//初始化代码
u8 Reset_ds18b20(void)
{
    u8 state = 1;
    Initializ_ds18b20_GPIO(OUT);    //DS18B20 数据线设为 输出模式
    DS = 0;                         //拉低数据总线
    delay_us(750);                  //保持750us
    DS = 1;                         //释放总线
    delay_us(50);                   //等待18B20 15~60us
    Initializ_ds18b20_GPIO(IN);     //设为输入模式

    state = PI_IDR_IDR4;            //获取DS18B20状态
    delay_us(500);                  //延时500us

    return state;
}


//写一个字节
void ds18b20_Write(u8 dat)
{
    u8 i = 0;

    Initializ_ds18b20_GPIO(OUT);    //Ready Write Operaction



    for(i = 0;  i < 8;i++)
    {   
        DS = 1;

        if((dat & 0x01) == 1)           //Write 1 Opetation
        {
            DS = 0;
            delay_us(2);                //Release Bus
            DS = 1;
            delay_us(60);               //Wating ds18b20 Samples
        }
        else
        {
            DS = 0;
            delay_us(65);               //Wating ds18b20 Samples
        }
        dat = dat >> 1;
    }
}


//读一个字节
u8 ds18b20_Read(void)
{
    u8 i = 0;
    u8 data = 0;
    for(i = 0 ;i < 8; i++)
    {
        Initializ_ds18b20_GPIO(OUT);    //输出模式
        DS = 1;                     //释放总线 等待电平稳定
        delay_us(2);                // 等待电平稳定
        data = data >> 1;           // 临时用于存放数据,先低地位移除

        DS = 0;                     //Tint > us
        delay_us(2);                //延时 us
        DS = 1;                     //释放总线
        delay_us(2);                //延时TRC的时间

        Initializ_ds18b20_GPIO(IN); //改为输入模式

        if(1 == PI_IDR_IDR4)        //判断总线 电平 分别取出电平
        {
            data = data | 0x80;     //high bit Set  
        }
        else
        {
            data = data & 0x7F;     //higt bie Reset
        }

    }

    return data;
}



我已将附件上传请大神协助!!谢谢!请指明错误点

DS18B20_03.png
DS18B20_02.png
DS18B20_01.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3072

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7747
金钱
7747
注册时间
2020-5-11
在线时间
3217 小时
发表于 2022-10-14 14:30:53 | 显示全部楼层
Reset_ds18b20是否收到了18B20的响应信号?
建议用示波器看看波形宽度是否准确。
专治疑难杂症
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2022-10-12
在线时间
3 小时
 楼主| 发表于 2022-10-14 19:07:02 来自手机 | 显示全部楼层
LcwSwust 发表于 2022-10-14 14:30
Reset_ds18b20是否收到了18B20的响应信号?
建议用示波器看看波形宽度是否准确。

可以收到ds18b20复位时的影响,但是后面读取的数据就是不对。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-15 06:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表