我的I2C链接有什么问题?它不应该切换LEDS

时间:2012-07-19 18:34:43

标签: verilog i2c led

我有两个Lattice芯片连接到通过I2C连接的Arduino。莱迪思板每个包含8个LED。我的Arduino是大师。

Photo

我的目标是驱动每块电路板上的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();

传播看起来像这样。

2 个答案:

答案 0 :(得分:1)

问题是在bitcnt 0上运行代码。它没有更新字节中的第0个索引。我发送了一个9h位,一个ACk位,跟随我的数据字节并在收到该字节时运行代码。

答案 1 :(得分:0)

我的答案可能完全没有,因为问题中缺少了很多信息,但是在最不重要的位置引起的问题让我觉得你可能会对I2C地址产生一些困惑。您能否检查一下主人发送如下命令:

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

多次启动或停止会改变字节的含义。

如果这不能解决您的问题,请提供主人的一些信息/伪代码。我需要一些信息将其置于上下文中。