この質問はおそらくあまりうまく説明されないでしょう。それは、自分の設計で何が起こっているのかを本当に理解していないからです。
カメラ (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か月間見ていません)。
より多くのコードを共有したり、ロジック トレースを表示したりできれば幸いですが、これ以上散らかしたくありません。読んでくれてありがとう。