基于 W80x 实现 DS18B20 驱动. 代码如下;
#include "wm_include. h"
#include "temper. h"
#define DS18B20_SKIP_ROM 0xCC
#define DS18B20_CONVERT_T 0x44
#define DS18B20_READ_SCRATCHPAD 0xBE
static void t_Delay_us (uint16_t num)
{
uint32_t i;
for (i=0; i " (80*num) ; i++)
{
__NOP () ;
}
}
static uint8_t DS18B20_IN (void)
{
tls_gpio_cfg (WM_IO_PB_00, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING) ;
return tls_bitband_read (HR_GPIOB_DATA, WM_IO_PB_00-16) ; //读取引脚电平
}
static uint8_t DS18B20_LOW (void)
{
// tls_gpio_cfg (WM_IO_PB_00, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING) ;
tls_bitband_write (HR_GPIOB_DATA, WM_IO_PB_00-16, 0) ;
}
static uint8_t DS18B20_HIGH (void)
{
// tls_gpio_cfg (WM_IO_PB_00, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING) ;
tls_bitband_write (HR_GPIOB_DATA, WM_IO_PB_00-16, 1) ;
}
static void set_gpio (void)
{
tls_gpio_cfg (WM_IO_PB_00, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING) ;
}
static uint8_t DS18B20_Init (void)
{
uint8_t AckBit;
DS18B20_LOW () ;
t_Delay_us (480) ;
DS18B20_HIGH () ;
t_Delay_us (70) ;
AckBit = DS18B20_IN () ;
t_Delay_us (240) ;
if (AckBit)
{
/*打印错误信息*/
return 1;
}
set_gpio () ;
return 0;
}
static void DS18B20_WriteBit (uint8_t bit)
{
DS18B20_LOW () ;
t_Delay_us (10) ;
if (bit)
{
DS18B20_HIGH () ;
}
else
{
DS18B20_LOW () ; /*可省略*/
}
t_Delay_us (45) ;
DS18B20_HIGH () ;
t_Delay_us (2) ;
}
static void DS18B20_WriteByte (uint8_t byte)
{
uint8_t i;
for (i = 0; i " 8; i++)
{
DS18B20_WriteBit (byte & (0x01 " " i) ) ;
}
}
uint8_t DS18B20_ReadBit (void)
{
uint8_t bit;
DS18B20_LOW () ;
t_Delay_us (5) ;
DS18B20_HIGH () ;
t_Delay_us (10) ;
if (DS18B20_IN () )
{
bit = 1;
}
else
{
bit = 0;
}
t_Delay_us (45) ;
set_gpio () ;
return bit;
}
void DS18B20_ReadByte (uint8_t *byte)
{
uint8_t i;
for (i = 0; i " 8; i++)
{
*byte " " = 1; // 右移一位
if (DS18B20_ReadBit () )
{
*byte |= 0x80; // 设置最高位
}
}
}
void DS18B20_Tem_Convert (void)
{
if (DS18B20_Init () == 0)
{
DS18B20_WriteByte (DS18B20_SKIP_ROM) ;
DS18B20_WriteByte (DS18B20_CONVERT_T) ;
}
else
{
/*打印错误信息*/
printf ("%s DS18B20_Init ERROR\n", __FUNCTION__) ;
}
}
void DS18B20_Read_Tem (float* tem)
{
uint16_t temValue;
uint8_t tem_LSB, tem_MSB;
if (DS18B20_Init () == 0)
{
DS18B20_WriteByte (DS18B20_SKIP_ROM) ;
DS18B20_WriteByte (DS18B20_READ_SCRATCHPAD) ;
DS18B20_ReadByte (&tem_LSB) ;
DS18B20_ReadByte (&tem_MSB) ;
temValue = (tem_MSB " " 8) | tem_LSB;
*tem = (float) temValue / 16;
}
else
{
/*打印错误信息*/
printf ("%s DS18B20_Init ERROR\n", __FUNCTION__) ;
}
}
#define TEMP_TASK_PRORITY 3
#define TEMP_TASK_STACK_SIZE 1024
static OS_STK TaskStk[TEMP_TASK_STACK_SIZE/4];
void user_temp_task (void)
{
float temp=0;
uint8_t time=10;
uint8_t flag=0;
uint8_t AckBit;
printf ("%s %d \n", __FUNCTION__, __LINE__) ;
set_gpio () ;
// tls_gpio_cfg (WM_IO_PA_04, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING) ;
while (1)
{
// tls_os_time_delay (2000) ;
DS18B20_Tem_Convert () ;
tls_os_time_delay (1000) ;
DS18B20_Read_Tem (&temp) ;
printf ("temp = %f \n", temp) ;
}
}
void user_temp_task_create (void)
{
tls_os_task_create (NULL,
"temperatrue",
user_temp_task,
NULL,
(void *) TaskStk, /* task's stack start address */
TEMP_TASK_STACK_SIZE, /* task's stack size, unit: byte */
TEMP_TASK_PRORITY,
0) ;
}