1

I2Cを介して接続されたArduinoに2つのラティスチップが接続されています。Lattice ボードには、それぞれ 8 個の LED が含まれています。私のArduinoはマスターです。

写真

私の目標は、各ボードの LED を駆動することです。

今のところうまくいっていますが、いくつかバグがあります。私はラティス ボードに、私が対処していること、ドライブさせたいピンを送信しようとしていることを伝えることからプロセスを開始します。これを行うには、今のところ 10 に設定されたバイトを送信します。これに続いて、10110111 のようなバイトでドライブしたいピンを送信します。ここで、インデックス 0 は最初の LED で、インデックス 1 は 2 番目の LED というように 8 まで続きます。

このための Verilog コード:

if(adr_match & bit_DATA & data_phase & op_write & getDrive == 1'b1) begin
    drivePins[bitcnt] <= SDAr;
    if (bitcnt == 0) begin
        getDrive = 1'b0;
    end
end

if (adr_match & bit_DATA & data_phase & op_write & (IOout == 10) & bitcnt == 0) getDrive = 1'b1;

最後に、Lattice ボードにその設定を伝え、8 つの LED に接続されたピンを駆動する 11 バイトを送信します。

if (adr_match & bit_DATA & data_phase & op_write & IOout == 11 & bitcnt == 0) begin
    led0 = drivePins[0];
    led1 = drivePins[1];
    led2 = drivePins[2];
    led3 = drivePins[3];
    led4 = drivePins[4];
    led5 = drivePins[5];
    led6 = drivePins[6];
    led7 = drivePins[7];
end

コードの残りの部分は、I2C スレーブのこの実装に基づいています

私の問題は、最初のインデックス (例: 0000110 0 ) に1 を指定して Arduino から drivePins バイトを送信すると、びっくりして、すべきではない LED をオンにすることです。LED パターンは、この 11111110 から 11110110 のようになります。

Arduino では、Wire Library を使用しています。

Wire.beginTransmission(2);
Wire.write(10);
Wire.endTransmission();

Wire.beginTransmission(2);
Wire.write(~(10101011));
Wire.endTransmission();

Wire.beginTransmission(2);
Wire.write(11);
Wire.endTransmission();

トランスミッションはこんな感じ。

4

2 に答える 2

1

問題は bitcnt 0 でコードを実行することでした。バイトの 0 番目のインデックスを更新しませんでした。データ バイトに続いて 9h ビット、ACk ビットを送信し、そのバイトを受信して​​コードを実行しました。

于 2012-07-31T22:48:44.977 に答える
0

質問から多くの情報が欠落しているため、私の答えは完全にずれている可能性がありますが、最下位ビットで発生した問題により、I2C アドレスと混乱している可能性があると思います。マスターが次のようなコマンドを送信することを確認してください。

開始 - Lattice1AddressWrite(lsb==0) - 0x0A - LedPatterSingleByte - 0x0B - 停止

複数の開始または停止があると、バイトの意味が変わります。

これで問題が解決しない場合は、マスターの情報/疑似コードを提供してください。これを文脈に入れるには、いくつかの情報が必要です。

于 2012-07-20T21:04:01.273 に答える