CAN 总线驱动程序实施路线图¶
支持 CAN 总线的硬件基础位于 AP_HAL 库中,由两个类组成:
CANHal 类负责表示电路板上的一个物理接口。该类管理接口的打开、设置和操作,是软件和硬件之间的主要连接点
CANManager 类封装了所有物理接口。它对接口进行枚举,提供对这些接口的访问,并为访问 UAVCAN 管理类提供连接点。
CANHAL 级¶
新类应基于 AP_HAL::CANHal 类。
该类负责管理硬件以及 RX 和 TX 队列。除此之外,还提供时间管理。
必要的方法如下:
构造函数
int init(const uint32_t bitrate, const OperatingMode mode)
以特定比特率和运行模式初始化硬件 CAN 控制器。驱动程序应尽量与指定的比特率相匹配。工作模式可以是允许发送帧的正常模式(Normal),也可以是只允许接收帧的静默模式(Silent)。该方法仅在内部的 begin() 方法中使用。
bool begin(uint32_t 比特率)
该方法应尝试以指定比特率初始化 CAN 接口。
void end()
完成 CAN 接口实例
void reset()
用以前的设置重新初始化界面
bool is_initialized()
如果 CAN 接口已成功初始化,则返回 true
int32_t 可用()
该方法应返回 RX 队列的长度。
int32_t tx_pending()
该方法返回待发送信息的数量。
bool canAcceptNewTxFrame(const uavcan::CanFrame& frame)
如果需要发送的新信息可以放入 TX 队列,则此方法返回 true。
bool isRxBufferEmpty()
方法检查 RX 队列是否为空。
uint64_t getErrorCount()
硬件故障和其他类型错误(如队列超限)的总数。如果接口未与总线连接,可能会持续增加。
uint32_t getVoluntaryTxAbortCount()
驱动程序执行库要求在第一次出错时中止传输的次数。
unsigned getRxQueueLength()
返回 RX 队列中待处理的帧数。
bool hadActivity()
返回自上次调用此方法后,此 iface 是否至少有一次成功 IO。此方法设计用于 iface 活动 LED。
int16_t send(const uavcan::CanFrame& frame, uavcan::MonotonicTime tx_deadline, uavcan::CanIOFlags flags)
该方法负责将新帧放入发送队列。该方法还提供了最长传输期限,如果期限已过,驱动程序有责任从队列中移除帧。标志可以是 "无"、"Loopback "或 "AbortOnError "的组合。
int16_t receive(uavcan::CanFrame& out_frame, uavcan::MonotonicTime& out_ts_monotonic, uavcan::UtcTime& out_ts_utc, uavcan::CanIOFlags& out_flags)
该方法会将 RX 队列中的第一条信息填入传递的引用中的所有数据。
CANManager 类¶
新类应基于 AP_HAL::CANManager 类。
必要的方法如下:
构造函数
int init(const uint32_t bitrate, const PX4CAN::OperatingMode mode, uint8_t can_number)
以特定比特率和运行模式初始化指定的 CAN 接口。该方法仅在内部由 begin() 方法使用。
bool begin(uint32_t 比特率, uint8_t can_number)
该方法应尝试以指定比特率初始化指定的 CAN 接口。
uavcan::CanSelectMasks makeSelectMasks(const uavcan::CanFrame* (&pending_tx)[uavcan::MaxCanIfaces])
此函数返回选择掩码,表明哪些接口可用于读/写。
PX4CAN* getIface(uint8_t iface_index)
返回指定接口的引用
uint8_t getNumIfaces()
返回接口数量
bool hadActivity();
自上次调用本方法后,是否至少有一个 iface 成功进行了一次 IO。此方法设计用于 iface 活动 LED。
bool is_initialized() 覆盖;
如果 CAN 管理器已成功初始化,则返回 true
void set_UAVCAN(AP_UAVCAN *uavcan)
方法存储指向 UAVCAN 实例的指针
AP_UAVCAN *get_UAVCAN(void)
方法返回与该管理器连接的 UAVCAN 实例指针