SITL I2C 设备

SITL(循环中的软件)可模拟多种不同的 i2c 设备,包括

  • MaxSonar i2c 连接声纳

  • 各种 SMBus 电池监测器

  • LED 设备

  • 温度传感器

  • 空速传感器

  • IMU 驱动器

概述

SITL/SIM_I2C.cpp 包含总线和驱动程序的瞬时和初始化。它还包含 SITL HAL 用来与设备进行模拟 i2c 总线事务的钩子、 I2C::ioctl

SITL/SIM/I2CDevice.h 声明了 I2CDevice 类,所有模拟 I2C 驱动程序都继承自该类。I2CDevice 的一般结构如下

  • 一个 init() 方法

  • 一个 更新 方法定期调用,以模拟设备在其内部时钟上完成的任何操作

  • a rdwr 调用,当 ArduPilot 尝试进行 i2c 交易时调用该调用

i2c 设备的线上协议结构各不相同。协议形状的一些示例包括

  • SIM_Airspeed_DLVR 是这类设备的一个实现实例,它不允许 i2c 写入设备,并始终返回 4 个字节的数据。SIM_Airspeed_DLVR 就是实现这种设备的一个例子,它从不允许 i2c 写入设备,并且总是返回 4 个字节的数据。

  • SIM_MaxSonarI2CXL 可响应简单的 i2c "读取命令",在随后的 i2c 读取事务中提供读数。SIM_MaxSonarI2CXL 就是这种设备的一个例子,它响应 0x51 命令,进行测量,并允许随后读取 2 个字节来返回测量结果。

  • i2c 是一种基于寄存器的接口,ArduPilot 驱动程序在特定偏移量写入寄存器以配置设备,并通过同一接口读回数据。i2c 事务通常是一对耦合事务,一个用于指定要读取的寄存器,另一个用于模拟设备返回数据。模拟的 IS31FL3195 LED 驱动器就是一个例子,它提供了许多控制寄存器,用于设置 LED 模式和设备行为。这些 i2c 设备通常有一个 "WHOAMI "寄存器来确定设备类型。SMBus 设备也经常使用这种协议,但使用的是 16 位寄存器,而不是通常的 8 位寄存器。

选择设备样式

在实现新的模拟器时,必须注意选择正确的模拟器 "风格"。可以从几个基类继承,以防止不必要的重复。像往常一样,找到一个与你想模拟的设备类似的好例子,然后 "照着做"。要想知道协议是什么,需要研究设备的数据表。

对于严格基于寄存器的设备 I2CRegisters_8Bit (或 I2CRegisters_16Bit)基类的继承者。这样,新的模拟器就可以描述设备上的寄存器,并根据 ArduPilot 如何操作其他寄存器来简单地填充寄存器值。还可以创建具有 8 位和 16 位寄存器的模拟设备,请参见 I2CRegisters_ConfigurableLength 可配置长度

对于通过轮询启动某种测量并随后提供 16 位读数的设备 I2CCommandResponseDevice 可用于编写简单的驱动程序。

对于在进行 i2c "读取 "时仅返回固定长度读数的设备,以及任何其他尚无抽象协议的设备,您的仿真都需要实现虚拟方法 rdwr(I2C::i2c_rdwr_ioctl_data) *&data) 继承于 SITL::I2CDevice。