This commit is contained in:
Gogs 2019-06-07 21:27:29 +08:00
parent 77e38a120c
commit f17a957cf1

View File

@ -11,12 +11,13 @@
unsigned int gpio_num = 223;
#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))
#define DQ_OUT gpio_direction_output(gpio_num, 1)
#define DQ_H gpio_set_value(gpio_num, 1)
#define DQ_L gpio_set_value(gpio_num, 0)
#define DQ_V gpio_get_value(gpio_num)
spinlock_t lock;
//spinlock_t lock;
//********************************
//功能:ds18b20复位
@ -26,9 +27,6 @@ int init_DS18B20(void)
unsigned int result;
DQ_OUT;
DQ_L;
DQ_H;
udelay(2);
DQ_L;
udelay(480); //480~960
DQ_H;
udelay(60); //60-240
@ -43,18 +41,26 @@ int init_DS18B20(void)
//*************************************
//功能:从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 int i = 0;
unsigned char dat = 0;
spin_lock(&lock);
//spin_lock(&lock);
for(i=0; i<8; i++) {
DQ_OUT;
DQ_L;
DQ_H;
udelay(2);
DQ_L;
udelay(2);
DQ_H;
udelay(8);
@ -65,26 +71,30 @@ unsigned char read_char(void)
udelay(50);
}
DQ_OUT;
DQ_L;
DQ_H;
spin_unlock(&lock);
//spin_unlock(&lock);
return dat;
}
//*************************************
//功能:向ds18b20写一个字节的数据
//*************************************
// 写“1”时隙
// 保持总线在低电平1微秒到15微秒之间
// 然后再保持总线在高电平15微秒到60微秒之间
// 理想状态: 1微秒的低电平然后跳变再保持60微秒的高电平
//
// 写“0”时隙
// 保持总线在低电平15微秒到60微秒之间
// 然后再保持总线在高电平1微秒到15微秒之间
// 理想状态: 60微秒的低电平然后跳变再保持1微秒的高电平
void write_char(unsigned char dat)
{
unsigned int i = 0;
spin_lock(&lock);
//spin_lock(&lock);
DQ_OUT;
DQ_H;
for(i=0; i<8; i++)
{
DQ_H;
udelay(2);
DQ_L;
if (dat & 0x01)
DQ_H;
@ -93,13 +103,12 @@ void write_char(unsigned char dat)
udelay(60);
dat >>= 1;
}
DQ_H;
spin_unlock(&lock);
//spin_unlock(&lock);
}
int initDs18b20(unsigned int gpioNum)
{
spin_lock_init(&lock);
//spin_lock_init(&lock);
gpio_num = gpioNum;
if (init_DS18B20())
return 1;
@ -116,7 +125,7 @@ void readDs18b20Data(unsigned char *value)
write_char(0xCC);
write_char(0x44);
mdelay(800);
mdelay(750);
if (init_DS18B20())
{