ZHCADK0 December   2023 MSPM0G3507

 

  1.   1
  2.   2

设计说明

该子系统演示了如何构建 CAN-UART 桥接器。CAN-UART 桥接器使器件能够在一个接口上发送或接收信息,并在另一个接口上接收或发送信息 下载此示例的代码。

图 1-1 显示了该子系统的功能图。

GUID-E8755F0C-AB07-44E8-8879-49BE40EBFCEE-low.svg图 1-1 子系统功能方框图

所需外设

此应用需要 CANFD 和 UART。

表 1-1 所需外设
子块功能 外设使用 说明
CAN 接口 (1x) CANFD 在代码中称为 MCAN0_INST
UART 接口 (1x) UART 在代码中称为 UART_0_INST

兼容器件

根据表 1-1 中的要求,该示例与表 1-2 中的器件兼容。相应的 EVM 可用于原型设计。

表 1-2 兼容器件
兼容器件 EVM
MSPM0G35xx、 LP-MSPM0G3507

设计步骤

  1. 确定 CAN 接口的基本设置,包括 CAN 模式、位时序、消息 RAM 配置等。考虑应用中哪些设置是固定的,哪些设置已更改。在示例代码中,CANFD 的仲裁速率为 250kbit/s,数据速率为 2Mbit/s。
    1. CAN-FD 外设的主要特性包括:
      1. 具有 ECC 的专用 1KB 消息 SRAM
      2. 可配置的发送 FIFO、发送队列和事件 FIFO(最多 32 个元素)
      3. 多达 32 个专用发送缓冲器和 64 个专用接收缓冲器。两个可配置的接收 FIFO(每个 FIFO 最多 64 个元素)
      4. 多达 128 个滤波器元素
    2. 如果启用 CANFD 模式:
      1. 完全支持 64 字节 CAN-FD 帧
      2. 高达 8Mbit/s 比特率
    3. 如果禁用 CANFD 模式:
      1. 完全支持 8 字节传统 CAN 帧
      2. 高达 1Mbit/s 比特率
  2. 确定 CAN 帧,包括数据长度、比特率切换、标识符和数据等。考虑应用中哪些部分是固定的,哪些部分需要更改。在示例代码中,标识符、数据长度和数据在不同帧中可能会发生变化,而其他项则固定不变。请注意,如果需要协议通信,用户需要修改代码。
    /**
     *  @brief  Structure for MCAN Rx Buffer element.
     */
    typedef struct {
        /*! Identifier */
        uint32_t id;
        /*! Remote Transmission Request
         *   0 = Received frame is a data frame
         *   1 = Received frame is a remote frame
         */
        uint32_t rtr;
        /*! Extended Identifier
         *   0 = 11-bit standard identifier
         *   1 = 29-bit extended identifier
         */
        uint32_t xtd;
        /*! Error State Indicator
         *   0 = Transmitting node is error active
         *   1 = Transmitting node is error passive
         */
        uint32_t esi;
        /*! Rx Timestamp */
        uint32_t rxts;
        /*! Data Length Code
         *   0-8  = CAN + CAN FD: received frame has 0-8 data bytes
         *   9-15 = CAN: received frame has 8 data bytes
         *   9-15 = CAN FD: received frame has 12/16/20/24/32/48/64 data bytes
         */
        uint32_t dlc;
        /*! Bit Rat Switching
         *   0 = Frame received without bit rate switching
         *   1 = Frame received with bit rate switching
         */
        uint32_t brs;
        /*! FD Format
         *   0 = Standard frame format
         *   1 = CAN FD frame format (new DLC-coding and CRC)
         */
        uint32_t fdf;
        /*! Filter Index */
        uint32_t fidx;
        /*! Accepted Non-matching Frame
         *   0 = Received frame matching filter index FIDX
         *   1 = Received frame did not match any Rx filter element
         */
        uint32_t anmf;
        /*! Data bytes.
         *   Only first dlc number of bytes are valid.
         */
        uint16_t data[DL_MCAN_MAX_PAYLOAD_BYTES];
    } DL_MCAN_RxBufElement;
  3. 确定 UART 接口的基本设置,包括 UART 模式、波特率、字长和 FIFO 等。考虑应用中哪些设置是固定的,哪些设置已更改。在示例代码中,UART 使用 9600 波特率。
    1. UART 外设的主要特性包括:
      1. 标准的异步通讯位:起始位、停止位、奇偶校验位;
      2. 完全可编程串行接口
      3. 独立的发送和接收 FIFO 支持 DAM 数据传输
      4. 支持发送和接收环回模式操作
  4. 确定 UART 帧。通常,UART 以字节为单位传输。为了实现高级别通信,用户可以通过软件实现帧通信。用户还可以根据需要引入特定的通信协议。在示例代码中,消息格式为 < 55 AA ID1 ID2 ID3 ID4 Length Data1 Data2 ...>。用户可以通过输入相同格式的数据,将数据从终端发送到 CAN 总线。55 AA 是标头。ID 区域为 4 字节。长度区域为 1 字节,表示数据长度。请注意,如果用户需要修改 UART 帧,还需要修改帧采集和解析代码。
    表 1-3 UART 帧形式
    标头 地址 数据长度 数据
    0x55 0xAA 4 字节 1 字节 (数据长度)字节
  5. 确定桥接器结构,包括需要转换哪些消息,如何转换消息等。
    1. 考虑桥接器是单向还是双向。通常每个接口都有两个功能:接收和发送。考虑是否只需要包含部分功能(如 UART 接收、CAN 发送)。在示例代码中,CAN-UART 桥接器是双向结构。
    2. 考虑要转换哪些信息以及相应的载体(变量、FIFO)。在示例代码中,标识符、数据和数据长度从一个接口转换到另一接口。代码中定义了两个 FIFO,如下所示。
      GUID-E5F146ED-303C-40E7-99B6-7601D125F2E1-low.svg 图 1-2 桥接器结构
  6. (可选)考虑优先级设计、拥塞情况、错误处理等。

设计注意事项

  1. 考虑应用中的信息流,确定各个接口需要接收或发送的信息和需要遵循的协议,并设计合适的信息传输载体来连接不同的接口。
  2. 建议先单独测试接口,然后再实现整体桥接器功能。此外,还要考虑异常情况的处理,如通讯故障、过载、帧格式错误等。
  3. 建议通过中断来实现接口功能,以确保及时通信。在示例代码中,接口功能通常在发生中断时实现,在 main() 函数中完成信息传递。

软件流程图

下面是 CAN-UART 桥接器 的代码流程图,说明了如何在一个接口中接收消息并在另一个接口中发送消息。CAN-UART 桥接器 可以分为四个独立的任务:从 UART 接收、从 CAN 接收、通过 CAN 发送、通过 UART 发送。两个 FIFO 实现双向消息传输和消息缓存。

GUID-F59F9B78-F853-4AF4-84DA-0B0A93067AFC-low.svg图 1-3 应用软件流程图

器件配置

该应用利用 TI 系统配置工具 (SysConfig) 图形界面为 CAN 和 UART 生成配置代码。使用图形界面配置器件外设可简化应用原型设计过程。

图 1-3 中所述流程的代码可在图 1-4 所示的示例代码文件中找到。

GUID-155360E2-91DF-4CDF-B34A-E7AFC0B94356-low.png图 1-4 文件结构

应用代码

以下代码片段显示了修改接口功能的位置。表中的函数被分类到不同的文件中。UART 接收和发送函数包含在 bridge_uart.c 和 bridge_uart.h 中。CAN 接收和发送函数包含在 bridge_can.c 和 bridge_can.h 中。FIFO 元素结构在 user_define.h 中定义。

用户可以通过文件轻松分离函数。例如,如果只需要 UART 函数,用户可以保留 bridge_uart.c 和 bridge_uart.h 以调用相应函数。

有关外设的基本配置,请参阅 MSPM0 SDK 和 DriverLib 文档。

表 1-4 函数和说明
任务 函数 说明 位置
UART 接收 getUartRxMsg() 获取接收到的 UART 消息

bridge_uart.c

bridge_uart.h

processUartRxMsg() 转换接收到的 UART 消息格式,并将消息存储到 gUART_RX_Element 中
UART 发送 processUartTxMsg() 转换要通过 UART 发送的 gUART_TX_Element 格式
sendUartTxMsg() 通过 UART 发送消息
CAN 接收 getCANRxMsg() 获取接收到的 CAN 消息

bridge_can.c

bridge_can.h

processCANRxMsg() 转换接收到的 CAN 消息格式,并将消息存储到 gCAN_RX_Element 中
CAN 发送 processCANTxMsg() 转换要通过 CAN 发送的 gCAN_TX_Element 格式
sendCANTxMsg() 通过 CAN 发送消息

Custom_Element 结构在 user_define.h 中定义。Custom_Element 是 FIFO 元素、UART/CAN 发送的输出元素和 UART/CAN 接收的输入元素的结构。用户可以根据需要修改结构。

typedef struct {
    /*! Identifier */
    uint32_t id;
    /*! Data Length Code*/
    uint32_t dlc;
    /*! Data bytes*/
    uint16_t data[64];
} Custom_Element;

对于 FIFO,它有 2 个全局变量。有 6 个全局变量用于跟踪 FIFO。

Custom_Element U2C_FIFO[U2C_FIFO_SIZE];
Custom_Element C2U_FIFO[C2U_FIFO_SIZE];
uint16_t U2C_in = 0;
uint16_t U2C_out = 0;
uint16_t U2C_count = 0;
uint16_t C2U_in = 0;
uint16_t C2U_out = 0;
uint16_t C2U_count = 0;

结果

通过 LaunchPad 上的 XDS110,用户可以使用 PC 在 UART 端发送和接收消息。作为演示,可以将两个 LaunchPad 用作两个 CAN-UART 桥接器以形成一个环路。当 PC 通过其中一个 LaunchPad 发送 UART 消息时,XDS110 可以从另一个 LaunchPad 接收 UART 消息。

GUID-56A4A4A2-CCEB-45EF-BB9C-CA263678A2CE-low.png图 1-5 演示
GUID-0DFB220D-52AC-467B-82DF-3A14A17C2B75-low.png图 1-6 PC 终端程序