在列出 HDC1080温湿度传感器驱动程序核心代码 之前,请允许我先多说几句:

  1. CSDN上有关HDC1080驱动代码的高阅读量博客只有两篇,且两篇博客内都不提供代码!而是在其中附上了需要积分才能下载代码的链接。吐了。
  2. GitHub上有关HDC1080驱动代码的STM32版只有两篇。一篇代码使用STM32的HAL库写的,在I2C的使用上封装程度太高,看不到通信中的关键细节。另一篇代码使用了大量的OLED界面操作,整体代码过于冗余,并且在HDC1080的I2C驱动上写的不清晰。
  3. TI公司的HDC1080官方芯片手册,在HDC1080驱动步骤中的第二步和第三步上写的及其令人费解,以至于我花了两天不断思考这两步究竟是要做什么操作。

下面进入正文。

温湿度数据

温湿度数据通过串口助手显示结果如下,temp温度在25℃左右,humi湿度在51%RH。当我将手指放在HDC1080表面时,temp温度逐渐升高至27℃左右,而humi湿度显示为0,这可能是由于HDC1080表面探测湿度的 金色元件 被我的手指完全遮挡所导致。之后,当我将手指移出HDC1080,temp温度和humi湿度逐渐回归正常数值。

驱动代码 HDC1080.h

首先,我使用的是 STM32F103C8T6 芯片,采用 Keil 5 编程软件,通过软件 I2C 协议和HDC1080 芯片进行通信。软件I2C中,SCL = PB0,SDA = PB1。在 HDC1080.h 中我做了如下三部分定义:

  1. HDC1080 软件 I2C 的接口定义
  2. HDC1080 各寄存器地址
  3. 软件 I2C 函数和 HDC1080 相关读取函数

代码如下:

#ifndef __HDC1080_H__
#define __HDC1080_H__
#include "sys.h"// HDC1080 sensor port: PB0 - PB1
#define HDC1080_PORT    GPIOB   #define HDC1080_SCL     GPIO_Pin_0
#define HDC1080_SDA     GPIO_Pin_1  #define HDC1080_SCL_H          HDC1080_PORT->BSRR = HDC1080_SCL //set to 1
#define HDC1080_SCL_L          HDC1080_PORT->BRR  = HDC1080_SCL //reset to 0
#define HDC1080_SDA_H          HDC1080_PORT->BSRR = HDC1080_SDA
#define HDC1080_SDA_L          HDC1080_PORT->BRR  = HDC1080_SDA#define HDC1080_SCL_Status     HDC1080_PORT->IDR  & HDC1080_SCL //IDR是查看引脚电平状态
#define HDC1080_SDA_Status     HDC1080_PORT->IDR  & HDC1080_SDA// The Chip parameters we use.
#define HDC1080_TempAddress         0x00
#define HDC1080_HumiAddress         0x01
#define HDC1080_Configuration       0x02
#define HDC1080_ManufactID          0xFE
#define HDC1080_DeviceID            0xFF#define HDC1080_Write_Address       0x80
#define HDC1080_Read_Address        0x81// I2C initial
void HDC1080_I2C_GPIO_Configuration(void);void I2C4_delay(void);int  I2C4_Start(void);
void I2C4_Stop(void);void I2C4_SDA_IN(void);
void I2C4_SDA_OUT(void);static void I2C4_Ack(void);
static void I2C4_NoAck(void);
uint8_t I2C4_GetAck(void);void    I2C4_WriteByte(uint8_t Data);
uint8_t I2C4_ReadByte(uint8_t ack);int HDC1080_I2C4_WriteByte(uint8_t Reg_Addr, uint8_t Data);
int HDC1080_I2C4_WriteBuffer(uint8_t Reg_Addr, uint8_t *pBuffer, uint8_t NumByteToWrite);int HDC1080_I2C4_ReadByte(uint8_t Reg_Addr, uint8_t *Data);
int HDC1080_I2C4_ReadBuffer(uint8_t Reg_Addr, uint8_t *pBuffer, uint8_t NumByteToRead); void HDC1080_Start(void);
uint16_t HDC1080_Result(char ch);
void HDC1080_Caculate(uint16_t ut, uint16_t uh, float *rt, float *rh);#endif

驱动代码 HDC1080.c

下面介绍驱动 HDC1080 芯片的核心通信代码和逻辑,首先我们看一下 TI 公司给出的官方芯片手册中的通信过程:

对于第一步配置HDC1080的工作模式和第四步读取温湿度数据,这两步理解起来很容易。而最难以理解的是第二步和第三步,这两句话是什么意思?我们该怎么做通信?我本以为第二步和第三步是做两个独立的通信动作。但实际上,第二部和第三步合起来只是做了一个通信动作。我们来看如下通信流程图:

流程图中,“I2C写1次数据” 完成了芯片手册中提到的第一步“I2C读一次数据” 完成了芯片手册中提到的的二、三、四步。我们都知道 I2C 在读/写设备数据的过程中,需要进行主从模式的转换。也就是说,STM32 使用 I2C 读数据前,首先进行写地址操作,将自己设置为主设备,也即流程图中的Write 0x80 和 Write 0x00。完成后,再次进行写操作,也就是流程图中的Write 0x81,这里需注意0x80和0x81的含义。同时将自己的工作模式转为从设备,开始进入数据接收状态。这时候,读取主设备发送来的数据。

下面回顾一下 HDC1080 芯片手册中提到的通信过程中的2,3,4条:

  1. Trigger the measurements by executing a pointer write transaction with the address pointer set to 0x00.
  2. Wait for the measurements to complete, based on the conversion time.
  3. Read the output data。

我们发现2,3,4条通信过程,即和流程图中的“I2C读一次数据”的过程完全对应。其中第3条通信动作,Wait for the measurements to complete,是夹在“I2C读一次数据”过程之中的,也就是流程图中红色字体标注的 Wait 20ms。 搞清楚这一步,下面再向寄存器读取温湿度数据就没有问题了。

下面提供 HDC1080.c 的核心通信代码,其中最重要的代码是 HDC1080_I2C4_ReadBuffer 函数,请多注意。

/           HDC1080 Coding       //
void HDC1080_Start(void)
{/* uint8_t ManuID[2];HDC1080_I2C4_ReadBuffer(HDC1080_ManufactID,ManuID,2);//read 0x5449 is ok! */uint8_t buf[4];buf[0] = 0x10; //config temp and humibuf[1] = 0x00; //both 14 bitHDC1080_I2C4_WriteBuffer(HDC1080_Configuration,buf,2);
}uint16_t HDC1080_Result(char ch)
{uint16_t temp,humi;uint8_t buf[4];HDC1080_I2C4_ReadBuffer(HDC1080_TempAddress,buf,4);temp = buf[0] << 8;temp |= buf[1];humi = buf[2] << 8;humi |= buf[3];if (ch == 'T') //ch字符用来进行温度和湿度的选择性输出{return temp;}else if (ch == 'H'){return humi;}else{return 0;}
}void HDC1080_Caculate(uint16_t ut, uint16_t uh, float *rt, float *rh)
{//ut 和 uh 为从HDC1080中读取出的原始温湿度值,这里根据芯片手册中的公式进行转换。*rt = ut / pow(2.0, 16.0) * 165.0 - 40.0; //'C*rh = uh / pow(2.0, 16.0) * 100.0; //%RH
}int HDC1080_I2C4_ReadBuffer(uint8_t Reg_Addr, uint8_t *pBuffer, uint8_t NumByteToRead){ uint8_t i;uint8_t tag;//选择性回应AckI2C4_Start();I2C4_WriteByte(HDC1080_Write_Address);if(!I2C4_GetAck())// 有slave ack的响应{I2C4_Stop();return DISABLE;}I2C4_WriteByte(Reg_Addr); if(!I2C4_GetAck()){I2C4_Stop();return DISABLE;}delay_ms(20);//等待温湿度数据转换I2C4_Start();//更改通信模式,主机从发送变为接收I2C4_WriteByte(HDC1080_Read_Address);if(!I2C4_GetAck())// 有slave ack的响应{I2C4_Stop();return DISABLE;}for(i=0; i<NumByteToRead; i++){tag = (i == NumByteToRead-1) ? 0 : 1;pBuffer[i] = I2C4_ReadByte(tag);}I2C4_Stop(); //在这个位置统一停止return 1;
}

HDC1080 驱动程序代码(C语言版)相关推荐

  1. 餐厅管理系统代码c语言,酒店管理系统代码(C语言版)

    <酒店管理系统代码(C语言版)>由会员分享,可在线阅读,更多相关<酒店管理系统代码(C语言版)(7页珍藏版)>请在人人文库网上搜索. 1.include #include #i ...

  2. pcf8574c语言测试程序,PCF8563驱动程序(C语言版)

    //CPU:STC89C52RC 晶震:11.0592M #include 〈reg52.h> #include #include #define uchar unsigned char #de ...

  3. vs五子棋c语言代码,五子棋代码C语言版.doc

    #include #include #include #include #include struct rcd;//声明节点结构 typedef struct rcd* Record;//节点指针别名 ...

  4. 门诊挂号c语言程序代码,C语言版医院管理系统

    #include "stdio.h" #include "string.h" #include "stdlib.h" #include &q ...

  5. Mongo DB Codex Debug 代码-Python语言版-立哥开发

    Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 22:45:29) [MSC v.1916 32 bit (Intel)] on win32 Type ...

  6. 酒店管理系统的代码c语言,酒店管理系统代码C语言版.doc

    #include #include #include //房间信息结构体 struct Node { int Count; //指示该房间有多少个房客 char nameOne[20]; //房客1的 ...

  7. max7219c语言,(转)MAX7219 C语言版驱动程序

    MAX7219 C语言版驱动程序 徐丽红  王佰营 该程序已使用过,免调试. #define           byte   unsigned char //#define   N_NOP _nop ...

  8. c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...

    数据结构(C语言版)--有序表查找(折半查找)(代码版) 数据结构(C语言版)--有序表查找(折半查找)(代码版) #include #include #define ERROR 0 #define ...

  9. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  10. c语言代码大全表解释_正点原子Linux第十章C语言版LED灯实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第十章C语言版LED灯实验 第八章我们讲解了如何用汇编语 ...

最新文章

  1. UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)
  2. 放弃Windows,用国产开源替换政府办公系统!这个国家做到了
  3. 使用双重循环,输出数字金字塔
  4. LeetCode 963. 最小面积矩形 II
  5. java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener错误解决方案...
  6. 【HTML+CSS网页设计与布局 从入门到精通】第9章-选择器
  7. 圆环和环形是一样的吗_EXCEL圆环图与柱形图的组合
  8. python服务器搭建qt搭建客户端_利用PythonQT,定制服务器启动工具
  9. PN结是什么?PN结有什么特征?PN结的应用
  10. 百度热力图颜色说明_基于百度热力图的中国多中心城市分析|上海城市规划
  11. 微信小程序弹框显示自定义内容(1)
  12. 搭建FTP站点(Windows)
  13. 《生物化学与分子生物学》----绪论----听课笔记(一)
  14. 2021WSB-day2-4: Raffaele教授演示利用OpenCV和Python实现一个指纹识别系统 (含代码) part6
  15. 墨画子卿第三章第5节:飞过去的是胧月
  16. “撒旦”勒索病毒再曝4.2变种 腾讯电脑管家文档守护者可一招解密
  17. 深度推荐模型之NFM模型
  18. 计算机等级考试Python二级
  19. 吴恩达视频-第一门课第2周2.7、2.8节-计算图与使用计算图求导数
  20. 猎头职场:领导给的任务如何让自己被器重

热门文章

  1. Flutter 3.0 发布啦~快来看看有什么新功能-2022 Google I/O
  2. 戴尔服务器连接显示器无信号 键盘灯不亮,键盘灯不亮按键没反应怎么回事及解决办法...
  3. Python趣味脚本,做一个简单的抽奖刮刮卡
  4. windows10 DOS命令 小计
  5. MQTT 具备那些特征?
  6. 4.人工智能时代下的大数据
  7. 通过修改window本地hosts文件修改域名指向
  8. 云上的移动性能测试平台
  9. 时间开关的工作原理、安装方法及其应用特点
  10. 《Adaptive Unfolding Total Variation Network for Low-Light Image Enhancement》2021ICCV 弱光增强