I 说明
本程式对IIC协议模块:链接,进行连续读写测试。
测试对象为AP3216C传感器,通过对其进行连续的写数据,读数据。从而完成对该传感器的初始化与使用。
学习的重点应为使用多路器+状态值 的方法,借助IIC协议模块“iic_done”信号的反馈,来完成连续读写。
II AP3216C
AP3216C是一款环境光传感器,本程式将通过IIC协议读出此传感器的两个值:
16bit的【als_data】(ALS数据的[7:0]储存在0C地址的[7:0],ALS数据的[15:8]储存在0D地址的[7:0]) 与
10bit的【ps_data】(PS数据的[3:0]储存在0E地址的[3:0],PS数据的[9:4]储存在0F地址的[5:0])
读取这两种数据之前都需要一定的【准备时间】
该传感器需要向 [00H] 地址 写入111启用ALS+PS+IR的单次模式(初始化)
III 程式说明

【AP3216C模块】控制【IIC协议模块】对AP3216C进行读写控制,读出两组数据"[15:0]als_data" 与 “[9:0]ps_data”
【数码管显示模块】用来驱动数码管的显示,【按键模块】将输入的按键转化为状态值,当按键一次按下,数码管显示als_data数据,当按键再次按下,数码管显示ps_data数据。
IV 模块分解
1顶层模块
module ap3216c_top(
//global clock
input sys_clk ,
input sys_rst_n ,
//按键输出(触摸按键,无去抖过程)
input touch_key,
//连接IIC从器件ap3216c
output scl ,
inout sda ,
//连接六位八段数码管
output [5:0] sel ,
output [7:0] seg
);
//...
wire clk ; // 1M时钟“dri_clk”引出
//...
wire i2c_exec ; // iic使能
wire [15:0] iic_inner_reg_addr ; // i2c从器件内部寄存器地址
wire i2c_done ; // i2c操作结束标志
wire read1_write0 ; // i2c读写控制
wire [ 7:0] i2c_data_r; // i2c读出数据
wire [ 7:0] i2c_data_w; // i2c写入数据
//...
wire [15:0] als_data ; // ALS的数据
wire [ 9:0] ps_data ; // PS的数据
i2c_dri(
//fpga
.clk(sys_clk) , // 输入时钟(clk_freq)
.rst_n(sys_rst_n) , // 复位信号
//addr and data
.slave_address(7'h1e), //从机地址
.iic_inner_reg_addr(iic_inner_reg_addr), //从机内部寄存器地址,若为8bit形式,直接用低八位
.i2c_w_data(i2c_data_w), //写数据端口
.i2c_r_data(i2c_data_r), //读数据端口
//select mode
.type16_type8(1'b0), //从机内部寄存器地址是否属于16bit形式(16-1/8-0)
.read1_write0(read1_write0), //读模式或写模式
//i2c interface
.i2c_exec(i2c_exec) , // IIC使能【1】
.i2c_done(i2c_done) , // 一次操作完成的标志信号
.scl(scl) , // SCL输出
.sda(sda) , // SDA输出

本文介绍了一种使用IIC协议对AP3216C环境光和接近传感器进行连续读写的硬件控制程序。重点在于利用状态机和多路器实现稳定的连续读写操作,并详细解析了模块间的交互及信号处理流程。
最低0.47元/天 解锁文章
7995

被折叠的 条评论
为什么被折叠?



