背景简述:使用CANFIFO的DMA功能,接收数据。
1. PE配置
1.1 添加edma模块
在PE的模块库中添加edma模块。(右键“Add to project.”)
1.2 配置edma模块
我的工程中使用的是FlexCAN1的FIFO对应的DMA的Channel1,注意“Channel state structure name”、“Channel configuration name”自动升成的名字是否和你配置的通道一直。
1.3 配置FlexCAN
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中,已经被写入了收到的报文值。
测试满足设计需求。
写在最后:
这两天在调试144的时候,突然觉得,还是要沉下心来,每一步都走到,才能掌控,光听别人说或是光看别人的代码和资料,自己不动手,是不行的,心里没底。就算是官方提供的代码,也要debug一下,看看人家是怎么考虑的,为什要这样写这么设计,不断地对比中,自己的技能才能稍稍有所提高,更何况如果不去比较呢!
做技术的挺辛苦的,但是很快乐,一旦有收获有进步就很满足。