首页 > 其他分享 >STM32MP157AAA开发板通过GPIO实现模拟I2C驱动获取光照,红外,接近传感器的数据

STM32MP157AAA开发板通过GPIO实现模拟I2C驱动获取光照,红外,接近传感器的数据

时间:2025-01-10 11:01:43浏览次数:3  
标签:PS STM32MP157AAA IR 开发板 GPIO byte AP3216C ALS ap3216c

实验目标:

硬件:STM32MP157AAA开发板+拓展板

管脚:拓展板光照,红外,接近传感器(AP3216C)I2C1_SCL对应核心板PF14,I2C1_SDA对应核心板PF15,可知从机地址为0X1E。

梳理:

I2C各信号下SCL与SDA的机制可查看STM32MP157AAA开发板通过GPIO实现模拟I2C驱动获取温湿度传感器数据-CSDN博客

光照,红外,接近传感器(AP3216C)的地址通过其数据手册可查,其中功能码0X00对应系统模式,共8种模式,因此定义两个enum用于配置功能码和模式

#ifndef __AP3216C_H_
#define __AP3216C_H_
#include "iic.h"
#include "delay.h"

#define AP3216C_SLAVE_ADDRESS   0X1E

enum
{
    System_Configuration ,  //Control of basic functions 
    Interrupt_Status ,      //ALS and PS interrupt status output 
    INT_Clear_Manner ,      //Auto/semi clear INT pin selector 
    IR_Data_Low = 0X0A,     //Lower byte for IR ADC channel output 
    IR_Data_High,           //Higher byte for IR ADC channel output 
    ALS_Data_Low ,          //Lower byte for ALS ADC channel output 
    ALS_Data_High ,         //Higher byte for ALS ADC channel output 
    PS_Data_Low ,           //Lower byte for PS ADC channel output 
    PS_Data_High ,          //Higher byte for PS ADC channel output
    ALS_Configuration ,     //Control of gain, conversion time of persist for ALS 
    ALS_Calibration = 0X19, //ALS window loss calibration 
    ALS_Low_Threshold7 ,    //Lower byte of ALS low threshold 
    ALS_Low_Threshold15,    // Higher byte of ALS low threshold 
    ALS_High_Threshold7 ,   //Lower byte of ALS high threshold 
    ALS_High_Threshold15,   // Higher byte of ALS high threshold 
    PS_Configuration = 0X20,    //Control of gain, integrated time and persist for PS 
    PS_LED_Driver ,         //Control of LED pulses number and driver current 
    PS_INT_Form ,           //Interrupt algorithms style select of PS 
    PS_Mean_Time ,          //PS average time selector 
    PS_LED_Waiting_Time ,   //Control PS LED waiting time 
    PS_Calibration_L = 0x28 ,   //Offset value to eliminate cross talk 
    PS_Calibration_H ,      //Offset value to eliminate cross talk 
    PS_Low_Threshold2 ,     //Lower byte of PS low threshold 
    PS_Low_Threshold10 ,    //Higher byte of PS low threshold 
    PS_High_Threshold2 ,    //Lower byte of PS high threshold 
    PS_High_Threshold10     //Higher byte of PS high threshold 
};

enum
{
    POWER_DOWN,     //000: Power down (Default) 
    ALS_ACT,       //001: ALS function active
    PS_IR_ACT,     //010: PS+IR function active 
    ALS_PS_IR_ACT, //011: ALS and PS+IR functions active
    SW_RESET,       //100: SW reset 
    ALS_ONCE,       //101: ALS function once 
    PS_IR_ONCE,     //110: PS+IR function once 
    ALS_PS_IR_ONCE  //111: ALS and PS+IR functions once
};

void ap3216c_init();        //初始化光照,红外,接近传感器(AP3216C)
short ap3216c_read_IR();    //读取红外数据
short ap3216c_read_ALS();   //读取光照数据
short ap3216c_read_PS();    //读取距离数据


#endif

初始化光照,红外,接近传感器(AP3216C)设置为ALS_ACT模式:

#include "ap3216c.h"

//初始化光照,红外,接近传感器(AP3216C)
void ap3216c_init()
{
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|0);//从机地址0X1E,W写标志=0
    i2c_wait_ack();
    i2c_write_byte(System_Configuration);   //设置传感器寄存器0X00为ALS模式
    i2c_wait_ack();
    i2c_write_byte(ALS_ACT);   //设置用户寄存器初始化
    i2c_wait_ack();
    i2c_stop();
}

读取光照数据:

//读取光照数据
short ap3216c_read_ALS()
{
    short als;
    char als1, als2;
    
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|0);//从机地址0X1E,W写标志=0
    i2c_wait_ack();
    i2c_write_byte(ALS_Data_Low);   //先读低8bits功能码0X0A
    i2c_wait_ack();
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|1);//从机地址0X1E,R读标志=1
    i2c_wait_ack();
    delay(1);
    als1 = i2c_read_byte(1);   //读取红外低8bits
    
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|0);//从机地址0X1E,W写标志=0
    i2c_wait_ack();
    i2c_write_byte(ALS_Data_High);   //再读高8bits功能码0X0B
    i2c_wait_ack();
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|1);//从机地址0X1E,R读标志=1
    i2c_wait_ack();
    als2 = i2c_read_byte(1);   //读取红外高8bits
    i2c_stop();

    als = als2<<8|als1;
    return als;
}

函数调用:

#include "iic.h"
#include "ap3216c.h"

int main()
{
	i2c_init();
	ap3216c_init();

	short als;

	while(1)
	{
		als = ap3216c_read_ALS();
		printf("als = %d\n", als);
		delay(1);
	}

	return 0;
}

ALS_ACT模式下只读取光照数据的代码运行结果:

初始化光照,红外,接近传感器(AP3216C)设置为PS_IR_ACT模式:

#include "ap3216c.h"

//初始化光照,红外,接近传感器(AP3216C)
void ap3216c_init()
{
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|0);//从机地址0X1E,W写标志=0
    i2c_wait_ack();
    i2c_write_byte(System_Configuration);   //设置传感器寄存器0X00为ALS模式
    i2c_wait_ack();
    i2c_write_byte(PS_IR_ACT);   //设置用户寄存器初始化
    i2c_wait_ack();
    i2c_stop();
}

读取IR红外数据和PS距离数据:

//读取红外数据
short ap3216c_read_IR()
{
    short ir;
    char ir1, ir2;
    
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|0);//从机地址0X1E,W写标志=0
    i2c_wait_ack();
    i2c_write_byte(IR_Data_Low);   //先读低8bits功能码0X0A
    i2c_wait_ack();
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|1);//从机地址0X1E,R读标志=1
    i2c_wait_ack();
    delay(1);
    ir1 = i2c_read_byte(1);   //读取红外低8bits
    
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|0);//从机地址0X1E,W写标志=0
    i2c_wait_ack();
    i2c_write_byte(IR_Data_High);   //再读高8bits功能码0X0B
    i2c_wait_ack();
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|1);//从机地址0X1E,R读标志=1
    i2c_wait_ack();
    ir2 = i2c_read_byte(1);   //读取红外高8bits
    i2c_stop();

    ir = ir2<<2|(ir1&0X3);
    return ir;
}

//读取距离数据
short ap3216c_read_PS()
{
    short PS;
    char PS1, PS2;
    
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|0);//从机地址0X1E,W写标志=0
    i2c_wait_ack();
    i2c_write_byte(PS_Data_Low);   //先读低8bits功能码0X0E
    i2c_wait_ack();
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|1);//从机地址0X1E,R读标志=1
    i2c_wait_ack();
    delay(1);
    PS1 = i2c_read_byte(1);   //读取红外低8bits
    
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|0);//从机地址0X1E,W写标志=0
    i2c_wait_ack();
    i2c_write_byte(PS_Data_High);   //再读高8bits功能码0X0F
    i2c_wait_ack();
    i2c_start();
    i2c_write_byte(AP3216C_SLAVE_ADDRESS<<1|1);//从机地址0X1E,R读标志=1
    i2c_wait_ack();
    PS2 = i2c_read_byte(1);   //读取红外高8bits
    i2c_stop();

    PS = ((PS2&0X3F)<<4)|(PS1&0XF);
    return PS;
}

函数调用:


#include "iic.h"
#include "ap3216c.h"

int main()
{
	i2c_init();
	ap3216c_init();

	//short als;
	short ir;
	short ps;

	while(1)
	{
		//als = ap3216c_read_ALS();
		//printf("als = %d\n", als);

		ir = ap3216c_read_IR();
		printf("ir = %d\n", ir);
		ps = ap3216c_read_PS();
		printf("ps = %d\n", ps);

		delay(1);
	}

	return 0;
}

PS_IR_ACT模式读取红外数据和距离数据的代码运行结果,从数据手册上可看出如果红外强度过大,会影响PS数据,导致PS数据失效。有一个溢出标志(IR_OF)指示PS数据,看在高红外光下是否有效。如果IR_OF设置为1,设备将强制PS对象状态为离开状态,此处暂不做深度处理。

标签:PS,STM32MP157AAA,IR,开发板,GPIO,byte,AP3216C,ALS,ap3216c
From: https://blog.csdn.net/weixin_72755055/article/details/145016011

相关文章

  • STM32MP157AAA开发板通过GPIO模拟SPI驱动通信控制数码管
    实验目标:硬件:STM32MP157AAA开发板+拓展板管脚:拓展板上数码管(M74HC595),由下图可知,数码管通过SPI与核心板通信,时钟(S)CK对应PE12、主机输出从机输入(MOSI)对应PE14、主机输入从机输出(MISO)对应PE13、从设备选择(CSN)对应PE11,由于当前电路SPI只有一个从设备,因此在硬件层面上将PE11常置为......
  • GPIO的八种工作模式(非原创)
    前言GPIO是通用输入输出端口(GeneralPurposeInputOutput)的简称,可以通过把GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。最基本的输出功能是控制引脚输出高、低电平,实现开关控制等最基本的输入功能是检测外部输入电平等。其中有八种输入输出模......
  • 【WCH蓝牙系列芯片】-基于CH592开发板—BLE_USB程序中低功耗模式下,USB设备的拔插唤醒
    -------------------------------------------------------------------------------------------------------------------------------------在CH592EVT例程中,有一个BLE_USB程序,是蓝牙与USB合用例程,通过USB模拟340设备转发蓝牙数据。在正常使用中,蓝牙和USB设备都可以一起运......
  • 【WiFi】QCA6174A根据GPIO加载不同bdwlan文件修改实现
    QCA6174ADesignedtodeliveracost-effectiveWi-Fi/Bluetoothcombosolution,theQualcomm®QCA6174ASoC(System-on-Chip)isanintegrated,single-chipsolutioninasmallformfactorformobileandconsumerelectronicsapplications.QCA6174Asupp......
  • Linux系统更换开机logo方法教程,触觉智能RK3562开发板演示
    本文介绍Linux系统更换开机logo方法教程,通用RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必......
  • 2、蓝牙打印机点灯-GPIO输出控制
    1、硬件1.1、看原理图初始状态位高电平.需要驱动PA1输出高低电平控制PA1.1.2、看手册a、系统架构图GPIOA在APB2总线上。b、RCC使能GPIOA在第2位。c、GPIO寄存器配置端口:PA1模式:通用推挽输出模式--输出0、1即可速度:50M---芯片的最高频率是72M,输出高低电平......
  • ESP32-S3-N16R8在platformio中的开发板设置
    前言platformio现有的板子库里面没有ESP32-S3-N16R8(8MBPSRAM+16MBFLASH)的开发板模型,直接强行套用,要么就是解锁不了8MBPSRAM,要么就下载后运行不起来。 一、选用esp32-s3-devkitc-1开发板先选用esp32-s3-devkitc-1作为开发板模型,点击Finish后务必耐心等待。二、下载完毕......
  • 点风扇!手把手教你控制OrangePi3B的GPIO
    直接说结果用gpiosetgpio022=1来开启风扇,gpiosetgpio022=0可以关闭风扇。(需要sudo)确定GPIO接口买了OrangePi3B来当服务器,贴了挺大的一块散热片,但是负载高的时候还是会容易卡,会有几分钟SSH都连不上。正好外壳上有个可以安装风扇的孔。淘宝上卖的比较多的是一种使用插针的......
  • GPIO引脚配置
    #include"led.h"//初始化PA8和PD2为输出口.并使能这两个口的时钟        //LEDIO初始化voidLED_Init(void){  GPIO_InitTypeDef GPIO_InitStructure;     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);  ......
  • 【迅为】一图了解OpenHarmony4.1开发资料,快速上手RK3568开发板+鸿蒙系统新玩法
    【迅为】一图了解OpenHarmony4.1开发资料,快速上手RK3568开发板+鸿蒙系统新玩法  什么是OpenHarmonyOpenHarmony是一款面向全场景的开源分布式操作系统,隶属于开放原子开源基金会。它基于传统单设备系统能力,创新性地支持多种终端形态,旨在为不同设备提供统一的操作系统底座,从而......