1

我有两个通过 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();

传输看起来像这样。

4

2 回答 2

1

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

于 2012-07-31T22:48:44.977 回答
0

我的回答可能完全不正确,因为问题中缺少很多信息,但是在最低有效位引起的问题让我认为您可能对 I2C 地址有些混淆。你能检查一下主人是否发送了这样的命令:

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

有多个开始或停止将改变字节的含义。

如果这不能解决您的问题,请您提供一些信息/伪代码,大师。我需要一些信息来说明这一点。

于 2012-07-20T21:04:01.273 回答