I2C Slave 设计文档
模块接口
sys_clk, //输入,系统时钟,大于 I2C 的 SCL 频率,可以用 125MHz
rst_n, //输入,系统复位,异步
SCL, //输入,1bit,I2C Master 只有 I2C 数据有效时才送时钟,否则为一直为
高
F_I2C_CLK_H, //输出,1ibt,本模块为从设备,不需要对外输出 I2C 时钟,恒为
高,禁止对外输出 I2C 时钟。
SDA_IN, //输入,1bit,I2C Master 送入的串行数据
SDA_OUT,//输出,1bit,本模块响应,送出的串行数据
GA //输入,5bit, 槽位号,目前是在此基础上加 1。
addr_offset //输入,1bit, slave id 的偏移量
ram_sys_clk, //输入,1bit,外部送入 ram 的时钟
ram_web, //输入,1bit 外部送入 ram 的写使能
ram_addrb, //输入,6bit 外部送入 ram 的读写地址
ram_dinb, //输入,32bit,外接送入 ram 的数据
ram_doutb //输出,32bit,RAM 送出的数据
i2c_slave_id //输出,7bit,I2C 的 ID 号
对于 V3.0 版本,由于 74LVTH125PW 的设计以及 I2C Slave 不需要对外送时钟信号,
需要将 F_I2C_CLK*置高。
目前,读写都只支持单字节操作。操作过程如下。
写时序:
第一拍 < 7'Slave Addr >, 1'W, 1'ACK
第二拍 < 8'Data Addr >, 1'ACK
第三拍 < 8'Data >, 1'ACK
读时序:
第一拍 < 7'Slave Addr >, 1'W, 1'ACK
第二拍 < 8'Data Addr >, 1'ACK
第三拍 < 7'Slave Addr >, 1'R, 1'ACK
第四拍 < 8'Data >, 1'ACK
设计注意:SCL 为高时,SDA 由高到低,表示开始;
SCL 为高时,SDA 由低到高,表示结束;
当 ACK 时,Slave 不响应,则 Master 的 Sda 就会输出高,Slave 采到这个高信号时,表
示操作结束,状态回到 IDLE。
由于有两个 I2C,且 ID 不能为 0(0 号保留),所以 ID 生成采用如下计算方法:
(~GA + 1) * 2 - addr_offset;
假设~GA 为 0,则 I2C ID 为 1,2;假设~GA 为 1,则 I2C ID 为 3,4;以此类推
评论0
最新资源