我司在开发一款项目,项目名称:酒精连锁装置,年用量:预计700k.
选用了TI的温湿度传感器,型号: HDC1080DMBR , DFN-6(3x3)。
目前遇到以下问题:
HDC1080,通信建立成功之后。只能读取设备ID号,读取不到温湿度值,为空,默认为零.
请帮忙看一下哪里有问题,应该怎么解决?谢谢!
以下是原理图和软件供参考
#include "dmm_hdc1080.h"
#include "dmm_function.h"
#include "dmm_gpio.h"
#include "dmm_systick.h"
#include "dmm_timer_module.h"
#include "math.h"
//******************************************************************************************//
#define IIC_DELAY 50
//******************************************************************************************//
static void iic_start(void)
{
SDA_OUT_H; delay_us(IIC_DELAY);
SCL_OUT_H; delay_us(IIC_DELAY);
SDA_OUT_L; delay_us(IIC_DELAY);
SCL_OUT_L; delay_us(IIC_DELAY);
}
//******************************************************************************************//
static void iic_stop(void)
{
SCL_OUT_L; delay_us(IIC_DELAY);
SDA_OUT_L; delay_us(IIC_DELAY);
SCL_OUT_H; delay_us(IIC_DELAY);
SDA_OUT_H; delay_us(IIC_DELAY);
}
//******************************************************************************************//
static uint8 iic_wait_ack(void)
{
uint8 ERROR_TIME=0;
SDA_OUT_H; delay_us(IIC_DELAY);
SCL_OUT_H; delay_us(IIC_DELAY);
while(SDA_IN)
{
ERROR_TIME++;
if(ERROR_TIME>250) {iic_stop();return 1;}
}
SCL_OUT_L; delay_us(IIC_DELAY);
return 0;
}
//******************************************************************************************//
static void iic_ack(void)
{
SCL_OUT_L; delay_us(IIC_DELAY);
SDA_OUT_L; delay_us(IIC_DELAY);
SCL_OUT_H; delay_us(IIC_DELAY);
SCL_OUT_L; delay_us(IIC_DELAY);
}
//******************************************************************************************//
static void iic_no_ack(void)
{
SCL_OUT_L; delay_us(IIC_DELAY);
SDA_OUT_H; delay_us(IIC_DELAY);
SCL_OUT_H; delay_us(IIC_DELAY);
SCL_OUT_L; delay_us(IIC_DELAY);
}
//******************************************************************************************//
static void iic_send_byte(uint8 txd)
{
uint8 t;
SCL_OUT_L;delay_us(IIC_DELAY);
for(t=0;t<8;t++)
{
if((txd&0x80)>>7) SDA_OUT_H;
else SDA_OUT_L;
txd<<=1; delay_us(IIC_DELAY);
SCL_OUT_H; delay_us(IIC_DELAY);
SCL_OUT_L; delay_us(IIC_DELAY);
}
}
//******************************************************************************************//
static uint8 iic_read_byte(uint8 ack)
{
uint8 i,receive=0;
SDA_OUT_H;delay_us(IIC_DELAY);
for(i=0;i<8;i++ )
{
SCL_OUT_L; delay_us(IIC_DELAY);
SCL_OUT_H; delay_us(IIC_DELAY);
receive<<=1;
if(SDA_IN) receive++;
}
if(!ack) iic_no_ack();
else iic_ack();
return receive;
}
//******************************************************************************************//
extern void HDC1080_Write_Register(u8 Addr,u16 Data)
{
unsigned char data[2];
data[0] = (uint8_t)((Data& 0xFF00) >> 8); //¸ß°ËλÊý¾Ý
data[1] = (uint8_t)(Data & 0x00FF); //µÍ°ËλÊý¾Ý
iic_start();
iic_send_byte(HDC1080_WRITE_ADDR);iic_wait_ack(); //µØַΪ10000000£¬Ð´¼Ä´æÆ÷
iic_send_byte(Addr);iic_wait_ack(); //д¼Ä´æÆ÷µØÖ·
iic_send_byte(data[0]);iic_wait_ack(); //·¢Ë͸߰ËλÊý¾Ý
iic_send_byte(data[1]);iic_wait_ack(); //·¢Ë͵ͰËλÊý¾Ý
iic_stop(); //Í£Ö¹ÐźÅ
}
//******************************************************************************************//
unsigned char HDC1080_Read_Register(unsigned char ReadAddr,unsigned char *buf,unsigned int length)
{
uint8_t i = 0;
iic_start(); //ÆðʼÐźÅ
iic_send_byte(HDC1080_WRITE_ADDR); //HDC1080É豸µØÖ·(7λÉ豸µØÖ·+W/R)
iic_wait_ack(); //²úÉúÓ¦´ð
iic_send_byte(ReadAddr); //¼Ä´æÆ÷µØÖ·
iic_wait_ack(); //²úÉúÓ¦´ð
iic_start(); //ÆðʼÐźÅ
iic_send_byte(HDC1080_READ_ADDR); //HDC1080É豸µØÖ·(7λÉ豸µØÖ·+W/R) ¶Á
iic_wait_ack(); //²úÉúÓ¦´ð
for(i = 0; i < length-1; i++)
{
buf[i] = iic_read_byte(1); //¶ÁÊý¾Ý
}
buf[i] = iic_read_byte(0); //¶ÁÊý¾Ý
iic_stop(); //Í£Ö¹ÐźÅ
return 0;
}
//******************************************************************************************//
void Read_TH_Register(unsigned char *pbuff)
{
uint8_t length = 4, i = 0; //ת»»Êý¾Ý×Ö½ÚÊý
iic_start(); //ÆðʼÐźÅ
iic_send_byte(HDC1080_WRITE_ADDR); //HDC1080É豸µØÖ·(7λÉ豸µØÖ·+W/R)
iic_wait_ack(); //²úÉúÓ¦´ð
iic_send_byte(HDC1080_TEMPERATURE_ID); //´¥·¢Ê¼þµØÖ·
iic_wait_ack(); //²úÉúÓ¦´ð
iic_stop();
delay_ms(50); //µÈ´ýת»¯
iic_start(); //ÆðʼÐźÅ
iic_send_byte(HDC1080_READ_ADDR); //HDC1080É豸µØÖ·(7λÉ豸µØÖ·+W/R) ¶Á
iic_wait_ack(); //²úÉúÓ¦´ð
for(i = 0; i < length-1; i++)
{
pbuff[i] = iic_read_byte(1); //¶ÁÊý¾Ý
}
pbuff[i] = iic_read_byte(0);
iic_stop(); //Í£Ö¹ÐźÅ
}
//******************************************************************************************//
void HDC1080_Driver_Init(void)
{
uint8_t menufacture_buf[2] = {0}, device_buf[2] = {0};
uint16_t menufacture_id = 0, device_id = 0;
HDC1080_Read_Register(HDC1080_MENUFACTURE_ID, menufacture_buf, 2);
menufacture_id = (uint16_t)(menufacture_buf[0]<<8);
menufacture_id |= menufacture_buf[1];
HDC1080_Read_Register(HDC1080_DEVICE_ID, device_buf, 2);
device_id = (uint16_t)(device_buf[0]<<8);
device_id |= device_buf[1];
if(menufacture_id==HDC1080_MENUFACTURE_ID_VALUE&&device_id==HDC1080_DEVICE_ID_VALUE)
{
printf("<-----HDC1080 Á¬½Ó³É¹¦£¡----->\r\n");
}
else
printf("<-----HDC1080 Á¬½Óʧ°Ü£¡----->\r\n");
//ÉèÖÃͬʱ²É¼¯Î¶ȺÍʪ¶È 14λ·Ö±æÂÊ Ö»Òª·¢ËÍÒ»¸ö´¥·¢ÃüÁîÎÂʪ¶È¾Í»áÁ¬Ðø×¼»»
HDC1080_Write_Register(HDC1080_CONFIG_ID, HDC1080_CONFIG_VALUE);
}
//******************************************************************************************//
void Get_HDC1080_THValue(float *temp, float *humid)
{
uint8_t buf[4] = {0};
//¶ÁÎÂʪ¶È¼Ä´æÆ÷Öµ±£´æÔÚÊý×éÖÐ
Read_TH_Register(buf);
//ζÈת»»
*temp = (float)(buf[0]<<8|buf[1]);
*temp = (*temp/pow(2,16))*165-40;
//ʪ¶Èת»»
*humid = (float)(buf[2]<<8|buf[3]);
*humid = (*humid/pow(2, 16))*100;
}
//******************************************************************************************//
.h
#ifndef _DMM_DMM_HDC1080_H_
#define _DMM_DMM_HDC1080_H_
/******************************************************************************/
#include "dmm_type.h"
/******************************************************************************/
//¼Ä´æÆ÷µØÖ·
typedef enum{
HDC1080_WRITE_ADDR = 0x80,
HDC1080_READ_ADDR = 0x81,
HDC1080_MENUFACTURE_ID = 0xfe,
HDC1080_DEVICE_ID = 0xff,
HDC1080_CONFIG_ID = 0x02,
HDC1080_TEMPERATURE_ID = 0x00,
HDC1080_HUMIDITY_ID = 0x01,
}REGISTER_ADDR;
//¼Ä´æÆ÷Öµ
typedef enum
{
HDC1080_MENUFACTURE_ID_VALUE = 0x5449,
HDC1080_DEVICE_ID_VALUE = 0x1050,
HDC1080_CONFIG_VALUE = 0x1000, //ÎÂ¶È Êª¶Èͬʱת»» 14λ·Ö±æÂÊ
}REGISTER_VALUE;
void HDC1080_Driver_Init(void);
extern void HDC1080_Write_Register(u8 Addr,u16 Data);
unsigned char HDC1080_Read_Register(unsigned char ReadAddr, unsigned char *buf, unsigned int length);
void Read_TH_Register(unsigned char *pbuff);
void Get_HDC1080_THValue(float *temp, float *humid);
/******************************************************************************/
#endif