2

この質問はおそらくあまりうまく説明されないでしょう。それは、自分の設計で何が起こっているのかを本当に理解していないからです。

カメラ (Terasic D5M) と通信するには I2C 通信バスを使用する必要があるため、Verilog を使用して記述しようとしました。私はマスターだけが必要です。私のロジック アナライザーでは、カメラから NACK 信号を受信し続けていることを除けば、すべて問題ないように見えます。最初は何が悪いのかわからなかったので、そのままにしておきました。

今夜、D5M 用のモジュールを備えた Altera University IP コアを使用してみました。これを自動的に初期化するように設定した後、アナライザーで何が起こっているかを見ました。トレースは、これがデバイスによって ACK を登録していることを除いて、私の I2C モジュールからの出力と同じように見えます。

私の問題は、なぜ私が承認を受けていないのか、一生わからないことです。カメラが 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 ラインの値です。これは、ACK を解放して待機するセクションです。これは私のシフト状態に組み込まれているため、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 を前に置いたと思います(これは1か月間見ていません)。

より多くのコードを共有したり、ロジック トレースを表示したりできれば幸いですが、これ以上散らかしたくありません。読んでくれてありがとう。

4

1 に答える 1

2

入力と出力を分離し、それに出力イネーブルを追加します。基本的に入出力は使用しません。アルテラ デバイスの I/O パッドは、そのような使用をサポートしていますか? (そうすべきです) もしそうなら、I/O パッドに inout の仕事をさせてください。また、I/O パッドをプッシュプルまたはワイヤードまたは弱いプルアップまたはそれらのいずれかとして定義しましたか? 場合によっては、出力が有効になっているときにプッシュプルを選択し、入力がトライステートのときに反対側がデータラインを制御できるようにすることを選択できます。

于 2011-02-21T08:10:58.610 に答える