Menu Close

I2C PHY层 Verilog程序结构化设计

i2c phy 层主要是负责i2c 协议的线路上收发操作,根据i2c协议,实现START, 数据写,数据读,STOP 等功能的实现。 上层应用会发送相关命令给i2c phy 模块, phy实现具体SDA,SCL 的波形输出以满足i2c标准。根据i2c协议,可以将i2c phy 模块划分为4个基本部分。

1 i2c phy 模块结构

%title插图%num

图1

如图1所示,上层应用或者其他模块提供:

op_cmd[1:0]: 2’b00 , 表示发送START信号和i2c 设备地址 以及读写操作,设备地址和读写通过data_in 输出给phy模块

2’b01, 发送数据部分

2’b10,接收设备数据部分

2’b11,发送结束标识STOP, 包括正常包结束和错误包结束等。

op_cmd_en:标识当前的op_cmd 信号有效,每次命令op_cmd_en 保持一个系统时钟宽度。

op_cmd_done:当phy层完成上述命令相关操作, 返回一个系统时钟单脉冲宽度的信号。通知上层应用,当前操作已经完成,等待上层发送下一个命令。

dev_ack: 有phy模块产生,发送给上层模块,表示设备已经争取读到控制器发送的数据。

master_ack:由控制器产生,发送给设备, 告诉设备,控制正确读取到数据。

data_in: 控制器发出,和op_cmd_en 同时发送给phy模块,将相应的数据或者(地址 + 读写)信息发送给设备。

data_out: 有设备发出,由控制器读取,在读操作时,op_cmd_done 表示当前的data_out 有效。

clk_en: 2倍i2c 速率信号,用于phy模块产生SCL高低电平。

clk_en_half: 将clk_en 信号移相900,用于在SCL低电平期间数据变化,或者产生START,STOP 信号。

sda_o,sda_t,sda_i:分别为SDA inout  PIN 的输入,控制和输出信号。

scl_o,scl_t,scl_i:分别为SCL inout  PIN 的输入,控制和输出信号。

i2c_addr,i2c_write,i2c_read,i2c_stop模块根据需要接收上层应用发送过来的相关命令,根据不同的命令,决定哪一个模块处于工作状态,在没有被命令选中的模块,处于空闲状态。被选中的模块将产生SDA,SCL 相关波形,同时包括操作完成和错误,应答等信息。

2  I2c 协议解析

通过分析i2c协议,i2c的读写操作可以分为4个过程。所有的i2c操作,均可以通过这4中组合来完成,如图2 所示:
%title插图%num

图2

写操作:是由 00 + 01 + 01 + 。。。 01 + 11操作码组合而成。分别对应i2c_addr + i2c_write + ….  + i2c_stop 模块。

读操作:是由 00 + 01 + 00 + 10 + 10 + … 10 + 11操作码组合而成。分别对应i2c_addr + i2c_write +i2c_addr + i2c_read ….  + i2c_stop 模块。

00操作码:对应i2c_addr模块,完成START + 设备地址 + 读/写 ,并且等待设备应答,如果设备正确应答,表示操作完成没有错误;如果设备不应答,表示操作完成,设备没有响应。

01操作码:对应i2c_write模块,控制器发送数据给设备,等待设备应答,如果设备正确应答,表示操作完成没有错误;如果设备不应答,表示操作完成,设备没有响应。

10操作码:对应i2c_read模块,控制器接收设备发送过来的数据,并且应答设备,当前数据是否正确接收到。 注意,标准i2c 协议要求控制器读取最后一个数据后,发送不应答信号给设备。

11操作码:对应i2c_stop模块,标识当前包结束,如果上述命令中发现错误, 控制需要发送11操作码,终止当前包传输。

其他的i2c 传输方式, 也可以使用上述4个模块的操作组合来完成。

%title插图%num

图3

如图3 所示, 读操作也可以分为独立2个完整数据包,第一包,通知设备,控制器准备读取设备中的哪一个地址。第二包,读取指定地址下的设备中的数据。同样,这些操作也是可以通过4个基础模块i2c_addr,i2c_write,i2c_read,i2c_stop(00,01,10,11)组合完成。

有些i2c 设备没有设备地址,也是可以通过基础模块来完成的。如图4所示:

%title插图%num

图4

接下来,对这4个基础模块逐一进行分析。

 

vivado 工程代码:

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

发表回复

相关链接