我有两个通过 I2C 连接到我的 Arduino 的 Lattice 芯片。每个 Lattice 板包含 8 个 LED。我的 Arduino 是大师。
我的目标是驱动每个板上的 LED。
到目前为止一切顺利,但存在一些错误。我通过告诉格子板开始这个过程,我正在寻址,我即将发送我希望它驱动的引脚。我现在通过发送一个设置为 10 的字节来做到这一点。在此之后,我发送我希望它以这样的字节驱动的引脚,10110111,其中索引 0 是第一个 LED,索引 1 是第二个 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;
最后我发送一个字节,一个 11,它告诉 Lattice 板它的设置并驱动连接到 8 个 LED 的引脚。
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 从机实现。
我的问题是,如果我从 Arduino 发送 drivePins 字节,第一个索引中有 1 (例如 0000110 0),那么它会吓坏并打开它不应该打开的 LED。LED 模式最终看起来像这样:11110110,来自这个 11111110。那么有人知道发生了什么吗?
在 Arduino 上,我正在使用 Wire 库。
Wire.beginTransmission(2);
Wire.write(10);
Wire.endTransmission();
Wire.beginTransmission(2);
Wire.write(~(10101011));
Wire.endTransmission();
Wire.beginTransmission(2);
Wire.write(11);
Wire.endTransmission();
传输看起来像这样。