87|2

2

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

DS18B20在CH32V307上一直初始化失败 [复制链接]

int main(void)
{
    u16 temp;
    int i;
//    USARTx_Init(USART1,72,115200);//串口1的初始化
    USART_Printf_Init(115200);
    DS18B20_Init();   //DS18B20初始化

    /*1. 读取DS18B20的64位ROM编码*/
    //发送复位脉冲、检测存在脉冲
    while(DS18B20_CheckDevice())
    {
            printf("DS18B20设备不存在!\n");
            Delay_Ms(500);
    }
    //发送读取64为ROM编码的命令

    printf("chu");
    DS18B20_WriteByte(0x33);

    //循环读取64位ROM编码
    for(i=0;i<8;i++)
    {
            DS18B20_ROM[i]= DS18B20_ReadByte();
            printf("DS18B20_ROM[%d]=0x%X\n",i,DS18B20_ROM[i]);
    }

    while(1)
    {
            /*2. 同时操作总线上所有的DS18B20开始转换温度*/
            DS18B20_CheckDevice();   //发送复位脉冲、检测存在脉冲
            DS18B20_WriteByte(0xCC); //跳过ROM序列检测
            DS18B20_WriteByte(0x44); //启动一次温度转换(让总线上所有的DS18B20都转换温度)
            Delay_Ms(500);  //等待线上所有的DS18B20温度转换完成

            /*3. 单个针对性读取每个DS18B20的温度*/
            DS18B20_CheckDevice();   //发送复位脉冲、检测存在脉冲
            DS18B20_WriteByte(0x55); //发送匹配ROM的命令
            for(i=0;i<8;i++)         //发送64位编码
            {
                    DS18B20_WriteByte(DS18B20_ROM[i]);
            }
            DS18B20_WriteByte(0xBE);      //读取温度
            temp=DS18B20_ReadByte();      //读取的温度低位数据
            temp|=DS18B20_ReadByte()<<8;  //读取的温度高位数据
            printf("temp1=%d.%d\n",temp>>4,temp&0xF);
            printf("temp2=%f\n",temp*0.0625);

            Delay_Ms(500);
    }
}




void DS18B20_Init(void)
{
        RCC->APB2PCENR|=1<<3; //PB
        GPIOB->CFGHR&=0x0FFFFFFF;
        GPIOB->CFGHR|=0x30000000;
        GPIOB->OUTDR|=1<<15; //上拉
}


/*
函数功能: 检测DS18B20设备是否存在
返回值  : 1表示设备不存在 0表示设备正常
*/
u8 DS18B20_CheckDevice(void)  //包含了复位脉冲、检测存在脉冲
{
        DS18B20_OUTPUT_MODE();//初始化为输出模式

        DS18B20_OUT_RESET();
        Delay_Us(750);         //产生750us的低电平

        DS18B20_OUT_SET();
        Delay_Us(15);          //等待DS18B20回应

        if(DS18B20_CleckAck())//检测存在脉冲
        {
                return 1;
        }//检测到了脉冲

        return 0;
}

/*
函数功能: 检测DS18B20设备的存在脉冲
返回值  : 1表示错误 0表示正常
*/
u8 DS18B20_CleckAck(void)
{
        u8 cnt=0;
        DS18B20_INPUT_MODE();//初始化为输入模式
        while(DS18B20_IN&&cnt<200) //等待DS18B20响应存在脉冲
        {
                Delay_Us(1);
                cnt++;
        }

        if(cnt>=200)return 1; //错误
        else cnt=0;

        while((!DS18B20_IN)&&cnt<240) //等待DS18B20释放总线
        {
                Delay_Us(1);
                cnt++;
        }
        if(cnt>=240)return 1; //错误

        return 0;
}




void Delay_Us(uint32_t n)
{
    uint32_t i;

    SysTick->SR &= ~(1 << 0);
    i = (uint32_t)n * p_us;

    SysTick->CMP = i;
    SysTick->CTLR |= (1 << 4);
    SysTick->CTLR |= (1 << 5) | (1 << 0);

    while((SysTick->SR & (1 << 0)) != (1 << 0))
        ;
    SysTick->CTLR &= ~(1 << 0);
}

 

此帖出自stm32/stm8论坛

最新回复

DS18B20的延时函数要非常注意,因为是微妙级别,要调试好延时。。   详情 回复 发表于 昨天 21:18
点赞 关注
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

串口助手一直显示“DS18B20设备不存在!”,请问是什么原因?

此帖出自stm32/stm8论坛
 
 

回复

3012

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 

DS18B20的延时函数要非常注意,因为是微妙级别,要调试好延时。。

此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表