打印
[技术问答]

关于新唐NUC120LE03A控制DS18B20的问题

[复制链接]
1325|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lussby|  楼主 | 2015-8-28 16:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我在51开发板上控制DS18B20时,能够正常显示温度值。把代码移植到新唐时,发现DS18B20初始化一直不成功。DS18B20初始化代码如下:
void Init_Ds18b20(void)     //DS18B20初始化
{
        uint8_t DQ_RETURN = 2;//定义一个变量判断初始化成功与否
        DS18B20_OUT();//设置NUC120LE03A第PA15引脚为输出
        DS18B20_SET(); //DQ=1设置PA15引脚(18B20引脚)为高。
        Ds18B20_Delay(5);                  //适当延时
        DS18B20_CLR();//DQ = 0;把PA15引脚(18B20引脚)拉低
        Ds18B20_Delay(85);                //延时大于480us小于960us。这里用示波器量了是760us。
        DS18B20_SET();  //DQ = 1  把PA15引脚(18B20引脚)拉高。
        Ds18B20_Delay(2);//适当延时
        DS18B20_IO_PIN();//设置PA15引脚(18B20引脚)为输入
        Ds18B20_Delay(1);//适当延时以让引脚状态稳定
       
        DQ_RETURN = DS18B20_IO_PIN();//读取PA15引脚(18B20引脚)的状态
        Ds18B20_Delay(2);
        DS18B20_OUT();
        Ds18B20_Delay(55);                //这里是不小于480us,示波器量了540us
        if(DQ_RETURN==0) //判断成功与否
        printf ("Sucessful!\n");
        else
                printf("Fail!\n");
}
这个时序跟DS18B20初始化的程序基本吻合。而且我看了数据手册写了51的代码,51的波形跟上面的波形基本上一样。但是51初始化成功。新唐却没成功。51单片机电压是5V。新唐电压是3.3V。我看了DS18B20的工作电压是3V-5.5V。但是51初始化成功,并能正常读取温度,新唐的却不可以。希望有经验的朋友指点下,在此先谢谢了!
沙发
yiyigirl2014| | 2015-8-28 18:54 | 只看该作者
记得主频和延时,一定要修改延时函数,那个肯定不对了

使用特权

评论回复
板凳
lussby|  楼主 | 2015-8-29 09:56 | 只看该作者
yiyigirl2014 发表于 2015-8-28 18:54
记得主频和延时,一定要修改延时函数,那个肯定不对了

谢谢回复,我延时有修改的,而且是边修改边用示波器测的,我用了示波器对比51单片机的时序,两个初始化的时序几乎完全一样,唯一不同的地方就是初始化部分,51初始化成功时,在我延时760us后,总线被DS18B20自动拉低了(说明初始化成功),而新唐的时序是完全跟我写的时序一样,没有被DS18B20自动拉低。。

使用特权

评论回复
地板
734774645| | 2015-8-29 15:37 | 只看该作者
DS18B20是单总线数字温度传感器,硬件只需一根数据线即可和微控制器进行通信。然而
硬件结构的简单势必造成软件的开销大。微控制器在对DS18B20数字温度传感器进行操作
时,时序要求是非常严格的,稍有偏差就有可能导致数据错误无法通信。
DS18B20数字温度传感器一般选用5V工作电压。其数据手册上说明在初始化过程中,数据
线上首先至少要有480us的低电平。然而对于大多数ARM芯片来说,电源都是3.3V的,所以
在实际工作中发现,这个初始化480us的低电平有时是工作不了的,所以必须延长时间,如
700-800us,具体操作时序大小必须根据实际调试来安排。

使用特权

评论回复
5
cspoly| | 2015-8-29 22:44 | 只看该作者
將PA15設成open-drain,
記得要有上拉電阻.
可以參考我之前在Nano130的帖子:
[Nano100][GPIO]控制單總線數字溫度感測器

使用特权

评论回复
6
lussby|  楼主 | 2015-8-31 17:44 | 只看该作者
734774645 发表于 2015-8-29 15:37
DS18B20是单总线数字温度传感器,硬件只需一根数据线即可和微控制器进行通信。然而
硬件结构的简单势必造成 ...

谢谢你的回复和帮助,问题已经解决了。480us过一点就可以了。主要问题是3.3V的上拉电阻不行。我把上拉电阻接到5V后就可以了正常工作了。嘎嘎。

使用特权

评论回复
7
lussby|  楼主 | 2015-8-31 17:44 | 只看该作者
cspoly 发表于 2015-8-29 22:44
將PA15設成open-drain,
記得要有上拉電阻.
可以參考我之前在Nano130的帖子:

谢谢回复和帮助。我已经解决问题了。是硬件问题。:'(

使用特权

评论回复
8
734774645| | 2015-9-4 17:29 | 只看该作者
lussby 发表于 2015-8-31 17:44
谢谢你的回复和帮助,问题已经解决了。480us过一点就可以了。主要问题是3.3V的上拉电阻不行。我把上拉电 ...

你把电阻值调小一点试试,你用的多大的电阻啊,用不大于5.1K的电阻试试。

使用特权

评论回复
9
小狗爱吃骨头| | 2015-9-4 19:40 | 只看该作者
IIC的时序都没有问题吧

使用特权

评论回复
10
mintspring| | 2015-9-4 22:09 | 只看该作者
好多人用这个的时候延时不够,或者时序不对。

使用特权

评论回复
11
芙蓉洞| | 2015-9-5 21:10 | 只看该作者
一个是延时的问题,一个是时序的问题

使用特权

评论回复
12
lussby|  楼主 | 2015-10-20 14:39 | 只看该作者
734774645 发表于 2015-9-4 17:29
你把电阻值调小一点试试,你用的多大的电阻啊,用不大于5.1K的电阻试试。 ...

嗯。用10K的不行。用了4.7K电阻,发现3.3V也可以操作DS18B20。

使用特权

评论回复
13
lussby|  楼主 | 2015-10-20 14:39 | 只看该作者
小狗爱吃骨头 发表于 2015-9-4 19:40
IIC的时序都没有问题吧

不是IIC哦。是单总线。时序没问题。是硬件问题,已经解决了。谢谢回复。

使用特权

评论回复
14
734774645| | 2015-10-22 09:08 | 只看该作者
lussby 发表于 2015-10-20 14:39
嗯。用10K的不行。用了4.7K电阻,发现3.3V也可以操作DS18B20。

是的,能用就好了,以后考虑一下这个问题。

使用特权

评论回复
15
643757107| | 2015-10-22 21:49 | 只看该作者
Ds18B20_Delay(1);//适当延时以让引脚状态稳定
延时要准才靠谱。

使用特权

评论回复
16
lussby|  楼主 | 2016-1-1 10:33 | 只看该作者
嗯。是的。适当延时。还有得注意上拉电阻。这两个地方很关键。

使用特权

评论回复
17
hemingxian| | 2016-1-1 16:40 | 只看该作者
如果有多余的串口,用UART读写18B20,很方便,时序问题就用硬件解决了

使用特权

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

本版积分规则

14

主题

144

帖子

1

粉丝