我有两个Lattice芯片连接到通过I2C连接的Arduino。莱迪思板每个包含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;
最后,我发送一个字节,一个告诉莱迪思电路板的设置,它可以驱动连接到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从属here的实现。
我的问题是,如果我从Arduino发送drivePins字节,第一个索引中有一个1(例如0000110 0 ),那么它就会吓坏并开启它应该没有的LED吨。 LED模式最终看起来像这样:11110110,来自这个11111110.那么有谁知道发生了什么?
在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();
传播看起来像这样。
答案 0 :(得分:1)
问题是在bitcnt 0上运行代码。它没有更新字节中的第0个索引。我发送了一个9h位,一个ACk位,跟随我的数据字节并在收到该字节时运行代码。
答案 1 :(得分:0)
我的答案可能完全没有,因为问题中缺少了很多信息,但是在最不重要的位置引起的问题让我觉得你可能会对I2C地址产生一些困惑。您能否检查一下主人发送如下命令:
开始 - Lattice1AddressWrite(lsb == 0) - 0x0A - LedPatterSingleByte - 0x0B - 停止
多次启动或停止会改变字节的含义。
如果这不能解决您的问题,请提供主人的一些信息/伪代码。我需要一些信息将其置于上下文中。