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 实例指针