ZHCADK0 December 2023 MSPM0G3507
该子系统演示了如何构建 CAN-UART 桥接器。CAN-UART 桥接器使器件能够在一个接口上发送或接收信息,并在另一个接口上接收或发送信息 下载此示例的代码。
图 1-1 显示了该子系统的功能图。
此应用需要 CANFD 和 UART。
子块功能 | 外设使用 | 说明 |
---|---|---|
CAN 接口 | (1x) CANFD | 在代码中称为 MCAN0_INST |
UART 接口 | (1x) UART | 在代码中称为 UART_0_INST |
/**
* @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;
标头 | 地址 | 数据长度 | 数据 |
---|---|---|---|
0x55 0xAA | 4 字节 | 1 字节 | (数据长度)字节 |
下面是 CAN-UART 桥接器 的代码流程图,说明了如何在一个接口中接收消息并在另一个接口中发送消息。CAN-UART 桥接器 可以分为四个独立的任务:从 UART 接收、从 CAN 接收、通过 CAN 发送、通过 UART 发送。两个 FIFO 实现双向消息传输和消息缓存。
该应用利用 TI 系统配置工具 (SysConfig) 图形界面为 CAN 和 UART 生成配置代码。使用图形界面配置器件外设可简化应用原型设计过程。
图 1-3 中所述流程的代码可在图 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 文档。
任务 | 函数 | 说明 | 位置 |
---|---|---|---|
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 消息。