FPGA IIC连续读写操作(Verilog)

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

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输出

       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搞IC的那些年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值