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。