OpenEdv-开源电子网

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

关于STM8S调DS18B20的时序问题!

[复制链接]

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
发表于 2017-7-12 17:34:18 | 显示全部楼层 |阅读模式
20金钱
各位大神,小弟用STM8S103F3调DS18B20很多天了。就是读不出数据,初始化DS18B20的时序比较宽 ,我能够收到DS18B20的回应,但是之后读数据的时候始终只能读到1,不知道为什么。我怀疑是延时不准确导致时序的问题。我用示波器测了我的延时程序,根据示波器显示的时间来调用对应的延时函数,但是依然没有效果。请问大神们 这个是为什么啊?这个的时序要求到底有多严格?我有什么办法来测试到底是哪个环节出了问题呢?[mw_shl_code=c,true]while (1)
{
Put_Data((u8)readTemp());
Start_Tx();
Delay_ms(1000);
}
void DS_check(void)
{
        u8 retry=0;
        PA3_OUT;
        SET_DQ;
        //GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
        DS18B20_Delay_Us(1);
        CLR_DQ;
        //GPIO_WriteLow(GPIOA,GPIO_PIN_3);
        DS18B20_Delay_Us(400);//580us
       
        SET_DQ;
        //GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
        //DS18B20_Delay_Us(50);
        DS18B20_Delay_Us(6);//19us
        PA3_IN;
        while((DQ_IN==1)&&(retry<200))
        {
                retry++;
                DS18B20_Delay_Us(1);
                //delay_us(1);
        }
        if(retry>=200)
        {
                ds_check_flag=0;//check failed
        }
        else
        {
                ds_check_flag=1;//check success
        }
        PA3_OUT;
        //GPIO_WriteHigh(GPIOA, GPIO_PIN_3);
        SET_DQ;

}
u8 DS_readbit(void)
{
        u8 data;
        PA3_OUT;
        CLR_DQ;
        DS18B20_Delay_Us(1);
        SET_DQ;
        PA3_IN;
        DS18B20_Delay_Us(2);
        if(DQ_IN)data=1;
        else data=0;
        DS18B20_Delay_Us(20);
        return data;
}
u8 DS_readByte(void)
{
        u8 data=0;
        u8 i,j;

        //DS18B20_Delay_Us(5);
        for(i=0;i<8;i++)
        {
                j=DS_readbit();
                data=(j<<7)|(data>>1);

        }
        return data;
}
void DS_writeByte(u8 data)
{
        u8 j;
        u8 testb;
        PA3_OUT;
        for(j=0;j<8;j++)
        {
                testb=data&0x01;
                data=data>>1;
                if(testb)
                {
                        CLR_DQ;
                        DS18B20_Delay_Us(1);
                        SET_DQ;
                        DS18B20_Delay_Us(25);
                }
                else
                {
                        CLR_DQ;
                        DS18B20_Delay_Us(25);
                        SET_DQ;
                        DS18B20_Delay_Us(1);
                }
        }

}



void convert_ds(void)
{
        DS_check();
        DS_writeByte(0xcc);
        DS_writeByte(0x44);
}
short readTemp(void)
{
        u8 temp;
        u8 TL,TH;
        short tem;
        convert_ds();
        DS_check();
        DS_writeByte(0xcc);
        DS_writeByte(0xbe);
        TL=DS_readByte();
        TH=DS_readByte();
        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;
}

//void Delay(u16 nCount)
//{
  //while (nCount != 0)
  //{
//   nCount--;
// }

void DS18B20_Delay_Us(u16 i)//7us
{
    while(--i);
}
void DS18B20_Delay_Ms(u16 i)
{
    while(i--)
    DS18B20_Delay_Us(1000);
}
//}[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165002
金钱
165002
注册时间
2010-12-1
在线时间
2102 小时
发表于 2017-7-13 00:59:18 | 显示全部楼层
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-7-17 08:56:28 | 显示全部楼层

原子哥,这个时序没有办法来确定时序调对没有的嘛,比如第一个检测,可以得到一个标志位 但是写和读 没有办法检测是不是时序正确呢
回复

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165002
金钱
165002
注册时间
2010-12-1
在线时间
2102 小时
发表于 2017-7-18 02:21:31 | 显示全部楼层
oywjex 发表于 2017-7-17 08:56
原子哥,这个时序没有办法来确定时序调对没有的嘛,比如第一个检测,可以得到一个标志位 但是写和读 没有 ...

没有
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2265
金钱
2265
注册时间
2012-8-24
在线时间
246 小时
发表于 2017-8-4 15:47:15 | 显示全部楼层
这种需要用时序的最好用示波器看一下,时序,如果时序时对的,一般都没有什么问题
单片机技术交流请加127034610
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-4 16:37:39 | 显示全部楼层
liushiming82 发表于 2017-8-4 15:47
这种需要用时序的最好用示波器看一下,时序,如果时序时对的,一般都没有什么问题

谢谢了,我用示波器也调了 还是没调出来 不知道什么原因 后面我就放弃了用STM8 了 用STM32的SYSTICK就方便了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-26 08:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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