11 HAL库的硬件I2C驱动SI7006和AP3216C

2024-01-02 08:44

本文主要是介绍11 HAL库的硬件I2C驱动SI7006和AP3216C,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言: 本片文章想给大家分享一下使用HAL库驱动SI7006和AP3216C, 这两款常见的芯片的手册会在文章的末尾提供给大家。

一、SI7006和AP3216C简介


  • SI7006

SI7006是一款数字湿度和温度传感器,由Silicon Labs(全称Silicon Laboratories Inc.)生产。SI7006使用了集成式微控制器和感测技术,可以准确测量环境中的温度和湿度。

SI7006的主要特点包括:

1. 温湿度测量:SI7006可以同时测量环境的温度和湿度。其温度测量范围为-40°C至+125°C,湿度测量范围为0%至100%相对湿度。

2. 高精确度:SI7006具有高精度的温湿度测量能力,其温度测量精度为±0.4°C,湿度测量精度为±3%RH。

3. 数字输出:SI7006将温湿度测量结果以数字形式输出,使用标准的I2C(Inter-Integrated Circuit)总线接口进行通信。这种数字输出形式方便了传感器与微控制器或其他数字系统的集成和数据处理。

4. 低功耗:SI7006采用低功耗设计,使其适用于电池供电或节能型应用场景。在测量时,SI7006的工作电流非常低,一般在200μA以下。

5. 低失真滤波:SI7006内置了低失真数字滤波器,可以减少测量结果的噪声和变化。

6. 温度传感器补偿:SI7006内部集成了温度传感器补偿功能,可以通过检测温度对湿度进行修正,提高测量精度。

总之,SI7006是一款高精度、数字输出的温湿度传感器,适用于多种应用场景,如气象观测、室内环境监测、自动控制系统等。它具有低功耗、高精确度和方便集成的特点,可以提供准确可靠的环境温湿度测量数据。

  • AP3216C

AP3216C是一款集成式环境光和接近传感器,由AMS(Austriamicrosystems)公司生产。AP3216C可以用于测量环境光强度和检测物体的接近距离。

AP3216C的主要特点包括:

1. 环境光测量:AP3216C可以测量环境中的光照强度。它采用红外LED发射器和光敏电阻来实现对光照强度的感测。通过调整集成电路中的工作模式和增益,能够适应不同的光照条件。

2. 接近传感器:AP3216C还内置了接近传感器,可以检测物体与传感器之间的距离。它使用红外LED发射器和接收器之间的反射光信号来判断物体的接近情况。

3. 数字输出:AP3216C的测量结果以数字形式输出,使用标准的I2C总线接口进行通信。这种数字输出形式方便了传感器与微控制器或其他数字系统的集成和数据处理。

4. 低功耗:AP3216C采用低功耗设计,适合电池供电或节能型应用场景。在测量时,AP3216C的工作电流较低,一般在100μA左右。

5. 环境适应性:AP3216C采用了自适应环境补偿技术,能够自动调整测量范围和增益,提高测量精度和稳定性。

6. 多种光照模式:AP3216C支持多种光照模式,如主动模式和待机模式,可以根据实际需求选择不同的模式进行工作。

总之,AP3216C是一款集成式环境光和接近传感器,具有测量环境光强度和检测物体接近距离的功能。它具有数字输出、低功耗和自适应环境补偿等特点,适用于各种光照环境和接近检测应用场景,如智能手机、平板电脑、智能家居等。

二、硬件接线


三、代码实现


  • 读取温湿度信息
#ifndef Si7006_H
#define Si7006_H#define Si7006_SLAVE_ADDR (0x80)     //最低位默认是主机发送
#define BUS_READ (0X01)
#define BUS_WRITE (0x00)#define READ_TEMP (0xE3)
#define READ_HUMIDITY (0xE5)
#define SI7006_RESET (0xFE)extern void Si7006_Init(void);
extern void #endif
#include "Si7006.h"extern I2C_HandleTypeDef hi2c1             //Cubemx自动帮我们生成的
void Si7006_Init(void)
{//01 初始化i2c通道HAL_I2C_Init(&hi2c1);//02 发送复位指令给Si7006Si7006_WriteByte(SI7006_RESET);//03 延时一会HAL_Delay(50);
}uint8_t Si7006_WriteByte(uint8_t data)
{uint8_t temp_buf = data;HAL_StatusTypeDef flag;//01 调用hal库的i2c发送函数将设备的地址发送出去flag = HAL_I2C_Master_Transmit(&hi2c1, Si7006_SLAVE_ADDR|BUS_WRITE, &temp_buf, sizeof(temp_buf), 300);if(flag != HAL_OK){Error_Handler();}//02 等待数据发送完成while(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);return 0;
}uint16_t Si7006_Read_HalfWord(uint8_t reg)
{uint16_t read_data = 0;HAL_StatusTypeDef flag;//01 发送从机地址和需要写的数据flag = HAL_I2C_Master_Transmit(&hi2c1, Si7006_SLAVE_ADDR|BUS_WRITE, &reg, sizeof(reg), 300);if(flag != HAL_OK){Error_Handler();}while(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);//需要改变数据的传输方向if(HAL_I2C_Master_Receive(&hi2c1, SI7006_ADDR | SI7006_R , (uint8_t*)&read_data, 2,300) != HAL_OK){Error_Handler();}return read_data;
}//进行高低字节的转换
void Real_Read_Data(uint8_t cmd)
{uint16_t data = 0, low_data = 0, high_data = 0;data = Si7006_Read_HalfWord(cmd);low_data = data & 0xff;high_data = (data >> 8) & 0xff;data = (low_data << 8) + high_data;return data;
}void read_temp_humi_test(void)
{uint16_t tem, humi;tem = Real_Read_Data(READ_TEMP);humi = Real_Read_Data(READ_HUMIDITY);//按照手册提供的公式对数据进行转换tem = ((17572*tem)/65536 - 4685);hum = (125*hum/65536 - 6);tem_1 = tem/100;tem_2 = tem%100;printf("\r hum = %d%% \n", hum);printf("\r tem = %d.%d\n", tem_1,tem_2);
}/*将printf的输出从定向到屏幕*/
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart4,(uint8_t*)&ch,1,HAL_MAX_DELAY);return ch;
}
#endif

  • 读取光照强度
/** ap3216c.h**  Created on: Dec 28, 2023*      Author: 哈西好多*/#ifndef INC_AP3216C_H_
#define INC_AP3216C_H_#include "main.h"#define AP3216_ADDR (0x3C)
#define AP3216_W (0x00)
#define AP3216_R (0x01)/**************** System Register ****************/
#define SYS_CONFIG_ADDR (0x00) // System Configuration, Default:0x00,Bits[2:0],System Mode
#define SYS_ALS_ACT (0x01) // 0x01: ALS function active
#define SYS_SW_RESET (0x04) // 0x04: SW reset
#define ALS_DATA_LOW (0x0C) // Bits[7:0](RO) ALS lower byte of ADC OUTPUT
#define ALS_DATA_HIGH (0x0D) // Bits[7:0](RO) ALS Higher byte of ADC OUTPUTextern uint8_t AP3216_Init(void);
extern uint8_t AP3216_WriteOneByte(uint8_t reg, uint8_t data);
extern uint8_t AP3216_ReadOneByte(uint8_t reg);
extern uint16_t AP3216_Read_ALS_Data();#endif

/*
I2C驱动ap216c模块读取环境的光照信息
*/
uint8_t AP3216_Init(void)
{uint8_t ret_value = 0;AP3216_WriteOneByte(SYS_CONFIG_ADDR, SYS_SW_RESET);HAL_Delay(50);AP3216_WriteOneByte(SYS_CONFIG_ADDR, SYS_ALS_ACT);HAL_Delay(50);ret_value = AP3216_ReadOneByte(SYS_CONFIG_ADDR);if(ret_value != SYS_ALS_ACT){printf("read error \n");}printf("\r I2C Configuration register: 0x%x \n", SYS_CONFIG_ADDR);printf("\r I2C Read configuration value: 0x%x \n", ret_value);return 0;
}/*往i2c总线上写一个字节的数据*/
uint8_t AP3216_WriteOneByte(uint8_t reg, uint8_t data)
{uint16_t write_data = reg | (data<<8);/*先发送高位*/if(HAL_I2C_Master_Transmit(&hi2c1, AP3216_ADDR | AP3216_W , (uint8_t*)&write_data, 2, 300) != HAL_OK){Error_Handler();}while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);return 0;
}uint8_t AP3216_ReadOneByte(uint8_t reg)
{uint8_t read_data = 0;if(HAL_I2C_Master_Transmit(&hi2c1, AP3216_ADDR | AP3216_W , (uint8_t*)&reg, 1, 300) != HAL_OK){Error_Handler();}while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);if(HAL_I2C_Master_Receive(&hi2c1, AP3216_ADDR | AP3216_R , (uint8_t*)&read_data, 1, 300) != HAL_OK){Error_Handler();}return read_data;
}uint16_t AP3216_Read_ALS_Data()
{uint8_t als_l = 0, als_h = 0;uint16_t data;als_l = AP3216_ReadOneByte(ALS_DATA_LOW);als_h = AP3216_ReadOneByte(ALS_DATA_HIGH);data = (als_h<<8) | (als_l);printf("%d\n",data);return data;
}

本文只是提供一个代码参考, 当然整体的读取数据的代码思路还是一样的, 大家读取到的数据根据自己的需求就行相应的逻辑处理。



芯片手册:

链接:https://pan.baidu.com/s/1SZMo-wfXccfckpy8beoLjw 
提取码:1234 
 

这篇关于11 HAL库的硬件I2C驱动SI7006和AP3216C的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/561928

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

STM32CubeMX和HAL库-新建项目

目录 新建项目 选择开发板  MCU图形化配置界面总览 MCU配置 新建项目 新建项目包含选择MCU创建项目、选择开发板新建项目和交叉选择MCU新建项目三部分。 1. 选择MCU创建项目 单击主菜单项File→New Project,或Home视图上的ACCESS TO MCU SELECTOR 按钮,都可以打开的New Project from a MCU/MPU对话框。

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

机器视觉硬件选型根据某项目相机镜头

一 项目总需求 1、大视野检测需求: (1)大视野: ①产品尺寸15.6寸屏幕,产品大小:350mm x 225mm; ②产品料盘尺寸大小:565mm x 425mm; ③工作距离:880mm;检测精度:500μm; 1、大视野检测需求: (1)大视野: ①产品尺寸15.6寸屏幕,产品大小:350mm x 225mm; ②产品料盘尺寸大小:565mm x 425mm; 工作距离: