【S32K144调试笔记】CANFIFO&DMA SDK 配置测试

目录

  • 1. PE配置
    • 1.1 添加edma模块
    • 1.2 配置edma模块
  • 1.3 配置FlexCAN
  • 2. 函数调用
    • 2.1 模块初始化
    • 2.2 回调函数逻辑
    • 2.3 主函数示例
  • 3. 测试


背景简述:使用CANFIFO的DMA功能,接收数据。


1. PE配置


1.1 添加edma模块


在PE的模块库中添加edma模块。(右键“Add to project.”)
【S32K144调试笔记】CANFIFO&DMA SDK 配置测试_第1张图片


1.2 配置edma模块


【S32K144调试笔记】CANFIFO&DMA SDK 配置测试_第2张图片
我的工程中使用的是FlexCAN1的FIFO对应的DMA的Channel1,注意“Channel state structure name”、“Channel configuration name”自动升成的名字是否和你配置的通道一直。
【S32K144调试笔记】CANFIFO&DMA SDK 配置测试_第3张图片


1.3 配置FlexCAN


【S32K144调试笔记】CANFIFO&DMA SDK 配置测试_第4张图片
【S32K144调试笔记】CANFIFO&DMA SDK 配置测试_第5张图片


2. 函数调用


2.1 模块初始化


初始化DMA和FlexCAN。
其中,edma1_Callback是收到报文后的中断处理函数的回调函数,在其中置一个接收标志位。
can2_msg是存放接收CAN数据的变量。

/* Initialize eDMA driver */
 EDMA_DRV_Init(&dmaController1_State, &dmaController1_InitConfig0, edmaChnStateArray, edmaChnConfigArray, EDMA_CONFIGURED_CHANNELS_COUNT);
 /* Add DMA callback function。 */
 EDMA_DRV_InstallCallback(1, edma1_Callback, NULL);

/*Initialize FlexCAN2 driver */
 FLEXCAN_DRV_Init(Select_CAN_NODE_2, &FlexCan_2_State, &FlexCan_2_InitConfig0);

 // Fill id filter table,
 for(id_counter = 0; id_counter < 16; id_counter++)
 {
  filterTable[id_counter].isRemoteFrame   = false;
  filterTable[id_counter].isExtendedFrame = false;
  filterTable[id_counter].id = 0 ;
 }
/* Configure RX FIFO ID filter table elements based on filter table defined above */
 FLEXCAN_DRV_ConfigRxFifo(Select_CAN_NODE_2, FLEXCAN_RX_FIFO_ID_FORMAT_A, filterTable);

/* rest of filter items are masked with RXFGMASK */
 FLEXCAN_DRV_SetRxFifoGlobalMask(Select_CAN_NODE_2, FLEXCAN_MSG_ID_STD, 0x00000000);

/* Start receiving data in RX_RXFIFO. */
 FLEXCAN_DRV_RxFifo(Select_CAN_NODE_2, &can2_msg[0]);

2.2 回调函数逻辑


运行到回调函数,说明,数据已经接收到了。
置位“转存”标志位。

void edma1_Callback(uint8_t instance, flexcan_event_type_t eventType,
        flexcan_state_t *flexcanState)
{
  (void)flexcanState;
  (void)instance;

  switch(eventType)
  {
      case FLEXCAN_EVENT_RX_COMPLETE:
        break;
      case FLEXCAN_EVENT_RXFIFO_COMPLETE:
        break;
      case FLEXCAN_EVENT_DMA_COMPLETE:
      {
         rxFIFOdone = 1;
      }
        break;
      case FLEXCAN_EVENT_TX_COMPLETE:
        break;
      default:
        break;
   }
}

2.3 主函数示例


main()
{
  if(rxFIFOdone)
  {
    rxFIFOdone = 0;
    /*
     * 在这里可以调用,收到报文后的处理逻辑函数。
     * 如:数据转存、事件出发等。
     */
  }

  /* enable receiving data in RX FIFO again */
  FLEXCAN_DRV_RxFifo(Select_CAN_NODE_2, &can2_msg[0]);
  
}

3. 测试


用PCAN发送 ID:0x7E0 Data:02 10 03 AA AA AA AA AA
断点打在回调函数中,可以看到,Expressions中的变量can2_msg中,已经被写入了收到的报文值。
测试满足设计需求。
【S32K144调试笔记】CANFIFO&DMA SDK 配置测试_第6张图片

写在最后:
这两天在调试144的时候,突然觉得,还是要沉下心来,每一步都走到,才能掌控,光听别人说或是光看别人的代码和资料,自己不动手,是不行的,心里没底。就算是官方提供的代码,也要debug一下,看看人家是怎么考虑的,为什要这样写这么设计,不断地对比中,自己的技能才能稍稍有所提高,更何况如果不去比较呢!
做技术的挺辛苦的,但是很快乐,一旦有收获有进步就很满足。

你可能感兴趣的:(S32K144)