2

这个问题可能不会很好地解释,那是因为我真的不明白我的设计中发生了什么。

我需要使用 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 作为测试(我一个月没看过这个)。

我很乐意分享更多代码或显示我的逻辑跟踪,但我不想再把它弄乱了。谢谢阅读。

4

1 回答 1

2

我会将输入和输出分开并添加一个输出启用,基本上不使用输入输出。您的 altera 设备的 I/O 焊盘是否支持以这种方式使用?(他们应该)如果是这样,让 I/O 焊盘完成输入输出工作。您是否也将 I/O 焊盘定义为推挽式或有线或,或弱上拉或任何这些?在某些情况下,您可以选择在启用输出时让它成为推挽式,当输入时它处于三态,允许另一侧控制数据线。

于 2011-02-21T08:10:58.610 回答