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
调用返回的 Status
是 HAL.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
寄存器。
我正在尝试使用 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
调用返回的 Status
是 HAL.I2C.Ok
。
查看 nrf-twi.adb
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
寄存器。