当前位置:   article > 正文

S32K的flexcan组件使用(RxFIFO+DMA)_s32k dma

s32k dma

本文摘要:本文章介绍如何使用NXP官方软件S32KDS中的flexcan组件(RxFIFO+DMA)

开发平台:S32 Design Studio for ARM Version 2.2

SDK版本:S32_SDK_S32K1xx_RTM_3.0.0

使用芯片:S32K148

注:本文讲述CAN使用Rx FIFO功能DMA方式实现无过滤CAN报文接收,中断方式见这篇文章!

S32K的flexcan组件使用(RxFIFO+中断)_我是阿衰的博客-CSDN博客

组件例程免费下载方式在文末!!!

1. 配置CAN所使用的引脚

2. 添加flexcan组件到工程(使用多个CAN就添加多个)

3. 打开对应的flexcan配置页面

4. 根据所需进行配置(这里介绍使用RxFIFO功能DMA方式)

5.  打开如下图所示DMA配置页面

6. 配置DMA通道

7. 配置好参数后点击如下图按钮或选项即可将配置数据更新至代码

8. 在代码中加入CAN和DMA初始化的代码即可使用CAN和DMA

  1. // 自定义数据缓存结构体
  2. typedef struct {
  3. uint16_t CAN_ID;
  4. uint8_t CAN_DATA[8];
  5. }CANDataStruct;
  6. // CAN接收数据结构体
  7. CANDataStruct CANrecMsg1;
  8. CANDataStruct CANrecMsg2;
  9. // 配置RxFIFO接收必须使用该结构体声明的变量
  10. static flexcan_msgbuff_t recvMsg1;
  11. static flexcan_msgbuff_t recvMsg2;
  12. // DMA初始化 放在CAN初始化之前
  13. void DMA_Init(void)
  14. {
  15. EDMA_DRV_Init(&dmaController1_State, &dmaController1_InitConfig0, edmaChnStateArray, edmaChnConfigArray, EDMA_CONFIGURED_CHANNELS_COUNT);
  16. }
  17. // CAN0初始化
  18. void CAN0_Init(void)
  19. {
  20. FLEXCAN_DRV_Init(INST_CANCOM1, &canCom1_State, &canCom1_InitConfig0);
  21. FLEXCAN_DRV_SetRxFifoGlobalMask(INST_CANCOM1, FLEXCAN_RX_FIFO_ID_FORMAT_A, 0);
  22. FLEXCAN_DRV_InstallEventCallback(INST_CANCOM1, canRxCallback, NULL);
  23. // 开启RxFIFO接收 之后在接收中断函数中加入此函数实现不间断接收
  24. FLEXCAN_DRV_RxFifo(INST_CANCOM1, &recvMsg1);
  25. }
  26. // CAN1初始化
  27. void CAN1_Init(void)
  28. {
  29. FLEXCAN_DRV_Init(INST_CANCOM2, &canCom2_State, &canCom2_InitConfig0);
  30. FLEXCAN_DRV_SetRxFifoGlobalMask(INST_CANCOM2, FLEXCAN_RX_FIFO_ID_FORMAT_A, 0);
  31. FLEXCAN_DRV_InstallEventCallback(INST_CANCOM2, canRxCallback, NULL);
  32. FLEXCAN_DRV_RxFifo(INST_CANCOM2, &recvMsg2);
  33. }
  34. // CAN接收中断回调函数
  35. void canRxCallback(uint8_t instance, flexcan_event_type_t eventType,
  36. uint32_t buffIdx, flexcan_state_t *flexcanState)
  37. {
  38. // DMA接收完成
  39. if(eventType == FLEXCAN_EVENT_DMA_COMPLETE) {
  40. // CAN0接收
  41. if(instance == INST_CANCOM1)
  42. {
  43. CANrecMsg1.CAN_ID = recvMsg1.msgId;
  44. memcpy(CANrecMsg1.CAN_DATA, recvMsg1.data, 8);
  45. // 每次接收完成需要再设置接收,所以将此函数放在这里就可以不间断接收
  46. FLEXCAN_DRV_RxFifo(INST_CANCOM1, &recvMsg1);
  47. } // CAN1接收
  48. else if(instance == INST_CANCOM2)
  49. {
  50. CANrecMsg2.CAN_ID = recvMsg2.msgId;
  51. memcpy(CANrecMsg2.CAN_DATA, recvMsg2.data, 8);
  52. FLEXCAN_DRV_RxFifo(INST_CANCOM2, &recvMsg2);
  53. }
  54. }
  55. }

9. CAN发送使用该函数

  1. // CAN发送时要使用到的 意为 标准帧 8byte 数据帧
  2. flexcan_data_info_t can1_data_std_info = {
  3. .msg_id_type = FLEXCAN_MSG_ID_STD,
  4. .data_length = 8U,
  5. .is_remote = false
  6. };
  7. uint8_t Tx[8] = {0,0x1,0x2,0x3,0x4,0x5,0x6,0x7};
  8. // 通过 CAN0 邮箱10 以默认配置 发送 ID是0x111 数据为0,0x1,0x2,0x3,0x4,0x5,0x6,0x7的报文
  9. FLEXCAN_DRV_Send(INST_CANCOM1, 10, &can1_data_std_info, 0x111, Tx);

组件例程下载地址:

https://download.csdn.net/download/m0_50669075/85034823

S32K148更多例程和源码以及最新内容下载地址: 

nxp_s32k148_template: 使用NXP的S32KDS软件基于S32_SDK_S32K1xx_RTM_3.0.0编写的的S32K148各组件测试例程,亲测可用,带有注释,适用于S32K14X系列的芯片。 (gitee.com)

END

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/144608
推荐阅读
相关标签
  

闽ICP备14008679号