Linux ds18b20驱动心得

在进入正题之前不得不说,由于自己的一个错误,导致此驱动写了近3天,查阅了无数的资料,基本上都能把ds18b20的原理和使用过程背下来了,可以说有失有得,如果当初一两次就成功了,可能也就不会深入的去查阅各种资料了。

	下面进入正题,心得的角度从快速使用的角度出发。

在这里插入图片描述

	开发板将引脚设为输出,发送一个高电平再拉低,维持480-960US;
	引脚拉高释放总线,主机等待60US-200US;
	读取引脚数据,0为初始化成功;1为初始化失败;
	读取数据完毕后,延迟等待400US;
	
	程序演示:
		void de18b20_init_start(void)
		 {
	    	int ack = 1;
	    	gpio_direction_output(ds18b20.gpionum, 0);	//驱动初始化已经将此GPIO配置输出高电平,这里直接就拉低了。
	    	udelay(480);//延迟时间范围,根据自己的板子测试更改。
	    	gpio_direction_output(ds18b20.gpionum, 1);//释放总线等待响应
	    	udelay(60);
	    	ack = gpio_get_value(ds18b20.gpionum);//返回值为0说明初始化成功,反则为1
	    	printk("ack = %d\n",ack);
	    	udelay(400);//配置完成后延迟400us
	    	gpio_direction_output(ds18b20.gpionum, 1);
	 	 }

在这里插入图片描述

写数据

引脚拉高2us,然后拉低(保持1us),产生一个下降沿,表示写数据开始;
将要写的1或0放在总线上;
整个过程在15us之内完成;
然后主机延时等待至少50us;
拉高释放总线;
每写两位数据之间的间隔要大于1us;

程序演示
    void ds18b20_wriet_data(unsigned char byte)
    {
    	unsigned char i = 0;
    		for (i = 0; i < 8; i++) {
    			gpio_set_value(ds18b20.gpionum, 1);	//拉高引脚
    			udelay(2);//保持2us
    			gpio_set_value(ds18b20.gpionum, 0);		//拉低引脚,产生写间隙
    			udelay(2);		//简单延时
    			gpio_set_value(ds18b20.gpionum, 1);		//15us之内释放总线
    			udelay(2);		//简单延时
    			gpio_set_value(ds18b20.gpionum, byte & 0x01);	//将字节低位写入单总线
    			udelay(50);		//在15~60us内等待DS18B20来采集信号
    			gpio_set_value(ds18b20.gpionum, 1);		//释放总线
    			byte >>= 1;       	//每次讲要读取的数据位移至最低位
    			udelay(2);
    			}	
    }

读数据

拉高引脚,延时2us,然后拉低1us,产生一个下降沿,表示读数据;
拉高释放总线,必须在下降沿之后的15us内将端口数据读取;
读取数据后,延时60us;
每两个数据位之间间隔大于1us;

程序演示
unsigned char de18b20_read_data(void)
{
	unsigned char i = 0;
	unsigned char byte = 0;
	for (i = 0; i < 8; i++) {
		gpio_set_value(ds18b20.gpionum, 1);//产生读时序
		udelay(2);
		gpio_set_value(ds18b20.gpionum, 0);//产生读时序
		udelay(2);			//简单延时
		gpio_set_value(ds18b20.gpionum, 1);//释放总线
		byte >>= 1;     		//先进行移位
		if(gpio_get_value(ds18b20.gpionum))
			{
			byte |= 0x80;
			printk("1\n");//调试信息
			}else{
			printk("0\n");//调试信息
			}
		udelay(60);			//延时60us
		gpio_set_value(ds18b20.gpionum, 1);	//释放总线
		udelay(1);
	}
	return byte;
}

使用过程

ds18b20_init_start();//复位ds18b20
ds18b20_wriet_data(0xcc);
ds18b20_wriet_data(0x44);
//以上内容是告诉ds18b20,跳过ROM指令(0xcc),转换温度(0x44);
//此处需要等待温度的转换完成,可以使用延迟函数,也可以使用以下方法,等待第一时间转换完整读取数据。
while(!gpio_get_value(ds18b20.gpionum));
ds18b20_init_start();//复位ds18b20
ds18b20_wriet_data(0xcc);
ds18b20_wriet_data(0xbe);
//以上内容是告诉ds18b20,跳过ROM指令(0xcc),读取温度寄存器的值(0xbe);
//剩下就是调用read来读取相应的数值了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值