OpenEdv-开源电子网

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

DS18B20代码移植失败,请教大家

[复制链接]

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
发表于 2013-3-4 17:11:40 | 显示全部楼层 |阅读模式
我自己做的板子,主芯片STM32CBT6,温度传感器接的是PB1,第10脚,仅仅接到了DS18B20的数据脚,没有做其他任何用处。硬件电路和代码都是基本和原子一模一样的,一个4.7K上拉电阻,一个104去耦电容。我通过串口打印出温度值,看了比较了修改了N多次代码,但是串口得出的一直都是t1:0.0   t1:0.0   t1:0.0,然后我参考原子的MINI板子,温度传感器接的是PA0,我就把我自己板子的DS18B20的数据脚由PB1改为PA0,就是飞一根线到STM32的PA0,然后写入原子的代码,串口就能打印出正确的温度值了:t1:23.5   t1:23.4  t1:23.4,很奇怪啊。。。请教大家!
STM32
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-4 23:01:18 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1817
金钱
1817
注册时间
2011-10-9
在线时间
231 小时
发表于 2013-3-4 23:09:19 | 显示全部楼层
PB1没有复用吧?
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
 楼主| 发表于 2013-3-5 09:17:59 | 显示全部楼层
回复【3楼】simms01:
---------------------------------
我看原子的代码里面仅仅是设置了io口为推挽输出,然后在需要的时候设置为输入或是输出,但并没有复用吧?我查了手册,复用后是有ADC功能的,这个温度传感器也需要AD采样的值吗?
STM32
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
 楼主| 发表于 2013-3-6 17:21:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我的代码只是改了IO口而已,其他部分检查过了,完全一样,还是不行。

部分代码:
/*******DS18B20.h*******/
//IO方向设置
#define DS18B20_IO_IN()  {GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=8<<1;}
#define DS18B20_IO_OUT() {GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=3<<1;}
//IO操作函数    
#define DS18B20_DQ_OUT Bout(1) //数据端口 PB1 
#define DS18B20_DQ_IN  Bin(1)  //数据端口 PB1


/*******DS18B20.c*******/
u8 DS18B20_Init(void)
{
RCC->APB2ENR|=1<<3;    //使能PORTB口时钟 
GPIOB->CRL&=0XFFFFFF0F;//PORTB.1 推挽输出
GPIOB->CRL|=0X00000030;
GPIOB->ODR|=1<<1;      //输出1
DS18B20_Rst();
return DS18B20_Check();


main函数中就在死循环中不停地打印出temp的值,但还是得不到正确的数字,请问我还有哪些地方需要注意和检查?
STM32
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-3-6 17:22:35 | 显示全部楼层
有上拉电阻, 然后设置为 开漏输出, 这样就不用转换状态了!

一般的 总线 上即作为输入 又作为输出的IO, 都可以配置为开漏输出,接个上拉电阻。 

如I2C总线的 SDA
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-3-6 17:23:26 | 显示全部楼层
剩下的就看你的时序了。 看看你的时钟配置符不符合 18B20时序
回复 支持 反对

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2013-4-11 00:18:36 | 显示全部楼层
回复【5楼】jj123paopao:
---------------------------------
#define DS18B20_IO_IN()  {GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=8<<1;} 
#define DS18B20_IO_OUT() {GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=3<<1;} 
改成
#define DS18B20_IO_IN()  {GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=8<<4;} 
#define DS18B20_IO_OUT() {GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=3<<4;}
GPIOB->|=0X00000080;
GPIOB->|=0X00000030;
天道酬勤
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-11 08:24:26 | 显示全部楼层
回复【3楼】simms01:
-------------------------------
應該是IO口沒有復用,你去看下資料,應該是你的飛線的另一端沒有復用正確.
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-21 16:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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