这个问题可能不会很好地解释,那是因为我真的不明白我的设计中发生了什么。
我需要使用 I2C 通信总线与相机(Terasic D5M)通信,所以我尝试使用 Verilog 编写一个。我只需要一个大师。在我的逻辑分析仪上,一切看起来都很棒,除了我不断从相机收到 NACK 信号。最初我不知道出了什么问题,所以我把它放在一边。
今晚我尝试使用具有 D5M 模块的 Altera 大学 IP 内核。将其设置为自动初始化后,我观察了分析仪上发生的情况。跟踪看起来与我的 I2C 模块的输出相同,但这是设备注册的 ACK。
我的问题是,我一生都无法弄清楚为什么我没有得到认可。可能是我不允许相机将 sda 线拉低(scl 工作正常),但我不知道为什么会这样。
有没有人有类似的经历或知道我应该去哪里看/发帖/阅读?我会发布一些代码,但如果不是完整的,我不知道它会有多大用处。很抱歉这么含糊,但我真的很迷茫,甚至不知道我应该问什么;我想这是一个类似的效果请求。感谢您的帮助,这是 i2c 模块的输出行的一些代码。
`define HIGH 1'bZ
`define TRUE 1'b1
`define FALSE 1'b0
inout sda;
assign sda = (ena_sda)?sda_bit:`HIGH;
inout scl;
assign scl = (ena_scl)?pSCL:`HIGH;
pSCL 是以所需速率运行的时钟,sda_bit 是运行期间 sda 线的值。这是释放和等待确认的部分。这嵌入在我的转换状态中,因此是 else if 的开始。
// Data shifting complete, check for ACK
// Release the SDA line and set our bit to high Z
else if(shiftComplete == `TRUE) begin
ena_sda = `FALSE;
sda_bit = `HIGH;
if(negedge_SCL) begin
ena_sda = `TRUE;
case(i2cState)
`DATA_STATE:
begin
shiftComplete = `FALSE;
nxState = `DATA_STATE;
end
`START_STATE: nxState = `REPEAT_START_STATE;
default: nxState = `STOP_STATE;
endcase
end
end /* end ACK */
我认为释放 ena_sda 足以让相机驱动模块。我想我之前把 sda_bit = HIGH 作为测试(我一个月没看过这个)。
我很乐意分享更多代码或显示我的逻辑跟踪,但我不想再把它弄乱了。谢谢阅读。