博主最近在调试 AP3216C 三合一环境传感器,由敦南科技推出的一款传感器,支持环境光强度(ALS)、接近距离(PS)和红外线强度(IR)这三个环境参数检测。
该芯片可以通过 I2C 接口与主控制相连,并且支持中断。
AP3216C 常被用于手机、平板、导航设备等,其内置的接近传感器可以用于检测是否有物体接近,比如手机上用来检测耳朵是否接触听筒,如果检测到的话就表示正在打电话,手机就会关闭手机屏幕以省电。 也可以使用环境光传感器检测光照强度,可以实现自动背光亮度调节。
《AP3216C_Preliminary_Datasheet_Rev0.86.pdf》
ALS,PS+IR,ALS+PS+IR,PD,ALS 一次,SW Reset,PS+IR一次和ALS + PS+IR一次。
从地址0x1E
系统寄存器表
翻译如下
0X00 这个寄存器是模式控制寄存器,用来设置 AP3216C 的工作模式,一般开始先将其设置为 0X04,也就是先软件复位一次 AP3216C。
接下来根据实际使用情况选择合适的工作模式,比如设置为 0X03,也就是开启 ALS+PS+IR。
从 0X0A~0X0F 这 6 个寄存器就是数据寄存器,保存着 ALS、PS 和 IR 这三个传感器获取到的数据值。
如果同时打开 ALS、PS 和 IR ,读取间隔最少要 112.5ms,因为 AP3216C 完成一次转换需要 112.5ms。
博主用的是轮询去读数据,大家也可以配置成中断方式。
AP3216C.H
#define AP3216C_ADDR 0X1E
#define AP3216C_SYSTEMCONG 0x00
#define AP3216C_INTSTATUS 0X01
#define AP3216C_INTCLEAR 0X02
#define AP3216C_IRDATALOW 0x0A
#define AP3216C_IRDATAHIGH 0x0B
#define AP3216C_ALSDATALOW 0x0C
#define AP3216C_ALSDATAHIGH 0X0D
#define AP3216C_PSDATALOW 0X0E
#define AP3216C_PSDATAHIGH 0X0F
#define AP3216C_POWER_DOWN 0x00
#define AP3216C_ENABLE_ALL 0x03
#define AP3216C_SW_RESET 0x04
AP3216C 没有 chip id 寄存器,我们先写一个值,然后读出来,如果相等,则表示器件存在。 同时将器件初始化。
u8 AP3216C_Check_And_Init(void)
{
u8 temp;
I2C_WriteOneByte(AP3216C_ADDR,AP3216C_SYSTEMCONG,AP3216C_SW_RESET); /* SW reset */
delay_ms(50);
I2C_WriteOneByte(AP3216C_ADDR,AP3216C_SYSTEMCONG,AP3216C_ENABLE_ALL); /* enable ALS PS IR */
temp=I2C_ReadOneByte(AP3216C_ADDR,AP3216C_SYSTEMCONG);
if(temp == AP3216C_ENABLE_ALL)
return 0;
else
return 1;
}
读取数据
for(i = 0; i < 6; i++)
{
buf[i] = I2C_ReadOneByte(AP3216C_ADDR,AP3216C_IRDATALOW + i);
}
if(buf[0] & 0X80) /* IR_OF 位为 1,则数据无效 */
ir = 0;
else
ir = ((unsigned short)buf[1] << 2) | (buf[0] & 0X03);
als = ((unsigned short)buf[3] << 8) | buf[2];/* 读取 ALS 数据 */
if(buf[4] & 0x40) /* IR_OF 位为 1,则数据无效 */
ps = 0;
else
ps = ((unsigned short)(buf[5] & 0X3F) << 4) | (buf[4] & 0X0F);
printf("ALS:%u ,PS:%u ,IR:%u \\r\\n",als,ps,ir);
读取数据过程中,IR 和 ps 需要先判断数据是否有效,若有效再输出,如注释。
全部0条评论
快来发表一下你的评论吧 !