NXP RT1060学习总结 - fsl_flexcan CAN FD 函数说明 -1

概要

CAN测试源码:
https://download.csdn.net/download/qq_35671135/89425377

根据fsl_flexcan.h文件从文件末尾往前面梳理,总共CAN FD处理函数;
使用的是RT1064开发板进行测试。

1、中止中断驱动的消息接收进程(CAN FD)

函 数 :void FLEXCAN_TransferFDAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx);
说 明 :这个函数中止中断驱动的消息接收进程。
参 数 :base FlexCAN外设基地址
参 数 :handle FlexCAN句柄指针
参 数 :mbIdx FlexCAN FD消息缓冲区索引。
返回值:无

2、中止中断驱动的消息发送进程(CAN FD)

函 数 :void FLEXCAN_TransferFDAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx);
说 明 :这个函数终止中断驱动的消息发送进程。
参 数 :base FlexCAN外设基地址
参 数 :handle FlexCAN句柄指针
参 数 :mbIdx FlexCAN FD消息缓冲区索引。
返回值:无

3、使用IRQ接收CAN FD消息。

函 数 :status_t FLEXCAN_TransferFDReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer);
说 明 :此函数使用IRQ接收消息。这是一个非阻塞函数,它会立即返回。当消息被接收时,将调用receive回调函数
参 数 :base FlexCAN外设基地址
参 数 :handle FlexCAN句柄指针
参 数 :pMbXfer FlexCAN FD消息缓冲区传输结构。参见#flexcan_mb_transfer_t。
返回值:kStatus_Success 启动Rx Message Buffer接收进程成功。
kStatus_FLEXCAN_RxBusy Rx消息缓冲区正在使用中。

4、使用IRQ发送CAN FD消息。

函 数 :status_t FLEXCAN_TransferFDSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer);
说 明 :这个函数使用IRQ发送消息。这是一个非阻塞函数,它会立即返回。当消息发出后,send回调函数被调用。
参 数 :base FlexCAN外设基地址
参 数 :handle FlexCAN句柄指针
参 数 :pMbXfer FlexCAN FD消息缓冲区传输结构。参见#flexcan_mb_transfer_t。
返回值:kStatus_Success 启动Tx Message Buffer发送进程成功。
kStatus_Fail 写Tx消息缓冲区失败
kStatus_FLEXCAN_TxBusy Tx消息缓冲区正在使用中

5、在CAN总线上执行轮询接收事务(CAN FD)

函 数 :status_t FLEXCAN_TransferFDReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame);
说 明 :在调用此API之前不需要创建传输句柄。
参 数 :base FlexCAN外设基地址
参 数 :mbIdx FlexCAN FD消息缓冲区索引。
参 数 :pRxFrame 指向用于接收的CAN FD消息帧结构的指针。
返回值:kStatus_Success Rx消息缓冲区已满,并已成功读取。
kStatus_FLEXCAN_RxOverflow Rx消息缓冲区已经溢出,并已成功读取
kStatus_Fail Rx消息缓冲区为空。

6、在CAN总线上执行轮询发送事务(CAN FD)

函 数 :status_t FLEXCAN_TransferFDReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame);
说 明 :在调用此API之前不需要创建传输句柄。
参 数 :base FlexCAN外设基地址
参 数 :mbIdx FlexCAN FD消息缓冲区索引。
参 数 :pRxFrame 指向要发送的CAN FD消息帧的指针。
返回值:kStatus_Success 写Tx消息缓冲区成功。
kStatus_Fail Tx消息缓冲区正在使用中

7、从接收消息缓冲区中读取FlexCAN FD消息。

函 数 :status_t FLEXCAN_ReadFDRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame);
说 明 :这个函数从指定的接收消息缓冲区中读取CAN FD消息。该函数用刚刚接收到的数据填充接收CAN FD消息帧结构,并再次激活消息缓冲区。函数立即返回。
参 数 :base FlexCAN外设基地址
参 数 :mbIdx FlexCAN FD消息缓冲区索引。
参 数 :pRxFrame 指向用于接收的CAN FD消息帧结构的指针。
返回值:kStatus_Success Rx消息缓冲区已满,并已成功读取。
kStatus_FLEXCAN_RxOverflow Rx消息缓冲区已经溢出,并已成功读取
kStatus_Fail Rx消息缓冲区为空。

8、将FlexCAN FD消息写入发送消息缓冲区。

函 数 :status_t FLEXCAN_WriteFDTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_fd_frame_t *pTxFrame);
说 明 :该函数将CAN - FD消息写入指定的Transmit Message Buffer,并改变Message Buffer的状态,开始CAN - FD消息的发送。函数立即返回。
参 数 :base FlexCAN外设基地址
参 数 :mbIdx FlexCAN FD消息缓冲区索引。
参 数 :pRxFrame 指向要发送的CAN FD消息帧的指针。
返回值:kStatus_Success 写Tx消息缓冲区成功。
kStatus_Fail Tx消息缓冲区正在使用中

9、配置FlexCAN接收消息缓冲区。(CAN FD)

函 数 :void FLEXCAN_SetFDRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *pRxMbConfig, bool enable);
说 明 :这个函数清除FlexCAN内置的消息缓冲区,并将其配置为接收消息缓冲区。
参 数 :base FlexCAN外设基地址
参 数 :mbIdx FlexCAN FD消息缓冲区索引。
参 数 :pRxMbConfig 指向FlexCAN消息缓冲区配置结构的指针。
参 数 :enable Enable/disable
返回值:无

10、配置FlexCAN发送消息缓冲区。(CAN FD)

函 数 :void FLEXCAN_SetFDTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable);
说 明 :此函数终止先前的传输,清除消息缓冲区,并将其配置为传输消息缓冲区。
参 数 :base FlexCAN外设基地址
参 数 :mbIdx FlexCAN FD消息缓冲区索引。
参 数 :enable Enable/disable
返回值:无

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT1021-EVK是NXP公司推出的一款基于i.MX RT1021处理器的评估开发板,它支持多种通信接口,包括CAN和UART。CAN是一种面向实时应用的通信协议,而UART是一种异步串行通信协议。下面我们来分析一下如何将CAN通信转换为UART通信,并给出相应的代码示例。 在RT1021-EVK上,CAN通信和UART通信的实现都需要使用相应的外设模块。CAN通信需要使用FlexCAN模块,而UART通信需要使用UART模块。要将CAN通信转换为UART通信,需要通过中断的方式获取CAN数据帧,然后将数据帧转换为UART数据,发送到UART总线上。 下面是CAN转UART的代码示例,仅供参考: ```c #include "fsl_flexcan.h" #include "fsl_uart.h" #define CAN_MSG_BUF_NUM 9U #define CAN_MSG_BUF_SIZE sizeof(flexcan_frame_t) flexcan_handle_t flexcanHandle; flexcan_mb_transfer_t rxXfer; flexcan_frame_t rxFrame; uart_handle_t uartHandle; uint8_t uartTxBuffer[CAN_MSG_BUF_SIZE]; void FLEXCAN_UserRxCallback(CAN_Type *base, flexcan_handle_t *handle, uint32_t mbIdx, void *userData) { UART_SendDataBlocking(UART5, uartTxBuffer, CAN_MSG_BUF_SIZE); } int main(void) { flexcan_config_t flexcanConfig; flexcan_rx_mb_config_t mbConfig; uart_config_t uartConfig; uint32_t i; BOARD_InitPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); /* Configure the FlexCAN module */ FLEXCAN_GetDefaultConfig(&flexcanConfig); flexcanConfig.baudRate = 500000U; FLEXCAN_Init(CAN1, &flexcanConfig, CLOCK_GetFreq(kCLOCK_IpgClk)); /* Configure the FlexCAN RX message buffer */ mbConfig.format = kFLEXCAN_FrameFormatStandard; mbConfig.type = kFLEXCAN_FrameTypeData; mbConfig.id = 0x123U; FLEXCAN_SetRxMbConfig(CAN1, RX_MESSAGE_BUFFER_NUM, &mbConfig, true); /* Create the FlexCAN handle */ FLEXCAN_TransferCreateHandle(CAN1, &flexcanHandle, FLEXCAN_UserRxCallback, NULL); /* Configure the UART module */ UART_GetDefaultConfig(&uartConfig); uartConfig.baudRate_Bps = 115200U; uartConfig.enableTx = true; uartConfig.enableRx = false; UART_Init(UART5, &uartConfig, CLOCK_GetFreq(kCLOCK_IpgClk)); /* Create the UART handle */ UART_TransferCreateHandle(UART5, &uartHandle, NULL, NULL); /* Start the FlexCAN module */ FLEXCAN_Start(CAN1); while (1) { /* Wait for the FlexCAN message */ rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM; rxXfer.frame = &rxFrame; FLEXCAN_TransferReceiveNonBlocking(CAN1, &flexcanHandle, &rxXfer); /* Convert FlexCAN message to UART message */ for (i = 0; i < CAN_MSG_BUF_SIZE; i++) { uartTxBuffer[i] = ((uint8_t *)&rxFrame)[i]; } /* Send UART message */ UART_TransferSendBlocking(UART5, &uartHandle, uartTxBuffer, CAN_MSG_BUF_SIZE); } } ``` 在这个示例中,我们使用了FlexCAN模块和UART模块,其中FlexCAN用于接收CAN数据帧,UART用于发送UART数据。在主循环中,我们使用FLEXCAN_TransferReceiveNonBlocking函数FlexCAN模块中接收CAN数据帧,并将其转换为UART数据,然后使用UART_TransferSendBlocking函数将UART数据发送到UART总线上。同时,在CAN数据帧接收完成后,我们通过中断的方式调用了FLEXCAN_UserRxCallback函数,在该函数中可以进行一些额外的处理,例如打印日志或修改数据。 需要注意的是,由于CAN和UART是两种不同的通信协议,因此在转换数据时需要进行一些协议转换,例如将CAN数据帧的格式转换为UART数据的格式。此外,由于CAN和UART的数据传输速率有所不同,因此在转换数据时需要考虑数据传输的速率和延迟,以确保数据的正确性和实时性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值