yixuaning 发表于 2013-04-14 20:26

[求助帖]Linux+ARM 驱动 DS18B20的问题求助

本人软件出身,硬件不怎么会,准备在arm开发板上驱动ds18b20传感器,这是网上找的单片机对DS18B20操作流程:

1、 复位:首先复位,由单片机给DS18B20单总线至少480uS的低电平信号。当DS18B20接到此复位信号后则会在15~60uS后回发一个芯片的存在脉冲。

2、存在脉冲:在复位后,单片机将数据单总线拉高,在15~60uS后接收一个60~240uS的低电平信号存在脉冲。通信双方达成了基本的协议,之后是单片机与DS18B20间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。

3、单片机发送ROM指令:双方达成协议之后将进行交流,ROM指令共有5条,一个工作周期发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。

4、单片机发送存储器操作指令:在ROM指令发送给18B20之后,接着(不间断)发送存储器操作指令。操作指令同样为8位,共6条,分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。存储器操作指令的功能是命令18B20工作,是芯片控制的关键。

5、执行或数据读写:一个存储器操作指令结束后进行指令执行或数据的读写,此操作视存储器操作指令而定。如执行温度转换指令则单片机必须等待18B20执行其指令,一般转换时间为500uS。如执行数据读写指令则需要严格遵循18B20的读写时序来操作。

以下是参考其他人arm驱动ds18b20的例子,看到读温度函数就不懂了,求助各位讲解:
void tmreset (void)
{      

      s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(1));
         gpio_set_value(S3C64XX_GPE(0), 1);
         udelay(100);
         gpio_set_value(S3C64XX_GPE(0), 0);
         udelay(600);
         gpio_set_value(S3C64XX_GPE(0), 1);
         udelay(100);
         s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(0));
}

void tmwbyte (unsigned char dat)
{                     
         unsigned char j;
         s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(1));
         for (j=1;j<=8;j++)      
         {
                gpio_set_value(S3C64XX_GPE(0), 0);
                udelay(1);
                if((dat&0x01)==1)
               {
                         gpio_set_value(S3C64XX_GPE(0), 1);                  
               }         
               else
                {

                }
               udelay(60);
               gpio_set_value(S3C64XX_GPE(0), 1);
               udelay(15);
               dat = dat >> 1;
         }
         gpio_set_value(S3C64XX_GPE(0), 1);
}

unsigned char tmrbyte (void)
{   
         unsigned char i,u=0;      

      for (i=1;i<=8;i++)      
         {

                s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(1));
               gpio_set_value(S3C64XX_GPE(0), 0);
                udelay(1);
               u >>= 1;
                gpio_set_value(S3C64XX_GPE(0), 1);
               s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(0));
                if( gpio_get_value(S3C64XX_GPE(0)))    u=u|0x80;
               udelay(60);
         }
         return (u);   
}

void DS18B20PRO(void)         
{   
      unsigned char a,b;
      tmreset();         
         udelay(420);
         tmwbyte(0xcc);      
         tmwbyte(0x44);      
         mdelay(750);
         tmreset ();   
      udelay(400);
         tmwbyte (0xcc);
         tmwbyte (0xbe);
         a = tmrbyte ();
         b= tmrbyte ();
         sdata = a/16+b*16;   
}      

static ssize_ts3c6410_18b20_read(struct file *filp, char *buf, size_t len, loff_t *off)

{
         DS18B20PRO();
         *buf=sdata;
         return 1;
}
目前是以下两个问题:
1.为什么原操作方法是:“首先复位,由单片机给DS18B20单总线至少480uS的低电平信号”,但是具体操作时先输出了高电平信号,并有延时(几乎所有的操作都这样)?
2.void tmwbyte (unsigned char dat)函数不理解,操纵方法是:“当DS18B20接到此复位信号后则会在15~60uS后回发一个芯片的存在脉冲”,具体操作时函数内为什么要有循环?以及函数的大体意思。
跪谢大神~~~~
页: [1]
查看完整版本: [求助帖]Linux+ARM 驱动 DS18B20的问题求助