一、AP3216简介
二、AP3216寄存器介绍
三、AP3216读写时序
一、AP3216简介
AP3216C是由敦南科技研发的一种高度集成的三合一环境传感器组件,其核心特点和应用场景概述如下:
-
特点:
-
I²C接口:AP3216C采用了I²C(Inter-Integrated Circuit)接口与微控制器(MCU)进行通信,支持高达400kHz的通信速率,使得数据传输更加高效快捷。
-
多功能工作模式:可以根据需求选择不同的工作模式,包括环境光强度(ALS)检测、接近距离(PS)检测和红外线强度(IR)检测。可以选择单一功能或同时启用多种功能。
-
内置温度补偿:芯片内部集成了温度补偿电路,可以提高传感器在不同温度环境下的测量精度和稳定性。
-
宽温度范围:AP3216C可在-30℃至+85℃的宽温度范围内正常工作,满足多种严苛环境下的应用需求。
-
高精度检测:环境光传感器具有16位分辨率,可以检测0至65535的光照强度范围;接近传感器和红外传感器则具有10位分辨率,检测范围为0至1023。
-
小型化封装:该传感器采用了超小型封装,尺寸仅为4.1mm x 2.4mm x 1.35mm,有助于产品的小型化和节省空间。
-
-
应用场景:
- 消费电子产品:AP3216C广泛应用于手机和平板电脑等便携式设备中,例如用于自动调节屏幕背光亮度(根据环境光线强度变化调整),以及在打电话时检测脸部接近的距离以实现熄屏、解锁等功能。
这款传感器的集成度高、性能优越,不仅降低了系统设计的复杂度,还提高了产品的智能化水平和用户体验。
二、AP3216寄存器介绍
AP3216C的寄存器结构和功能概览如下:
-
系统模式寄存器:用于配置AP3216C的整体工作模式,包括ALS(环境光强度)、PS(接近感应)和IR(红外强度)模块的开启与关闭,以及相关的中断使能等。
-
IR低位数据寄存器:存储红外传感器测量到的红外强度的低8位数值。
-
IR高位数据寄存器:存储红外传感器测量到的红外强度的高8位数值(如果有16位数据的话)。
-
ALS低位数据寄存器:存储环境光传感器测量到的环境光强度的低8位数值。
-
ALS高位数据寄存器:存储环境光传感器测量到的环境光强度的高8位数值(同样,如果是16位数据)。
-
PS低位数据寄存器:存储接近传感器测量到的距离信息的低8位数值。
-
PS高位数据寄存器:存储接近传感器测量到的距离信息的高2位数值(根据你给出的信息,PS似乎是10位分辨率,所以高位可能只有2位)。
-
复位时间TRST寄存器:该寄存器可能不是直接控制复位时间,但在初始化时,通过写入特定的控制字(例如0x04)可以触发软复位操作,复位后芯片通常需要一定的恢复时间(这里提到的是10ms)。
-
转换时间寄存器:
- TALS:控制环境光强度转换时间,设置 ALS 测量的更新周期,默认值可能为100ms。
- TIR:控制红外强度转换时间,设置 IR 测量的更新周期,此处提及的默认值为12.5ms。
-
数据寄存器:数据有效位通常存在于每个测量数据的寄存器中,用于表示当前读取到的数据是否有效或是否完成了新一次的测量转换。
在实际应用中,通过I²C总线与MCU通信,通过对以上寄存器进行读写操作,可以配置AP3216C的各项功能,读取实时的环境参数,并根据需要设置中断触发条件等。
三、AP3216读写时序
3.1、AP3216C寻址
AP3216C在I²C总线上使用的设备地址是7位的,固定为0x1E。在实际的I²C通信中,主设备还需在设备地址基础上附加一个数据传输方向位来形成完整的通讯地址:
-
写操作地址:当主设备想要向AP3216C写入数据时,会在设备地址0x1E的基础上左移1位(乘以2),然后在其最低位(LSB)附加一个0,形成完整的8位写操作地址,即0x3C(0x1E << 1 | 0x00)。
-
读操作地址:当主设备想要从AP3216C读取数据时,同样在设备地址0x1E的基础上左移1位,但这次在最低位附加一个1,形成完整的8位读操作地址,即0x3D(0x1E << 1 | 0x01)。
所以,在I²C通信过程中,主设备会根据是要写入数据还是读取数据,分别使用0x3C或0x3D作为通讯地址来与AP3216C交互。
3.2、写操作时序
3.3、读操作时序
四、AP3216驱动步骤
AP3216C驱动程序开发步骤详细说明如下:
-
初始化AP3216C
- 首先,调用通用的I²C接口初始化函数
iic_init()
,设置I²C通信的基本参数,如时钟频率等。 - 然后,调用专门针对AP3216C的初始化函数,这个函数通常会执行以下操作:
- 软件复位AP3216C,通常通过向特定寄存器写入特定值来实现(例如写入0x04到系统控制寄存器)。
- 根据应用需求,配置AP3216C的工作模式,例如开启环境光ALS、接近传感器PS和/或红外传感器IR的检测功能。
- 首先,调用通用的I²C接口初始化函数
-
编写AP3216C的写一个字节函数
- 函数根据I²C协议的写操作时序进行编程:
- 发送起始信号(S)
- 发送从机地址和写命令(S_A + W)
- 等待从机应答(A + R_A)
- 发送待写入的数据(R)
- 等待从机应答(A + R_C)
- 发送停止信号(P)
- 函数根据I²C协议的写操作时序进行编程:
-
编写AP3216C的读一个字节函数
- 函数根据I²C协议的读操作时序进行编程:
- 发送起始信号(S)
- 发送从机地址和写命令(S_A + W)
- 等待从机应答(A + R_A)
- 发送从机地址和读命令(S_A + R)
- 等待从机应答(A)
- 接收从AP3216C读取的数据(Sr)
- 发送非应答信号(NA)以结束数据接收
- 发送停止信号(P)
- 函数根据I²C协议的读操作时序进行编程:
-
编写AP3216C读取数据函数
- 调用步骤3中编写的读取一个字节函数,循环读取AP3216C中的各个数据寄存器(例如ALS数据、PS数据和IR数据等)。
- 对读取到的原始数据进行有效性判断,剔除无效数据或错误数据。
- 根据AP3216C的数据手册,整合读取到的字节数据,转化为有意义的环境光强度、接近距离和红外强度等传感器测量值。
请注意,上述伪代码中的"(S_A + W)“和”(S_A + R)“分别代表了在I²C协议中,将从机地址与读写操作位(0或1)结合的过程。而"A + R_A”、"A + R_C"以及"NA"则是代表了在读写过程中等待和发送应答信号的操作。在实际编程时,需要按照I²C总线规范精确控制时序。
五、编程实战
IR传感器、PS传感器、ALS传感器
IR传感器(Infrared Sensor):
IR传感器,也称为红外传感器,是一种能够检测和测量红外辐射(不可见光谱的一部分)的设备。在消费电子产品中,IR传感器常见于遥控器接收器、运动检测、体温检测和环境光抑制等方面。在手机或平板等移动设备中,IR传感器通常用于接近检测(Proximity Sensing, PS)功能,通过发射和接收红外信号来判断是否有物体接近屏幕,以便自动控制屏幕的开关或防止误触。
PS传感器(Proximity Sensor):
在移动设备领域,PS传感器就是一种特殊的IR传感器,主要用于检测附近物体的距离。这类传感器内部含有一个红外发射器和一个接收器。当物体接近设备时,发射出去的红外光被物体反射回来,接收器捕捉到反射的红外信号,通过计算反射时间和强度来判断物体与设备之间的距离。手机通话时,当用户的脸部靠近屏幕,PS传感器识别到这一动作,手机会自动关闭触摸屏功能,避免误操作。
ALS传感器(Ambient Light Sensor):
ALS传感器,即环境光传感器,也是一种利用红外技术(或更广义上的光电效应)的传感器,但它主要目的是检测环境中的可见光强度。这种传感器常用于智能手机、平板电脑等设备中,根据周围环境光线的变化自动调节屏幕的亮度,既节能又能提供舒适的视觉体验。ALS传感器实时测量环境光亮度,并据此调整背光强度,确保在不同光照条件下显示清晰且舒适。
源码
ap3216c.c
#include "./BSP/AP3216C/ap3216c.h" // AP3216C传感器驱动头文件
#include "./BSP/IIC/myiic.h" // 自定义IIC驱动头文件
#include "./SYSTEM/delay/delay.h" // 延时函数头文件
/**
* @brief 初始化AP3216C传感器
* @param 无
* @retval 0, 初始化成功;
* 1, 初始化失败;
*/
uint8_t ap3216c_init(void)
{
uint8_t temp = 0;
// 初始化IIC接口
iic_init();
// 对AP3216C执行复位操作
ap3216c_write_one_byte(0x00, 0X04); // 向0x00寄存器写入0x04进行复位
delay_ms(50); // 等待至少10ms的复位时间
// 开启ALS(环境光传感器)和PS+IR(接近+红外传感器)功能
ap3216c_write_one_byte(0x00, 0X03);
// 读取0x00寄存器验证是否设置成功
temp = ap3216c_read_one_byte(0X00);
if (temp == 0X03) // 如果读取到的值为0x03,则初始化成功
{
return 0; // 返回成功标志
}
else
{
return 1; // 返回失败标志
}
}
/**
* @brief 读取AP3216C传感器的所有数据(IR、PS和ALS)
* @note 如果同时打开了ALS、IR+PS,两次数据读取之间的时间间隔需大于112.5ms
* @param ir : 指针,用于存储IR传感器值
* @param ps : 指针,用于存储PS传感器值
* @param als : 指针,用于存储ALS传感器值
* @retval 无
*/
void ap3216c_read_data(uint16_t *ir, uint16_t *ps, uint16_t *als)
{
uint8_t buf[6];
uint8_t i;
// 循环读取AP3216C的6个字节数据(包括IR、PS和ALS的原始数据)
for (i = 0; i < 6; i++)
{
buf[i] = ap3216c_read_one_byte(0X0A + i);
}
// 解析IR传感器数据,检查数据有效性
if (buf[0] & 0X80) // IR_OF位为1,则数据无效
{
*ir = 0;
}
else
{
*ir = ((uint16_t)buf[1] << 2) | (buf[0] & 0X03); // 提取并组装有效IR数据
}
// 提取并组装有效ALS数据
*als = ((uint16_t)buf[3] << 8) | buf[2];
// 解析PS传感器数据,检查数据有效性
if (buf[4] & 0x40)
{
*ps = 0; // IR_OF位为1,则数据无效
}
else
{
*ps = ((uint16_t)(buf[5] & 0X3F) << 4) | (buf[4] & 0X0F); // 提取并组装有效PS数据
}
}
/**
* @brief 向AP3216C写入一个字节数据
* @param reg : 待写入的寄存器地址
* @param data : 要写入的数据
* @retval 0, 写入成功;
* 1, 写入失败;
*/
uint8_t ap3216c_write_one_byte(uint8_t reg, uint8_t data)
{
// 使用IIC启动信号开始通信
iic_start();
// 发送器件地址+写命令(低7位地址 + 写标志位)
iic_send_byte(AP3216C_ADDR | 0X00);
// 等待从机应答,若无应答则返回失败
if (iic_wait_ack())
{
iic_stop();
return 1;
}
// 发送待写入寄存器地址
iic_send_byte(reg);
iic_wait_ack(); // 等待应答
// 发送待写入的数据
iic_send_byte(data);
// 等待从机应答,若无应答则返回失败
if (iic_wait_ack())
{
iic_stop();
return 1;
}
// 发送停止信号结束通信
iic_stop();
// 写入成功,返回0
return 0;
}
/**
* @brief 从AP3216C读取一个字节数据
* @param reg : 待读取的寄存器地址
* @retval 读取到的数据
*/
uint8_t ap3216c_read_one_byte(uint8_t reg)
{
uint8_t res;
// 使用IIC启动信号开始通信
iic_start();
// 发送器件地址+写命令(低7位地址 + 写标志位)
iic_send_byte(AP3216C_ADDR | 0X00);
// 等待从机应答
iic_wait_ack();
// 发送待读取的寄存器地址
iic_send_byte(reg);
iic_wait_ack(); // 等待应答
// 发送启动信号,切换到读模式
iic_start();
// 发送器件地址+读命令(低7位地址 + 读标志位)
iic_send_byte(AP3216C_ADDR | 0X01);
// 等待从机应答
iic_wait_ack();
// 读取数据,并在最后一个数据位发送非应答信号(nACK)
res = iic_read_byte(0);
// 发送停止信号结束通信
iic_stop();
// 返回读取到的数据
return res;
}
ap3216c.h
#ifndef __AP3216C_H
#define __AP3216C_H
#include "./SYSTEM/sys/sys.h"
#define AP3216C_ADDR 0X3C /* AP3216C器件IIC地址(左移了一位) */
uint8_t ap3216c_init(void); // 初始化AP3216C传感器
uint8_t ap3216c_write_one_byte(uint8_t reg, uint8_t data); // 向AP3216C写入一个字节数据读取AP3216C传感器的所有数据(IR、PS和ALS)
uint8_t ap3216c_read_one_byte(uint8_t reg); // 从AP3216C读取一个字节数据
void ap3216c_read_data(uint16_t* ir, uint16_t* ps, uint16_t* als); // 读取AP3216C传感器的所有数据(IR、PS和ALS)
#endif
main.c
#include "./SYSTEM/sys/sys.h" // 系统初始化和时钟配置相关头文件
#include "./SYSTEM/usart/usart.h" // 串口通信头文件
#include "./SYSTEM/delay/delay.h" // 延时函数头文件
#include "./BSP/LED/led.h" // LED控制头文件
#include "./BSP/LCD/lcd.h" // LCD显示驱动头文件
#include "./BSP/SDRAM/sdram.h" // SDRAM外部存储器驱动头文件
#include "./USMART/usmart.h" // USMART智能调试助手头文件
#include "./BSP/AP3216C/ap3216c.h" // AP3216C环境传感器驱动头文件
int main(void)
{
uint16_t ir, als, ps; // 分别用来存放IR、PS和ALS传感器读取到的数据
// 初始化HAL库
HAL_Init();
// 设置STM32系统时钟为180MHz
sys_stm32_clock_init(360, 25, 2, 8);
// 初始化延时函数
delay_init(180);
// 初始化USART串口通信,设置波特率为115200
usart_init(115200);
// 初始化USMART智能调试助手
usmart_dev.init(90);
// 初始化LED控制
led_init();
// 初始化外部SDRAM
sdram_init();
// 初始化LCD显示
lcd_init();
// 在LCD上显示欢迎信息
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED); // STM32标识
lcd_show_string(30, 70, 200, 16, 16, "AP3216C TEST", RED); // 测试标题
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED); // 开发者信息
// 检测并初始化AP3216C环境传感器,直到成功为止
while (ap3216c_init()) // 若初始化失败则循环执行
{
// 在LCD上显示初始化失败提示
lcd_show_string(30, 130, 200, 16, 16, "AP3216C Check Failed!", RED);
delay_ms(500);
lcd_show_string(30, 130, 200, 16, 16, "Please Check! ", RED);
delay_ms(500);
// 红灯闪烁以示警告
LED0_TOGGLE();
}
// 显示AP3216C初始化成功的提示信息
lcd_show_string(30, 130, 200, 16, 16, "AP3216C Ready!", RED);
// 在LCD上预置数据显示位置
lcd_show_string(30, 160, 200, 16, 16, " IR:", RED);
lcd_show_string(30, 180, 200, 16, 16, " PS:", RED);
lcd_show_string(30, 200, 200, 16, 16, "ALS:", RED);
// 主循环,持续读取并显示AP3216C的环境数据
while (1)
{
// 读取AP3216C传感器数据
ap3216c_read_data(&ir, &ps, &als);
// 在LCD上显示IR、PS和ALS的读数
lcd_show_num(30 + 32, 160, ir, 5, 16, BLUE); // 显示IR数据
lcd_show_num(30 + 32, 180, ps, 5, 16, BLUE); // 显示PS数据
lcd_show_num(30 + 32, 200, als, 5, 16, BLUE); // 显示ALS数据
// 点亮/熄灭LED0,表示系统仍在运行
LED0_TOGGLE();
// 延时一段时间
delay_ms(120);
}
}
这段代码主要是STM32开发板上对AP3216C环境传感器的测试程序,它首先初始化各种硬件资源,接着检查并初始化AP3216C传感器,初始化成功后进入主循环,循环读取AP3216C的环境数据(红外强度IR、接近感应PS和环境光强度ALS)并在LCD上实时显示,同时LED0会周期性闪烁,表示系统正在运行。
六、总结