bug fix
This commit is contained in:
parent
8634daaeed
commit
72d236a7df
59
ds18b20.c
59
ds18b20.c
@ -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);
|
||||||
|
DQ_OUT;
|
||||||
for(i=0; i<8; i++) {
|
for(i=0; i<8; i++) {
|
||||||
DQ_OUT;
|
|
||||||
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;
|
||||||
|
udelay(2);
|
||||||
}
|
}
|
||||||
DQ_OUT;
|
spin_unlock(&lock);
|
||||||
//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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user