6 PAJ7620U2手势识别——配置手势数据寄存器

文章目录总结
前言
我们已经把所有操作寄存器配置好了 , 接下来就可以读取手势数据了 。本章教程会带领各位读者完成对手势数据寄存器的配置 , 内容比较简单 。
一、手势数据寄存器简介
【6PAJ7620U2手势识别——配置手势数据寄存器】结合官方数据手册:
我们读取0x43或者0x44寄存器内的数据 , 挥手动作将会被这两个寄存器捕捉到 , 捕捉完成后读取即可 。下面是0x43寄存器8bit数据每位置1的含义:
我们在这里读取0x43寄存器即可 , 0x44寄存器主要是执行中断操作 , 我们不使用该寄存器 , 在编写代码时检测到数据变化 , 做输出即可 。
二、配置步骤 1.突发读操作步骤图

6  PAJ7620U2手势识别——配置手势数据寄存器

文章插图
因为要进行连续捕获挥手动作 , 因此在这里必须要使用到连续读操作 。我们看第一个START状态到第一个STOP状态 , 这部分的波形图与我们配置0x00寄存器绘制的波形图类似 , 因此在原有的波形图和状态转移图上修改即可 。
2.模块状态转移图绘制
这里是确定访问0x43寄存器 , 表示将要对0x43寄存器操作 。
3.模块波形图绘制
波形图绘制结束 , 参考波形图编写代码即可 。
4.上板验证
上板抓取信号波形 , 设置上升沿为触发条件:
抓取到的信号波形如下所示:
如图所示 , 结束信号拉高 , mode自增1 , 代码验证通过 。
5.参考代码()
在上一章教程中 , 已经列出了详细的代码 , 本章教程只对模块进行修改 , 因此本章参考代码为i2c控制部分的代码 。
modulei2c_ctrl(input wiresys_clk,input wiresys_rst_n ,input wire [23:0] cfg_data ,input wirei2c_start ,input wire [5:0] reg_num,output wirescl,output regcfg_start ,output regi2c_clk,output reg[2:0] mode,inout wiresda);localparam CNT_CLK_MAX= 5'd25 ;localparam CNT_WAIT_MAX = 10'd1000;localparam CNT_DELAY_MAX = 10'd1000;localparam SLAVE_ID= 7'h73 ;localparam SENSOR_ADDR= 8'hEF ;localparam DATA_ADDR= 8'h43 ;localparam IDLE= 4'd0 ,START= 4'd1 ,SLAVE_ADDR = 4'd2 ,WAIT= 4'd3 ,STOP= 4'd4 ,ACK_1= 4'd5 ,DEVICE_ADDR = 4'd6 ,ACK_2= 4'd7 ,DATA= 4'd8 ,ACK_3= 4'd9 ,NACK= 4'd10 ;reg[4:0] cnt_clk; //分频计数器reg[9:0] cnt_wait ; //开始状态等待1000us计数器regskip_en_0 ; //唤醒状态跳转信号regskip_en_1 ; //激活bank0跳转信号regskip_en_2 ; //配置0x00寄存器状态跳转信号regskip_en_3 ; //读取0x00寄存器状态跳转信号regskip_en_4 ; //配置51个操作寄存器regskip_en_5 ; //配置0x43寄存器状态跳转信号regerror_en ; //读取出来的值不是0x20 , 错误信号reg[3:0] n_state; //次态reg[3:0] c_state; //现态 reg[1:0] cnt_i2c_clk ; //对i2c_clk分频时钟个数计数reg[2:0] cnt_bit; //对传输的8bit数据进行计数 regi2c_scl; //就是SCLregi2c_sda; //SDA赋值给i2c_sdareg[9:0] cnt_delay ; //发送完指令后等待1000us计数器regi2c_end; //i2c结束信号 reg[7:0] slave_addr ; //不同模式下7'h73+1'bxreg[7:0] device_addr ; //不同模式下寄存器地址变化reg[7:0] wr_data; //向地址写入的数据reg[7:0] rec_data ; //唤醒操作读取0x00寄存器数据寄存regack;wiresda_in;wiresda_en;assign scl= i2c_scl;assign sda_in = sda; //从设备发送到主机的数据assign sda_en = ((c_state == ACK_1)||(c_state == ACK_2)||(c_state == ACK_3)||((c_state == DATA)&&(mode == 3'd3))) ? 1'b0 : 1'b1; //主机控制sda有效assign sda= (sda_en == 1'b1) ? i2c_sda : 1'bz;always@(posedge i2c_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cfg_start