/* -----------------------------------------宏定义-----------------------------------------*/
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"
#include "PAJ7620U2_cfg.h"
/* -----------------------------------------结构体定义-------------------------------------*/
code IIC_TYPE PAJ7620U2 = {2, 0x73 << 1};
/* -----------------------------------------全局变量定义-----------------------------------*/
/* -----------------------------------------应用程序---------------------------------------*/
/*********************************************
函数名:PAJ7620U2_Write_DATA
功 能:写 地址 数据
形 参:addr 地址 dat 数据
返回值:
备 注:
作 者:薛建强
时 间:2020/03/19
**********************************************/
void PAJ7620U2_Write_DATA(const uint8_t addr, const uint8_t DATA)
{
IIC_Start(); // 启动
IIC_WriteByte(PAJ7620U2.ADDR); // 设备地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(addr); // 发送寄存器地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(DATA); // 发送数据
IIC_Wait_ACK(); // 等待数据响应
IIC_Stop(); // 停止
}
/*********************************************
函数名:PAJ7620U2_Read_DATA
功 能:读地址数据
形 参:addr--寄存器地址
返回值:
备 注:
作 者:薛建强
时 间:2020/03/19
**********************************************/
uint8_t PAJ7620U2_Read_DATA(const uint8_t addr)
{
uint8_t GET_DATA = 0;
IIC_Start(); // 启动
IIC_WriteByte(PAJ7620U2.ADDR); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(addr); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
IIC_Start(); // 启动
IIC_WriteByte(PAJ7620U2.ADDR | 1); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
GET_DATA = IIC_ReadByte(); // 获取数据
IIC_Wait_ACK(); // 等待数据响应
IIC_Stop(); // 停止
return GET_DATA;
}
/*********************************************
函数名:PAJ7620U2_get_data
功 能:读取一次寄存器值
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2019/06/11
**********************************************/
uint16_t PAJ7620U2_get_data(const uint8_t addr)
{
uint8_t i = 0;
xdata uint8_t GET_DATA[2] = {0};
IIC_Start(); // 启动
IIC_WriteByte(PAJ7620U2.ADDR); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(addr); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
IIC_Start(); // 启动
IIC_WriteByte(PAJ7620U2.ADDR | 1); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
for (i = 0; i < 2; i++)
{
if (i == 1)
{
GET_DATA[i] = IIC_ReceiveData(0);
}
else
{
GET_DATA[i] = IIC_ReceiveData(1);
}
}
IIC_Stop(); // 停止
return (uint16_t)((GET_DATA[1] << 8) | (GET_DATA[0])); //
}
/*********************************************
函数名:PAJ7620U2_CMD_WakeUp
功 能:PAJ7620唤醒
形 参:
返回值:
备 注:①唤醒命令格式就是I2C通讯的命令格式,在发送写命令后不用等待PAJ7629U2的应答,直接发送停止就可以了。
②发送完唤醒命令后,需等待大于700us的时间,然后读取PAJ7620U2的0X00寄存器,判断是否为0X20数值,若不是则继续执行步骤1继续唤醒。
直到读取0X00寄存器值为0X20,则唤醒成功。
作 者:薛建强
时 间:2020/03/19
使 用:
**********************************************/
void PAJ7620U2_CMD_WakeUp(void)
{
IIC_Start(); // 启动
IIC_WriteByte(PAJ7620U2.ADDR); // 发送地址
IIC_Stop(); // 停止
}
/*********************************************
函数名:PAJ7620U2_SelectBank
功 能:选择PAJ7620U2 BANK区域
形 参:bank-->[0,1]
返回值:
备 注:
作 者:薛建强
时 间:2020/03/19
使 用:
**********************************************/
void PAJ7620U2_SelectBank(bank_e bank)
{
switch (bank)
{
case BANK0:
PAJ7620U2_Write_DATA(PAJ_REGITER_BANK_SEL, PAJ_BANK0);
break;//BANK0寄存器区域
case BANK1:
PAJ7620U2_Write_DATA(PAJ_REGITER_BANK_SEL, PAJ_BANK1);
break;//BANK1寄存器区域
}
}
/*********************************************
函数名:PAJ7620U2_wakeup
功 能:PAJ7620U2唤醒
形 参:
返回值:
备 注:连续唤醒两次,防止一次不成功
作 者:薛建强
时 间:2020/03/19
使 用:
**********************************************/
uint8_t PAJ7620U2_wakeup(void)
{
uint8_t Data = 0x0a;
PAJ7620U2_CMD_WakeUp();//唤醒PAJ7620U2
os_wait(K_IVL, 5, 0);//5ms
PAJ7620U2_CMD_WakeUp();//唤醒PAJ7620U2
os_wait(K_IVL, 5, 0);//5ms
//return 0; //唤醒失败
PAJ7620U2_SelectBank(BANK0);//进入BANK0寄存器区域
Data = PAJ7620U2_Read_DATA(0x00);//读取状态
if (Data != 0x20) return 0; //唤醒失败
return 1;
}
/*********************************************
函数名:PAJ7620U2_Init
功 能:手势传感器初始化
形 参:
返回值:0--初始化失败 1--初始化成功
备 注:
作 者:薛建强
时 间:2020/03/19
使 用:
**********************************************/
uint8_t PAJ7620U2_Init(void)
{
uint8_t i;
uint8_t status;
IIC_Init(); // I2C初始化
status = PAJ7620U2_wakeup();//唤醒PAJ7620U2
if (!status) return 0;
PAJ7620U2_SelectBank(BANK0);//进入BANK0寄存器区域
for (i = 0; i < INIT_SIZE; i++)
{
PAJ7620U2_Write_DATA(init_Array[i][0], init_Array[i][1]); //初始化PAJ7620U2
}
PAJ7620U2_SelectBank(BANK0);//切换回BANK0寄存器区域
return 1;
}
/*********************************************
函数名:PAJ7620U2_Set_Gesture_Mode
功 能:设置为手势模式
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2020/03/19
使 用:
**********************************************/
void PAJ7620U2_Set_Gesture_Mode(void)
{
uint8_t i;
PAJ7620U2_SelectBank(BANK0);//进入BANK0寄存器区域
for (i = 0; i < GESTURE_SIZE; i++)
{
PAJ7620U2_Write_DATA(gesture_arry[i][0], gesture_arry[i][1]); //手势识别模式初始化
}
PAJ7620U2_SelectBank(BANK0);//切换回BANK0寄存器区域
}
uint8_t PAJ7620U2_Read_Gesture_State(void)
{
switch (PAJ7620U2_get_data(PAJ_GET_INT_FLAG1))
{
case GES_UP://向上
return 1;
case GES_DOWM://向下
return 2;
case GES_LEFT://向左
return 3;
case GES_RIGHT://向右
return 4;
case GES_FORWARD://向前
return 5;
case GES_BACKWARD: //向后
return 6;
case GES_CLOCKWISE://顺时针
return 7;
case GES_COUNT_CLOCKWISE://逆时针
return 8;
case GES_WAVE://挥动
return 9;
default:
return 0;
}
}
#ifndef _PAJ7620U2_H
#define _PAJ7620U2_H
/* -----------------------------------------宏定义-----------------------------------------*/
#define PAJ_REGITER_BANK_SEL 0XEF //BANK选择寄存器
#define PAJ_BANK0 0X00 //BANK0
#define PAJ_BANK1 0X01 //BANK1
//BANK0 寄存器组
#define PAJ_SUSPEND_CMD 0X03 //设置设备挂起
#define PAJ_SET_INT_FLAG1 0X41 //设置手势检测中断寄存器1
#define PAJ_SET_INT_FLAG2 0X42 //设置手势检测中断寄存器2
#define PAJ_GET_INT_FLAG1 0X43 //获取手势检测中断标志寄存器1(获取手势结果)
#define PAJ_GET_INT_FLAG2 0X44 //获取手势检测中断标志寄存器2(获取手势结果)
#define PAJ_GET_STATE 0X45 //获取手势检测工作状态
#define PAJ_SET_HIGH_THRESHOLD 0x69 //设置滞后高阀值(仅在接近检测模式下)
#define PAJ_SET_LOW_THRESEHOLD 0X6A //设置滞后低阀值
#define PAJ_GET_APPROACH_STATE 0X6B //获取接近状态 (1:PS data>= PS threshold ,0:PS data<= Low threshold)
#define PAJ_GET_GESTURE_DATA 0X6C //获取接近数据
#define PAJ_GET_OBJECT_BRIGHTNESS 0XB0 //获取被照物体亮度(最大255)
#define PAJ_GET_OBJECT_SIZE_1 0XB1 //获取被照物体大小低八位(bit7:0)(最大900)
#define PAJ_GET_OBJECT_SIZE_2 0XB2 //获取被照物体大小高四位(bit3:0)
//BANK1 寄存器组
#define PAJ_SET_PS_GAIN 0X44 //设置检测增益大小 (0:1x gain 1:2x gain)
#define PAJ_SET_IDLE_S1_STEP_0 0x67 //设置S1的响应因子
#define PAJ_SET_IDLE_S1_STEP_1 0x68
#define PAJ_SET_IDLE_S2_STEP_0 0X69 //设置S2的响应因子
#define PAJ_SET_IDLE_S2_STEP_1 0X6A
#define PAJ_SET_OP_TO_S1_STEP_0 0X6B //设置OP到S1的过度时间
#define PAJ_SET_OP_TO_S1_STEP_1 0X6C
#define PAJ_SET_S1_TO_S2_STEP_0 0X6D //设置S1到S2的过度时间
#define PAJ_SET_S1_TO_S2_STEP_1 0X6E
#define PAJ_OPERATION_ENABLE 0X72 //设置PAJ7620U2使能寄存器
//手势识别效果
#define BIT(x) 1<<(x)
#define GES_UP BIT(0) //向上
#define GES_DOWM BIT(1) //向下
#define GES_LEFT BIT(2) //向左
#define GES_RIGHT BIT(3) //向右
#define GES_FORWARD BIT(4) //向前
#define GES_BACKWARD BIT(5) //向后
#define GES_CLOCKWISE BIT(6) //顺时针
#define GES_COUNT_CLOCKWISE BIT(7) //逆时针
#define GES_WAVE BIT(8) //挥动
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"
/* -----------------------------------------结构体定义-------------------------------------*/
/* -----------------------------------------全局变量定义-----------------------------------*/
//BANK寄存器枚举
typedef enum{
BANK0 = 0, //BANK0寄存器
BANK1, //BANK1寄存器
}bank_e;
/* -----------------------------------------应用程序---------------------------------------*/
uint8_t PAJ7620U2_Init(void);
uint8_t PAJ7620U2_Read_Gesture_State(void);
void PAJ7620U2_Set_Gesture_Mode(void);
#endif
使用方法:
if (SystemReg.RunningState == 0 && SystemInit.PAJ7620U2 == 0)
{
SystemInit.PAJ7620U2 = PAJ7620U2_Init();
if (SystemInit.PAJ7620U2 == 1)
{
PAJ7620U2_Set_Gesture_Mode();
}
}
if (SystemReg.RunningState == 0 && SystemInit.PAJ7620U2 == 1)
{
State = PAJ7620U2_Read_Gesture_State(); //获取手势状态
if (State != 0)
{
printf("State:%d\r\n", (uint16_t)State);
State = 0;
}
}
IIC协议链接