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();//复位ds18b20ds18b20_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