ZHCADL9 January 2024 MSPM0G3507
该子系统演示了如何构建 CAN-SPI 桥接器。CAN-SPI 桥接器使器件能够在一个接口上发送或接收信息,并在另一个接口上接收或发送信息 下载此示例的代码。该子系统支持 SPI 在控制器模式或外设模式下运行。
图 1-1 显示了该子系统的功能图。
此应用需要 CANFD 和 SPI。
子块功能 | 外设使用 | 说明 |
---|---|---|
CAN 接口 | (1x) CANFD | 在代码中称为 MCAN0_INST |
SPI 接口 | (1 个)SPI | 在代码中称为 SPI_0_INST |
确定 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;
标头 | 地址 | 数据长度 | 数据 |
---|---|---|---|
0x55 0xAA | 4 字节 | 1 字节 | (数据长度)字节 |
下面是 CAN-SPI 桥接器 的代码流程图,说明了如何在一个接口中接收消息并在另一个接口中发送消息。CAN-SPI 桥接器 可以分为四个独立的任务:从 SPI 接收、从 CAN 接收、通过 CAN 发送、通过 SPI 发送。两个 FIFO 实现双向消息传输和消息缓存。
请注意,SPI 是一种发送和接收同步的通信方法。当控制器启动发送一个字节时,控制器期望接收一个字节。在本文的设计中,SPI RX 中断不仅用于 SPI 接收,还用于将 TX 数据填充到 SPI TX FIFO 中。如果 SPI 在控制器模式下运行,则在 SPI TX FIFO 存入数据后,SPI 通信会立即开始。如果 SPI 在外设模式下运行,则 SPI 可以等待控制器在存储数据后启动通信。在本演示中,用户可以选择 SPI 模式。
该应用利用 TI 系统配置工具 (SysConfig) 图形界面为 CAN 和 SPI 生成配置代码。使用图形界面配置器件外设可简化应用原型设计过程。
用户可以在 SysConfig 中将 SPI 配置为控制器或外设。
图 1-3 中所述流程的代码可在图 1-4 所示的示例代码文件中找到。
以下代码片段显示了修改接口功能的位置。表中的函数被分类到不同的文件中。SPI 接收和发送函数包含在 bridge_spi.c 和 bridge_spi.h 中。CAN 接收和发送函数包含在 bridge_can.c 和 bridge_can.h 中。FIFO 元素结构在 user_define.h 中定义。
用户可以通过文件轻松分离函数。例如,如果只需要 SPI 函数,用户可以保留 bridge_spi.c 和 bridge_spi.h 以调用相应函数。
有关外设的基本配置,请参阅 MSPM0 SDK 和 DriverLib 文档。
任务 | 函数 | 说明 | 位置 |
---|---|---|---|
SPI 接收 | getSpiRxMsg() | 获取接收到的 SPI 消息 | bridge_spi.c bridge_spi.h |
processSpiRxMsg() | 转换接收到的 SPI 消息格式,并存储到 gSPI_RX_Element 中 | ||
SPI 发送 | processSpiTxMsg() | 转换要通过 SPI 发送的 gSPI_TX_Element 格式 | |
sendSpiTxMsg() | 通过 SPI 发送消息 | ||
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 元素、SPI/CAN 发送的输出元素和 SPI/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 S2C_FIFO[S2C_FIFO_SIZE];
Custom_Element C2S_FIFO[C2S_FIFO_SIZE];
uint16_t S2C_in = 0;
uint16_t S2C_out = 0;
uint16_t S2C_count = 0;
uint16_t C2S_in = 0;
uint16_t C2S_out = 0;
uint16_t C2S_count = 0;
通过使用 CAN 分析仪,用户可以在 CAN 侧发送和接收消息。作为演示,可以将两个 LaunchPad 用作两个 CAN-SPI 桥接器(一个 SPI 控制器和一个 SPI 外设)以形成一个环路。当 CAN 分析仪通过控制器 LaunchPad 发送 CAN 消息时,它将从外设 LaunchPad 接收 CAN 消息。