免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1146 | 回复: 0
打印 上一主题 下一主题

[求助帖]Linux+ARM 驱动 DS18B20的问题求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-14 20:26 |只看该作者 |倒序浏览
本人软件出身,硬件不怎么会,准备在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_t  s3c6410_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后回发一个芯片的存在脉冲”,具体操作时函数内为什么要有循环?以及函数的大体意思。
跪谢大神~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP