Menu Close

I2C 主设备PHY层STOP控制Verilog程序设计

在I2C在完成相关的读写操作后,就要向设备发送STOP操作,STOP作为一个独立模块,是因为在I2c总线发生错误时,也需要发送STOP,不仅仅是正常的I2c读写结束时。STOP 信号是在SCL信号为高电平期间,SDA信号由低变高。这个部分就是控制器对设备的STOP操作。在I2C PHY层 Verilog程序结构化设计 文章中的op_cmd[1:0] = 2’b11 来实现。如图1:

I2C 主设备PHY层STOP控制Verilog程序设计

图1

1.I2C读数据部分控制器程序设计

  • 接口要求:

    • 复位信号,系统时钟,系统时钟分频(由于I2C不同速度匹配)
      • input rst,
      • input sys_clk,
      • input clk_en, clk_en_half,
    • 命令信号
      • input [1:0] op_cmd,      // 2’b11 means controller send STOP 
      • input op_cmd_en,        // op_cmd enable , sys_clk single pulse
    • I2C 总线的内部信号:由于inout信号一般只在端口使用,因此在FPGA的内部逻辑(内部模块)将会把inout(双向口)变换成input, output类型进行传递
      • input sda_i,
      • output sda_o,
      • output sda_t,
      • input scl_i,
      • output scl_o,
      • output scl_t,
    • 握手信号:op_cmd_done 操作完成、从设备应答。当op_cmd_done产生,从设备应答后(dev_ack)同时送给上层模块。op_cmd_done 保持一个sys_clk 时钟宽度。
      • output op_cmd_done, // operation finished
  • 主体程序设计

该部分程序实现的主体内容如下:初始化,在IDLE状态下检测启动请求(op_cmd = 2’b11),在SCL为高电平期间等待半个时钟周期再将SDA由低变高。在STOP之后,总线处于idle状态,即控制器和设备都不去控制SDA,SCL, SDA,SCL 都是处于高阻状态。

程序的流程图如下:

图2

  • 程序代码如下:


 

  • iic_phy 模块代码


 

  • 将设计的模块例化,并组装到 iic_engine的模块中,这样就可以使用SCl_en模块,充分利用以设计的成果,逐步组装成程序代码及接口如下:


 

  • 仿真程序设计:


 

  • 仿真结果

仿真波形如图3

图3

从图3可以看出:

1)start + dev_addr +wr。设备回ack

2)send memory addr, 设备会ack

3)restart + dev_addr +rd, 设备回ack

4)receive data, 控制器回ack

5) 。。。。

6)receive the last data ,控制器回nack

7 )send STOP command

在等待设备回ack期间,如果设备回nack, I2c总线发生错误(设备无应答)。这时,控制器需要停止总线(发送STOP),将SDA,SCL 线变为高阻。之后其他的I2c 命令才能正常执行。

 

Posted in FPGA, FPGA 教材教案, Verilog, 教材与教案, 文章