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();
トランスミッションはこんな感じ。