From f17a957cf178750abeb8a9737ff59fd12a3d5fa4 Mon Sep 17 00:00:00 2001 From: Gogs Date: Fri, 7 Jun 2019 21:27:29 +0800 Subject: [PATCH] test --- ds18b20.c | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/ds18b20.c b/ds18b20.c index 81fd900..743be2a 100755 --- a/ds18b20.c +++ b/ds18b20.c @@ -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()) {