#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