Linux ds18b20驱动心得

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

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

Linux 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);

}

Linux ds18b20驱动心得

写数据

引脚拉高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来读取相应的数值了。

以上是 Linux ds18b20驱动心得 的全部内容, 来源链接: utcz.com/a/58849.html

回到顶部