H_JEN 发表于 2016-5-8 16:25:37

wolfgang2015 发表于 2016-5-4 13:44
检查电路,DQ是否做了上拉

已经有上拉。现在能读数据了,但是读出来的数据,高八位要么全为0,要么全为1;低八位总是为0

huaiqiao 发表于 2016-5-8 16:36:20

H_JEN 发表于 2016-5-8 16:25
嗯,是啊。之前延时程序有问题,现在调回来了,现在能读数据了,但是读出来的数据,高八位要么全为0,要 ...

嗯嗯,如果有逻辑分析仪就好了,可以看看

H_JEN 发表于 2016-5-8 16:45:06

huaiqiao 发表于 2016-5-8 16:36
嗯嗯,如果有逻辑分析仪就好了,可以看看

我想请问下,在18b20复位完成后,不发送任何命令,直接读数据口,是为高电平吗?就是图中圈住的部分。我的复位完成后直接读数据口,有时是高电平有时是低电平。

xueshawu1 发表于 2016-5-8 17:37:33

单个18B20跳过ROM,在STM32测试过,搜索ROM未成功

huaiqiao 发表于 2016-5-8 20:46:36

H_JEN 发表于 2016-5-8 16:45
我想请问下,在18b20复位完成后,不发送任何命令,直接读数据口,是为高电平吗?就是图中圈住的部分。我 ...

你的复位时间这些的有问题么?可以参考下原子的代码看看你哪个地方有问题

taonsh 发表于 2016-5-9 08:58:36

H_JEN 发表于 2016-5-8 16:19
还没解决。现在能读数据了,但是读出来的数据,高八位要么全为0,要么全为1;低八位总是为0 ...

如果时序没有问题,很有可能是你延时没有正确造成的,要么就是你拿的器件有问题,可以换一个18B20看看:lol,我上传部分我的代码,你参考一下;
/****************************************************************************************
Include file
****************************************************************************************/
#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

#include "DS18B20.h"
#include "DS18B20_hal.h"

/****************************************************************************************
全局变量定义
****************************************************************************************/

/****************************************************************************************
函 数 名:static void DS18B20RccInit(void)
参数描述:
返回值描述:无
特殊算法:无
注意事项:
****************************************************************************************/
static void DS18B20RccInit(void)
{
      RCC->BitAPB2ENR.IOPCEN = 1;
      RCC->BitAPB2ENR.AFIOEN = 1;
}

/****************************************************************************************
函数名:static void SetDQPortOutput(void)
函数功能:设DQ为输出模式
参数描述:
返回值描述:无
特殊算法:无
注意事项:
****************************************************************************************/
static void SetDQPortOutput(void)
{
      GPIO_InitTypeDef GPIO_InitStructure;
      //配置LED的管脚为开漏输出
      GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_PIN;                      //DQ试制电路板PC0,(原PA1)
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                //GPIO_Mode_Out_PP;GPIO_Mode_AF_PP
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
      GPIO_Init(DS18B20_DQ_PORT, &GPIO_InitStructure);
}

/****************************************************************************************
函数名:static voidSetDQPortInput(void)
函数功能:设DQ为输入模式
参数描述:
返回值描述:无
特殊算法:无
注意事项:
****************************************************************************************/
static void SetDQPortInput(void)
{
      GPIO_InitTypeDef GPIO_InitStructure;

      GPIO_InitStructure.GPIO_Pin =DS18B20_DQ_PIN;                  //DQ(PA1)
      GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;            // GPIO_Mode_IPU;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
      GPIO_Init(DS18B20_DQ_PORT, &GPIO_InitStructure);
}

/****************************************************************************************
函 数 名:static void DS12B20TimInit()
函数功能:定时器初始化配置
参数描述:
返回值描述:
特殊算法:
注意事项:
****************************************************************************************/
static void DS18B20TimInit()
{
      TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
      //计数频率 72000000/72 = 1MHz
      TIM_TimeBaseStructure.TIM_Prescaler = 72-1;                     //时钟预分频数
      TIM_TimeBaseStructure.TIM_Period = 1;                           //arr 设置自动重装载寄存器 arr1MHz1us溢出时间
      TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;         //采样不分频
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         //向上计数模式
      TIM_TimeBaseInit(DS18B20_TIM, &TIM_TimeBaseStructure);
      TIM_ClearFlag(DS18B20_TIM, TIM_FLAG_Update);                         //清除溢出标志
}

/****************************************************************************************
函 数 名:static void DS18B20_5us(void)
函数功能:定时器延时5*byDelay个us
参数描述:
返回值描述:
特殊算法:
注意事项:
****************************************************************************************/
static void DS18B20_5us(uint8_t byDelay)
{
      TIM_SetCounter(DS18B20_TIM, 0);                                 //清计数器
      TIM_SetAutoreload(DS18B20_TIM, 5*byDelay);                      //设置自动重载,定时器计时==5ms*byDelay;
      TIM_Cmd(DS18B20_TIM, ENABLE);

      while(TIM_GetFlagStatus(DS18B20_TIM, TIM_FLAG_Update) == RESET)
      {
                ;
      }
      TIM_ClearFlag(DS18B20_TIM,TIM_FLAG_Update);                     //清除溢出标志
      TIM_Cmd(DS18B20_TIM, DISABLE);
}

/****************************************************************************************
函 数 名:static void Init_DS18B20(void)
函数功能:
参数描述:
返回值描述:
特殊算法:
注意事项:
****************************************************************************************/
static uint8_t Init_DS18B20(void)
{
      uint8_t byCount = 0;
      SetDQPortOutput();
      DS18B20_DQ_H;                                                   //DQ= 1复位
      DS18B20_5us(12);
      DS18B20_DQ_L;                                                   //DQ= 0
      DS18B20_5us(120);                                             //延时600微秒(该时间的时间范围可以从480到960微秒)

      DS18B20_DQ_H;
      DS18B20_5us(1);

      SetDQPortInput();

      while((GPIO_ReadInputDataBit(DS18B20_DQ_PORT, DS18B20_DQ_PIN)) && (byCount < 200))
      {
                byCount ++;
                DS18B20_5us(1);
      }

      DS18B20_5us(80);

      SetDQPortOutput();
      DS18B20_DQ_H;
      DS18B20_5us(1);

      return byCount;
}

/****************************************************************************************
函数名:void Ap3156Open(void)
函数功能:初始化Ap3156管脚电平
参数描述:
返回值描述:
特殊算法:
注意事项:
****************************************************************************************/
void DS18B20_Open(void)
{
      DS18B20RccInit();

      RCC->BitAPB1ENR.TIM2EN = 1;
      DS18B20TimInit();
        TIM_ClearITPendingBit(DS18B20_TIM, TIM_IT_Update);
      TIM_ClearFlag(DS18B20_TIM, TIM_FLAG_Update);
      TIM_Cmd(DS18B20_TIM, DISABLE);

      Init_DS18B20();
}

/****************************************************************************************
函数名:void WriteOneChar(void)
函数功能:写一个字节
参数描述:
返回值描述:
特殊算法:
注意事项:
****************************************************************************************/
static void WriteOneChar(unsigned char dat)
{
         SetDQPortOutput();
         for(uint8_t i=8; i>0; i--)
         {
               if(dat&0x01)   //写1
               {
                        DS18B20_DQ_L;
                        DS18B20_5us(1);
                        DS18B20_DQ_H;
                        DS18B20_5us(16);
               }
               else             //写0
               {
                         DS18B20_DQ_L;
                         DS18B20_5us(18);
                         DS18B20_DQ_H;
                         DS18B20_5us(1);
               }
               dat>>=1;
         }
}

/****************************************************************************************
函数名:void ReadOneChar(void)
函数功能:读一个字节
参数描述:
返回值描述:
特殊算法:
注意事项:
****************************************************************************************/
static unsigned char ReadOneChar(void)
{
      unsigned char dat = 0;
      for(uint8_t ii=8; ii > 0; ii--)
      {
                SetDQPortOutput();
                DS18B20_DQ_L;
                for(uint8_t i = 0;i < 100; ++i);

                DS18B20_DQ_H;
                dat>>=1;

                SetDQPortInput();
                for(uint8_t i = 0;i < 20; ++i);         //75,50

                if(GPIO_ReadInputDataBit(DS18B20_DQ_PORT, DS18B20_DQ_PIN))
                {
                  dat |= 0x80;
                }
                SetDQPortOutput();
                DS18B20_DQ_H;
                DS18B20_5us(15);
      }
      return(dat);
}

/****************************************************************************************
函数名:short Read18B20(void)
函数功能:读18B20温度
参数描述:
返回值描述:
特殊算法:
注意事项:
****************************************************************************************/
static short Read18B20(void)
{
      uint8_t byDataL=0;
      uint8_t byDataH=0;
      short Temperature = 0;

      if(!(Init_DS18B20() < 200))                                     //初始化失败
                if(!(Init_DS18B20() < 200))
                        return 4000;
      WriteOneChar(0xCC);                                             //跳过读序号列号的操作
      WriteOneChar(0x44);                                             //启动温度转换

      if(!(Init_DS18B20() < 200))                                     //初始化失败
                if(!(Init_DS18B20() < 200))
                        return 4000;
      WriteOneChar(0xCC);                                             //跳过读序号列号的操作
      WriteOneChar(0xBE);                                             //读取温度寄存器

      byDataL = ReadOneChar();                                        //读低8位
      byDataH = ReadOneChar();                                        //读高8位
      DS18B20_5us(10);

      Temperature = (short)((byDataH << 8) | byDataL);

      return (Temperature * 5 / 8 - 10);                              //*0.625,1摄氏度校准
}

/****************************************************************************************
函数名:void ReadTemperature(void)
函数功能:读18B20温度
参数描述:
返回值描述:
特殊算法:
注意事项:
****************************************************************************************/
short ReadTemperature(void)
{
      short Temperature1 = 0;
      short Temperature2 = 0;

      Temperature1 = Read18B20();
      DS18B20_5us(200);
      Temperature2 = Read18B20();
      if((Temperature1 < Temperature2 - 10)||(Temperature1 > Temperature2 + 10))
      {
                Temperature1 = Read18B20();
                DS18B20_5us(200);
                Temperature2 = Read18B20();
                if((Temperature1 < Temperature2 - 10) || (Temperature1 > Temperature2 + 10))
                {
                        Temperature1 = Read18B20();
                        DS18B20_5us(200);
                        Temperature2 = Read18B20();
                        if((Temperature1 < Temperature2 - 10) || (Temperature1 > Temperature2 + 10))
                              return 4000;
                }
      }
      return (Temperature1 + Temperature2)/2;
}


sacq12 发表于 2016-5-9 20:26:24

最后再找个逻辑分析仪看下波形。
程序里的时延可能需要再仔细推敲推敲。

dsjsjf 发表于 2016-5-13 21:08:17

H_JEN 发表于 2016-5-8 16:21
嗯,这样做了。现在能读数据了,但是读出来的数据,高八位要么全为0,要么全为1;低八位总是为0 ...

这个读时序要严格控制的,确认一下你的时钟频率,程序中的延时函数的精度

欣辰天下 发表于 2016-5-17 21:37:08

现在来签到

LIUBEIHUA 发表于 2016-5-18 13:34:00

时序要对,103芯片我直接用ALIENTEK MINISTM32板的程序改成开漏,就读出了,L152直接改成开漏不行,通过示波器观察时序不对,调试发现用库函数总是调不对,改用寄存器操作时序对了,数据就读出来了。
页: 1 2 3 4 [5] 6
查看完整版本: 基于STM32的DS18B20的问题