0

Microchip 的 MCP23017 是一款基于 I2C 的 16 引脚 IO 扩展器。我已经能够设置设备一次(设置引脚方向和值),但之后我无法按预期更改值,除非我重置/重启设备。这是我用来初始化它并第一次设置引脚的代码:

  I2C_Start();
  I2C_Write(0x40); // 从机地址
  I2C_Write(0x00); //地址寄存器
  ...(顺序模式,因此接下来的 10 个设置为 I2C_Write(0x00);
  I2C_Write(0x08); // IOCON:HAEN=1
  I2C_Write(0x08); // IOCON:HAEN=1
  ...(顺序模式,因此接下来的 6 个设置为 I2C_Write(0x00);
  I2C_Write(0xFEu); // GPIOA
  I2C_Write(0x01u); // 通用输入输出接口
  I2C_Stop();

在此之后,我希望能够切换输出值(0xFE <-> 0x01)。我尝试了这段代码:

  I2C_Start();
  I2C_Write(0x40); // 从机地址
  I2C_Write(0x12); //地址寄存器
  I2C_Write(0x01u); // GPIOA
  I2C_Write(0xFEu); // 通用输入输出接口
  I2C_Stop();

此时似乎要出去吃午饭了,引脚的值似乎是随机的(输入与输出,输出高与低)。如果有人使用过这个 I2C IO 扩展器,请帮帮我。即使您不完全确定您也非常欢迎发表评论。注意:此处显示的 I2C API 是一个位爆炸算法,所有时钟周期都有一个近似值。它们之间的权重为 1ms。

有用的文件(种类):http ://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf

4

1 回答 1

0

尝试使用示波器或逻辑分析仪查看 SCL 和 SDA 信号,以检查您的时序和数据,以确保您向 I/O 扩展器发送您认为的值。

于 2011-10-13T14:46:13.010 回答