snailchen 发表于 2010-1-22 16:21:16

ds18b20的一点疑惑

以下是DS18b20的程序,我用的芯片是at91sam7s64,发现有些IO可以用,有些IO不行,比如我用PA0是可以正确读数的,但是用PA15读数一直是0,请问是怎么回事呢?
AT91S_PIO * pPIO = AT91C_BASE_PIOA;

void DS18b20_Init(void)
{
        pPIO->PIO_PER = DS18B20;
        pPIO->PIO_PPUDR = DS18B20;
}

//*-------------------------------------------------
//* Function Name: Reset_Ds18b20
//* Object: Reset Ds18b20
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
void Reset_Ds18b20(void)
{
    SET_DIR_1WIRE;
    SET_OP_1WIRE;
        _delay_us(1);   
    CLR_OP_1WIRE;

    _delay_us(600);    //480usÒÔÉÏ
       
    SET_OP_1WIRE;
    CLR_DIR_1WIRE;
       
    _delay_us(20);   //15~60us
       
    while(CHECK_IP_1WIRE);//* Ϊ±ÜÃâËÀÑ­Ðò£¬´ý´¦Àí
       
    SET_DIR_1WIRE;
    SET_OP_1WIRE;
       
    _delay_us(140);   //60~240us       
}


//*-------------------------------------------------
//* Function Name: Write_Ds18b20
//* Object: Write a byte
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
void Write_Ds18b20(unsigned char x)
{   
    unsigned char m;
   
    for(m=0; m<8; m++)
    {
       CLR_OP_1WIRE;
      
       if(x&(1<<m))
         SET_OP_1WIRE;
       else
         CLR_OP_1WIRE;

       _delay_us(50);   //15~60us

       SET_OP_1WIRE;
           _delay_us(1);
    }
      
   SET_OP_1WIRE;
}

//*-------------------------------------------------
//* Function Name: Read_Ds18b20
//* Object: Read a byte
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
unsigned char Read_Ds18b20(void)
{      
    unsigned char temp,k,n;
      
    temp=0;
   
    for(n=0; n<8; n++)
    {
      CLR_OP_1WIRE;
      SET_OP_1WIRE;
      CLR_DIR_1WIRE;
      
          _delay_us(2);
          
      k =(CHECK_IP_1WIRE);

      if(k)
          temp|=(1<<n);
      else
          temp&=~(1<<n);
      
      _delay_us(70); //60~120us
                     //   
      SET_DIR_1WIRE;
          _delay_us(1);   
   }
   
   return (temp);
}   

//*-------------------------------------------------
//* Function Name: Get_Temp
//* Object: Read tempture from ds18b20
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
float Get_Temp(void)
{
   unsigned char temh,teml;
       float         temp;
       unsigned int tmp;
       
   Reset_Ds18b20();

   Write_Ds18b20(skiprom);
   Write_Ds18b20(convert);
       
   _delay_ms(100);
       _delay_ms(100);

   Reset_Ds18b20();

   Write_Ds18b20(skiprom);
   Write_Ds18b20(readscrat);

   teml = Read_Ds18b20();
   temh = Read_Ds18b20();
       
        tmp = temh;
        tmp <<= 8;
        tmp |= teml;

        temp = tmp*0.0625+0.005;

        return temp;
}

gooogleman 发表于 2010-1-22 16:33:45

是不是你的IO设置了别的功能?

snailchen 发表于 2010-1-22 16:46:19

回复【1楼】gooogleman 谷歌汉子
-----------------------------------------------------------------------

没有,
void DS18b20_Init(void)
{
pPIO->PIO_PER = DS18B20;
pPIO->PIO_PPUDR = DS18B20;
}
初始化使能IO了,外设禁用了的

snailchen 发表于 2010-1-22 17:17:55

我直接控制IO的时候有电平变化,但是用来驱动ds18b20就不行了,是不是时序上有问题呢

lxppkyou 发表于 2010-11-23 13:14:21

回复【楼主位】snailchen 箫寒客
-----------------------------------------------------------------------
楼主,我也是用AT91SAM64控制18B20,请问下,为什么忙标志一直读回来是1呢?我换了好多口都是1,请问是不是在其他地方要设置什么啊?
下面是我的程序,您帮我看下好吗?
uint32 Init_DS18B20(void)//18B20初始化
{
        uint32 x;
       
        *AT91C_PIOA_OER|=BIT0;//IO方向为输出
        //*AT91C_PIOA_PER|=BIT0;//PIO控制
        SET_DS;    //DQ置高
        delay_nus(1);//稍做延时
        CLR_DS;    //将DQ拉低
        delay_nus(750); //精确延时 大于 480us
        SET_DS;    //拉高总线
        delay_nus(80);
        *AT91C_PIOA_ODR|=BIT0;//IO方向为输入,方便读取数据
       
        *AT91C_PIOA_PER|=BIT0;// 禁止PIO控制
       
        delay_nus(100);
        x=(*AT91C_PIOA_PDSR&0x00000001);
        *AT91C_PIOA_OER|=BIT0;//IO方向为输出
        SET_DS;    //DQ置高
        delay_nus(140);
        return(x);
}}

jack_yu 发表于 2010-11-23 13:32:39

mark!

vipeinstein 发表于 2010-11-25 19:58:28

4楼的这样很难检测到存在脉冲了。你可能没了解“脉冲”这个词!
页: [1]
查看完整版本: ds18b20的一点疑惑