Skip to main content
从 Box 驱动一条 I2C 总线:发现设备、读写寄存器,以及用重复起始条件执行先写后读的事务。

句柄

方法

类型

I2cEffectiveConfig

方法参考

configure(frequency_hz: Option<u32>, pull_ups: Option<bool>) -> Result<I2cEffectiveConfig>

应用总线设置,并回读实际生效的内容。传 None 的参数保留该 Net 已保存的值;您传入的任何值都会实时应用并持久化到 Box 上
参数:

scan() -> Result<Vec<u16>>

扫描默认地址范围。
返回: 由作出应答的 7 位地址组成的 Vec<u16>,按升序排列。

scan_range(start_addr: u16, end_addr: u16) -> Result<Vec<u16>>

扫描一个显式给出的闭区间范围。

read(address: u16, num_bytes: u32) -> Result<Vec<u8>>

address 处的设备读取 num_bytes 个字节。

write(address: u16, data: &[u8]) -> Result<()>

address 处的设备写入 data

write_read(address: u16, data: &[u8], num_bytes: u32) -> Result<Vec<u8>>

在一次事务中先写后读,使用重复起始条件,而不是先停止再重新开始。多数器件上的寄存器读取都需要这样做。

示例

先看看总线上有什么,再读取一个传感器寄存器

受支持的硬件

说明

  • 地址是 7 位的。请传 0x48,而不是按读/写移位后的 8 位形式。
  • 扫描到了并不等于承诺。 扫描报告的是哪些地址对地址字节作出了应答;随后的 read() 仍然可能以 No ACK from device at 0x48 失败。在控制器内部上拉被禁用的总线上这很常见,那时信号线可以悬空到足以看起来像一次应答。请把 scan() 当作发现手段,而不是验证手段。
  • 总线事务在 Box 上、在该物理设备的锁之下运行,因此一次先写后读不会被同一设备上的另一个请求打断。
  • configure() 会持久化。您在一个测试里设置的频率,在下一个测试里仍然有效。