BBC 上 I2C 的 Ada Micro:Bit 与 MCP23017

Ada for I2C on the BBC Micro:Bit with the MCP23017

我正在尝试使用 micro:bit (V1.5) 上的 ada I2C library with the MCP23017 IO expander 设置一个非常简单的示例,但我无法弄清楚。现在,我只想打开连接到 GPIOA 引脚的 LED。我让它在 python 中使用以下内容工作:

from microbit import i2c


while True:
    # set pins to output
    # 0x20 is the address of the MCP23017
    # the first 0x00 is the IODIRA address for setting pin direction (input/output)
    # the second 0x00 sets all the pins to be outputs
    i2c.write(0x20, bytes([0x00, 0x00]))

    # set outputs to true to turn on led
    # 0x14 is the OLATA address for outputs
    # 0xFF sets all outputs to true
    i2c.write(0x20, bytes([0x14, 0xFF]))

这是我在 ada 中的尝试:

with MicroBit.Display; use MicroBit.Display;
with MicroBit.I2C;
with HAL.I2C; use HAL.I2C;

procedure Main is
   I2C_Controller : constant HAL.I2C.Any_I2C_Port := MicroBit.I2C.Controller;
   I2C_Slave_Address : constant HAL.I2C.I2C_Address := 32;

   Pins_Out : constant I2C_Data (0 .. 1) := (0, 0);
   Outputs_On : constant I2C_Data (0 .. 1) := (20, 255);
   Status : HAL.I2C.I2C_Status;

begin
   MicroBit.I2C.Initialize;
   Display ('I');
   loop   
      I2C_Controller.Master_Transmit (Addr    => I2C_Slave_Address,
                                      Data    => Pins_Out,
                                      Status  => Status);
      I2C_Controller.Master_Transmit (Addr    => I2C_Slave_Address,
                                      Data    => Outputs_On,
                                      Status  => Status);
   end loop;
end Main;

我试图将 python 示例中的十六进制输入转换为 ada 库需要的十进制。因此 python 中的 0x20 对应于 ada 的小数点后 32 位。同样,0x00 -> 0、0x14 -> 20 和 0xFF -> 255。我一定是遗漏了什么,因为这不起作用。我显示 'I' 以确保它成功闪烁,但除此之外没有任何反应。任何帮助将不胜感激,

谢谢!

我在 2012 年有一个 MCP23017;找不到它,除了建议方法之外很难提供帮助。

数据表图3.6中的三个可设置地址线(第一页图中的引脚15、16、17)是否接地?

您没有检查 Master_Transmit 调用返回的 StatusHAL.I2C.Ok

查看 nrf-twi.adb

的第 135 行
      This.Periph.ADDRESS.ADDRESS := UInt7 (Addr / 2);

再对比图3.6,我强烈怀疑你传给Ada驱动库的芯片地址应该是16#40#。关于您指定给支持库的地址是位 1..7 还是 0..6 存在争议,即库是否希望在发送到硬件之前将其除以或乘以 2。为了进一步混淆图片,nRF51 RM 中的 Table 272 建议仅将地址的 7 位写入 ADDRESS 寄存器,并在地址位之后发送 read/write 位nRF51 硬件;而对于 STM32 系列,由我们的软件将地址位放在正确的位置(位 1 .. 7),库软件旋转 read/write 位 (0)。

这里是猜测,但看起来 Python 库将您给它的值直接写入 ADDRESS 寄存器。


this Ada Drivers Library issue