打印
[STM32F1]

18B20程序,读出来的都OXFF,不知哪里有问题,调了好几天了

[复制链接]
4619|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zangjinlian|  楼主 | 2015-1-22 19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
18B20程序,读出来的都OXFF,不知哪里有问题,调了好几天了
沙发
zangjinlian|  楼主 | 2015-1-22 19:58 | 只看该作者
#include "stm32f10x.h"
#include "SysTick.h"
#include "Extern.h"
#include "main.h"                           //宏定义文件(全部)
#include "stdlib.h"
#include "ds18b20.h"
//&&&&&&&&&&&&&&&&&&&
char teat;
float  Temperature;
//&&&&&&&&&&&&&&&&&&&

//#define DS1820_DIR  P2DIR
//#define DS1820_IN  P2IN
//#define DS1820_OUT  P2OUT
//#define DS1820_DQ  BIT4 //定义DS1820的接口

// DS1820 ROM命令宏定义
#define ReadRom   0x33
#define MatchRom  0x55
#define SearchRom  0xf0  
#define AlertSearch  0xec
#define CopyScratchpad  0x48
#define SkipRom   0xcc
#define ReadPower  0xb4   

// DS1820 功能命令宏定义
#define ConvertTemperature 0x44
#define ReadScratchpad  0xbe
#define WriteScratchpad  0x4e
#define RecallE   0xb8

//#define SMCLK   7500  //(KHz)用于系统延时


// 变量定义
unsigned char GetScratchpad[9];
unsigned char ResultTemperatureH;  //温度值的高八位(为0则温度值为正,否则为负)
unsigned char ResultTemperatureL;  //温度值的低八位(表示温度值)
unsigned char COUNT_REMAIN;   
unsigned char COUNT_PER;   
  
void DS1820_WriteBit(unsigned char oww_dat);
void DS1820_WriteByte(unsigned char oww_dat);
void DS1820_ReadTemp(void);         //读取当前温度值
unsigned char DS1820_Init(void);
unsigned char DS1820_ReadBit(void);
unsigned char DS1820_ReadByte(void);
//void Delay10us(void);
//void DelayX10us(unsigned char x10us);
//void Delay_ms(unsigned int number);
void Delay10us(u32 Stime);
void Delay_us(u32 Stime1);
void GPIO_Configuration1(void) ;
void GPIO_Configuration2(void) ;
// 功能函数定义
void GPIO_Configuration1(void)
{   
        GPIO_InitTypeDef ds18b20_in;     
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);      
        ds18b20_in.GPIO_Pin = GPIO_Pin_10;  
        ds18b20_in.GPIO_Speed = GPIO_Speed_50MHz;   
        ds18b20_in.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
        GPIO_Init(GPIOC, &ds18b20_in);  
}
void GPIO_Configuration2(void)
{   
        GPIO_InitTypeDef ds18b20_out;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);                    
        ds18b20_out.GPIO_Pin = GPIO_Pin_10;      
        ds18b20_out.GPIO_Speed = GPIO_Speed_50MHz;      
        ds18b20_out.GPIO_Mode = GPIO_Mode_Out_PP;   
        GPIO_Init(GPIOC, &ds18b20_out);     
}  

void Delay10us(u32 Stime)
{
u32 i;
for(i=0;i<Stime;i++)
{
        Delay_us(10);
}

}
//void Delay_us(u32 Stime1)
//{
// u32 i,j=0;
//
//         for(i=0;i<Stime1;i++)
//         {
//                 j++;
//         }
//}
//void Delay_us(u32 Nus)   
//{   
// SysTick->LOAD=Nus*9;          //时间加载         
// SysTick->CTRL|=0x01;             //开始倒数      
// while(!(SysTick->CTRL&(1<<16))); //等待时间到达   
// SysTick->CTRL=0X00000000;        //关闭计数器   
// SysTick->VAL=0X00000000;         //清空计数器        
//}   
unsigned char DS1820_Init(void){
  unsigned char result;
  GPIO_Configuration2();                                 // ow output
  GPIO_ResetBits( GPIOC,  GPIO_Pin_10);        //DS1820_DQ=0;
  Delay_us(500);       // Bus master pulling low 480us minimum;
  GPIO_SetBits(GPIOC,  GPIO_Pin_10);// DS1820_DQ=1;
  Delay_us(48);        // Resister pull up 15-60us;
  GPIO_Configuration1();
  result =GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10); //DS1820_IN & DS1820_DQ;
  GPIO_Configuration2();                                 // ow output
  Delay_us(500);       // End of timeslot total 480us;  
  return(result);       // any 1 wire device ?result:=1 no devide; ?result:=0 have device;
  Delay_us(200);   
  GPIO_Configuration2();                                 // ow output
  GPIO_SetBits(GPIOC,  GPIO_Pin_10);// DS1820_DQ=1;
  Delay_us(280);  
}//Intialization the 1-wire devices;

unsigned char DS1820_ReadBit(void){
  unsigned char result1;
  GPIO_Configuration2();                                 // ow output
  GPIO_ResetBits( GPIOC,  GPIO_Pin_10);        //DS1820_DQ=0;
  Delay_us(2);
   GPIO_SetBits(GPIOC,  GPIO_Pin_10);// DS1820_DQ=1;
   Delay_us(2);
  GPIO_Configuration1();                   // ow input
  result1 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10); //DS1820_IN &DS1820_DQ;
    GPIO_Configuration2();                                 // ow output
        GPIO_SetBits(GPIOC,  GPIO_Pin_10);// DS1820_DQ=1;
  return(result1);       // return the result of the 1-wire devide;
}//Read a bit on the 1-wire bus;

void DS1820_WriteBit(unsigned char oww_dat){
    GPIO_Configuration2();                                 // ow output  
    GPIO_ResetBits( GPIOC,  GPIO_Pin_10);        //DS1820_DQ=0;
        Delay_us(15);
  if (1 == oww_dat)  
  {
           GPIO_SetBits(GPIOC,  GPIO_Pin_10);// DS1820_DQ=1;
        }
  else
  {
    GPIO_ResetBits( GPIOC,  GPIO_Pin_10);        //DS1820_DQ=0;
   }//Write a bit to the 1-wire bus;
}
unsigned char DS1820_ReadByte(void){
  unsigned char i,j;
  unsigned char result=0;
  for(i = 0; i < 8; i++)
  {
    if(DS1820_ReadBit())
    {
     result |= 0x01 << i;
       result|=0x80;
        }   
    Delay_us(50);
        GPIO_Configuration2();                                 // ow output
        GPIO_SetBits(GPIOC,  GPIO_Pin_10);// DS1820_DQ=1;
        Delay_us(2);
   }    // ??
  return(result);       // return the result of the 1-wire device;
}//Read a byte from the 1-wire bus;

void DS1820_WriteByte(unsigned char oww_dat){
  unsigned char i,temp;
  for(i = 0; i < 8; i++){
    temp = oww_dat >> i;
    temp &= 0x01;
    DS1820_WriteBit(temp);
  }
  Delay_us(80);        // ??
  GPIO_SetBits(GPIOC,  GPIO_Pin_10);// DS1820_DQ=1;
    Delay_us(2);        // ??
}//Write a byte to the 1-wire bus;


void DS1820_ReadTemp(void)
{ //float  Temperature;
   int i;
//float TEMPERATURE;
DS1820_Init();
//if(result1==1)result1=2;
DS1820_WriteByte(SkipRom);
Delay_us(1);
  //There is just one DS1820 on the bus;
DS1820_WriteByte(ConvertTemperature);
Delay_us(8000);
  //Start to convert temperature;
  DS1820_Init();
DS1820_WriteByte(SkipRom);
DS1820_WriteByte(ReadScratchpad);
for(i=0;i<9;i++){
   GetScratchpad[i]=DS1820_ReadByte();
// GetScratchpad[0]=DS1820_ReadByte();//TEMPERATURE LSB;  
// GetScratchpad[1]=DS1820_ReadByte();//TEMPERATURE MSB;  
// GetScratchpad[2]=DS1820_ReadByte();//TH/USER BYTE 1;   
// GetScratchpad[3]=DS1820_ReadByte();//TL/USER BYTE 2;  
// GetScratchpad[4]=DS1820_ReadByte();//RESERVED;  
// GetScratchpad[5]=DS1820_ReadByte();//RESERVED;   
// GetScratchpad[6]=DS1820_ReadByte();//COUNT REMAIN;  
// GetScratchpad[7]=DS1820_ReadByte();//COUNT PER °C;   
// GetScratchpad[8]=DS1820_ReadByte();//CRC;
}
ResultTemperatureL=GetScratchpad[0];
ResultTemperatureH=GetScratchpad[1];
COUNT_REMAIN=GetScratchpad[6];
COUNT_PER=GetScratchpad[7];
  
Temperature=((ResultTemperatureH*256)+ResultTemperatureL)*0.0625; //Result of temperature;
Delay10us(10);
// return  Temperature;  
}

使用特权

评论回复
板凳
zangjinlian|  楼主 | 2015-1-22 19:59 | 只看该作者
void Delay_us(u32 Nus)   
{   
SysTick->LOAD=Nus*9;          //时间加载         
SysTick->CTRL|=0x01;             //开始倒数      
while(!(SysTick->CTRL&(1<<16))); //等待时间到达   
SysTick->CTRL=0X00000000;        //关闭计数器   
SysTick->VAL=0X00000000;         //清空计数器        
}

使用特权

评论回复
地板
ningling_21| | 2015-1-22 21:29 | 只看该作者
用示波器看看数据线波形,和18B20的芯片资料里的波形对比,也许能找到问题

使用特权

评论回复
5
zangjinlian|  楼主 | 2015-1-22 21:59 | 只看该作者
ningling_21 发表于 2015-1-22 21:29
用示波器看看数据线波形,和18B20的芯片资料里的波形对比,也许能找到问题 ...

主要是没有示波器,还有什么办法吗

使用特权

评论回复
6
fjjjnk1234| | 2015-1-22 22:07 | 只看该作者
用逻辑分析仪分析时序看看

使用特权

评论回复
7
zangjinlian|  楼主 | 2015-1-22 22:17 | 只看该作者
fjjjnk1234 发表于 2015-1-22 22:07
用逻辑分析仪分析时序看看

怎么分析,身边什么也没有呀.::L

使用特权

评论回复
8
zangjinlian|  楼主 | 2015-1-22 22:22 | 只看该作者
现在只能证明初始化过了,因为初始化返回的值是0.

使用特权

评论回复
9
fjjjnk1234| | 2015-1-22 22:32 | 只看该作者
zangjinlian 发表于 2015-1-22 22:17
怎么分析,身边什么也没有呀.:

单总线的时序要求很严格,看程序也很难看出来

使用特权

评论回复
10
ningling_21| | 2015-1-22 22:54 | 只看该作者
zangjinlian 发表于 2015-1-22 22:22
现在只能证明初始化过了,因为初始化返回的值是0.

那就只能通过串口打印输出 这个调试的过程了,例如,初始化 是否成功,发送数据是否成功,读取温度是否成功,数据线的状态,等等,一步一步进行

使用特权

评论回复
11
lxyppc| | 2015-1-23 08:48 | 只看该作者
zangjinlian 发表于 2015-1-22 22:17
怎么分析,身边什么也没有呀.:

工欲善其事
必先利其器

使用特权

评论回复
12
laocuo1142| | 2015-1-23 11:37 | 只看该作者
主要还是时序问题,单总线时序要求很严,你的延时确认了吗?

使用特权

评论回复
13
Serge_Ding| | 2015-1-23 11:39 | 只看该作者
估计是时序问题

使用特权

评论回复
14
icecut| | 2015-1-23 12:09 | 只看该作者
没示波器还玩什么模拟总线,换个iic的温度传感器得了

使用特权

评论回复
15
surviver| | 2015-1-23 12:38 | 只看该作者
设断点检查

使用特权

评论回复
16
mfc| | 2015-1-23 13:14 | 只看该作者
DS18B20对时序要求非常严格,算计好各指令和延时函数的时间

使用特权

评论回复
17
lnulibin| | 2015-1-23 14:05 | 只看该作者
试试换一个18B20看看。还不好用,只能是程序问题了。
一般需要示波器。对波形。
除非经验极其丰富。完全靠猜。

使用特权

评论回复
18
hsh| | 2015-1-23 15:13 | 只看该作者
DS18B20对时序要求很严格,最好用定时器延时,保证时序的准确

使用特权

评论回复
19
tianm| | 2015-1-23 17:33 | 只看该作者
说实话 女孩子不适合写程序

使用特权

评论回复
20
tianm| | 2015-1-23 17:33 | 只看该作者
说实话 女孩子不适合写程序

使用特权

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

本版积分规则

10

主题

127

帖子

4

粉丝