This commit is contained in:
Gogs 2019-06-09 09:09:55 +08:00
parent 8634daaeed
commit 72d236a7df

View File

@ -8,7 +8,7 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
unsigned int gpio_num = 223; unsigned int gpio_num = 0;
#define DQ_IN gpio_direction_input(gpio_num) #define DQ_IN gpio_direction_input(gpio_num)
//#define DQ_OUT gpio_direction_output(gpio_num, gpio_get_value(gpio_num)) //#define DQ_OUT gpio_direction_output(gpio_num, gpio_get_value(gpio_num))
@ -17,7 +17,7 @@ unsigned int gpio_num = 223;
#define DQ_L gpio_set_value(gpio_num, 0) #define DQ_L gpio_set_value(gpio_num, 0)
#define DQ_V gpio_get_value(gpio_num) #define DQ_V gpio_get_value(gpio_num)
//spinlock_t lock; spinlock_t lock;
//******************************** //********************************
//功能:ds18b20复位 //功能:ds18b20复位
@ -26,17 +26,14 @@ int init_DS18B20(void)
{ {
unsigned int result; unsigned int result;
DQ_OUT; DQ_OUT;
DQ_H;
udelay(2);
DQ_L; DQ_L;
udelay(480); //480~960 udelay(480); //480~960
DQ_H; DQ_H;
udelay(60); //60-240 udelay(15); //15-60
DQ_IN; DQ_IN;
udelay(60);//60-240
result = DQ_V; result = DQ_V;
udelay(420); udelay(405);
DQ_OUT;
DQ_H;
printk("ds18b20 init result %d", result); printk("ds18b20 init result %d", result);
return result; return result;
} }
@ -44,78 +41,62 @@ int init_DS18B20(void)
//************************************* //*************************************
//功能:从ds18b20读一个字节的数据 //功能:从ds18b20读一个字节的数据
//************************************* //*************************************
// 读“1”时隙
// 若总线状态保持在低电平状态1微秒到15微秒之间
// 然后跳变到高电平状态且保持在15微秒到60微秒之间
// 就认为从DS18B20读到一个“1”信号
// 理想情况: 1微秒的低电平然后跳变再保持60微秒的高电平
//
// 读“0”时隙
// 若总线状态保持在低电平状态15微秒到30微秒之间
// 然后跳变到高电平状态且保持在15微秒到60微秒之间
// 就认为从DS18B20读到一个“0”信号
// 理想情况: 15微秒的低电平然后跳变再保持46微秒的高电平
unsigned char read_char(void) unsigned char read_char(void)
{ {
unsigned int i = 0; unsigned int i = 0;
unsigned char dat = 0; unsigned char dat = 0;
//spin_lock(&lock); spin_lock(&lock);
for(i=0; i<8; i++) {
DQ_OUT; DQ_OUT;
for(i=0; i<8; i++) {
DQ_L; DQ_L;
udelay(2); udelay(2);
DQ_H;
udelay(8);
dat >>= 1; dat >>= 1;
DQ_IN; DQ_IN;
udelay(15);
if (DQ_V) if (DQ_V)
dat |= 0x80; dat |= 0x80;
udelay(50); udelay(50);
}
DQ_OUT; DQ_OUT;
//spin_unlock(&lock); udelay(2);
}
spin_unlock(&lock);
return dat; return dat;
} }
//************************************* //*************************************
//功能:向ds18b20写一个字节的数据 //功能:向ds18b20写一个字节的数据
//************************************* //*************************************
// 写“1”时隙
// 保持总线在低电平1微秒到15微秒之间
// 然后再保持总线在高电平15微秒到60微秒之间
// 理想状态: 1微秒的低电平然后跳变再保持60微秒的高电平
//
// 写“0”时隙
// 保持总线在低电平15微秒到60微秒之间
// 然后再保持总线在高电平1微秒到15微秒之间
// 理想状态: 60微秒的低电平然后跳变再保持1微秒的高电平
void write_char(unsigned char dat) void write_char(unsigned char dat)
{ {
unsigned int i = 0; unsigned int i = 0;
//spin_lock(&lock); spin_lock(&lock);
DQ_OUT; DQ_OUT;
for(i=0; i<8; i++) for(i=0; i<8; i++)
{ {
DQ_L; DQ_L;
udelay(10); udelay(2);
if (dat & 0x01) if (dat & 0x01)
DQ_H; DQ_H;
else else
DQ_L; DQ_L;
udelay(50); udelay(60);
DQ_H;
udelay(2);
dat >>= 1; dat >>= 1;
} }
//spin_unlock(&lock); spin_unlock(&lock);
} }
int initDs18b20(unsigned int gpioNum) int initDs18b20(unsigned int gpioNum)
{ {
//spin_lock_init(&lock); spin_lock_init(&lock);
gpio_num = gpioNum; gpio_num = gpioNum;
if (init_DS18B20()) if (init_DS18B20())
{
return 1; return 1;
}
return 0; return 0;
} }