求问 关于 inout管脚相连问题
时间:10-02
整理:3721RD
点击:
现在要实现 将一个I2C分成两路同样同时的I2C。 输入记为I2C_CLK_IN, 和 I2C_SDA_IN,两路输出记为 I2C_SCL0,I2C_SDA0 和 I2C_SCL1 , I2C_SDA1. 现在先考虑写slave。
关于I2C_SCL0,1 我是这么实现的 assign I2C_SCLx = I2C_SCL_IN 这个结果没问题。
但是对于SDA有问题,我是这么实现的:
assign I2C_SDAx=(!oe)?I2c_SDA_IN:1'bz;
assign I2C_SDA_IN =(oe)?sda_out:1bz;
其中oe是在I2C发送每个byte之后设置为1.
sda_out 也在同时 sda_out <= i2c_sda0;
但是这样之后,发现I2C_SDA0 并不等於I2C_SDA_IN, 而是高电平,不知道为何
实现主要代码是这样的:
assign i2c_sda_in = (oe)?sda_out:1'bz;
assign i2c0_scl = i2c_scl_in;
assign i2c0_sda = (!oe)?1'bz:i2c_sda_in;
//
assign i2c1_scl = i2c_scl_in;
assign i2c1_sda = (!oe)?1'bz:i2c_sda_in;
//
其中 oe 是:
if(sck_rise &(data_cnt < 8))begin
reg_data_in <= {reg_data_in[6:0],sda_in};
data_cnt <= data_cnt + 1'b1;
end
else if(sck_fall &(data_cnt ==8)) begin
if ((reg_data_in == 8'h01)&(sensor_tos_rw == 2'b01))
is_config_st <= 1'b1;
else
is_config_st <= 1'b0;
oe <= 1'b1;
sda_out <= 1'b0;
data_cnt <= data_cnt+1'b1;
end
关于I2C_SCL0,1 我是这么实现的 assign I2C_SCLx = I2C_SCL_IN 这个结果没问题。
但是对于SDA有问题,我是这么实现的:
assign I2C_SDAx=(!oe)?I2c_SDA_IN:1'bz;
assign I2C_SDA_IN =(oe)?sda_out:1bz;
其中oe是在I2C发送每个byte之后设置为1.
sda_out 也在同时 sda_out <= i2c_sda0;
但是这样之后,发现I2C_SDA0 并不等於I2C_SDA_IN, 而是高电平,不知道为何
实现主要代码是这样的:
assign i2c_sda_in = (oe)?sda_out:1'bz;
assign i2c0_scl = i2c_scl_in;
assign i2c0_sda = (!oe)?1'bz:i2c_sda_in;
//
assign i2c1_scl = i2c_scl_in;
assign i2c1_sda = (!oe)?1'bz:i2c_sda_in;
//
其中 oe 是:
if(sck_rise &(data_cnt < 8))begin
reg_data_in <= {reg_data_in[6:0],sda_in};
data_cnt <= data_cnt + 1'b1;
end
else if(sck_fall &(data_cnt ==8)) begin
if ((reg_data_in == 8'h01)&(sensor_tos_rw == 2'b01))
is_config_st <= 1'b1;
else
is_config_st <= 1'b0;
oe <= 1'b1;
sda_out <= 1'b0;
data_cnt <= data_cnt+1'b1;
end
建议使用 MOS管或专用来搭建双向桥,用FPGA实现难度太大。
板子已经弄好了,现在已经无法改变了,只能用FPGA搭了
而且从时序上来讲,我觉得不应该i2c0_sda会是高电平啊。