一,添加CAN模块
二,配置GPIO
三,配置CAN模块参数
四,代码补全
#define EPS_Report_ID 0x18F
#define EPS_ECU_ID 0x314
#define Rx_Filter 0x0
#define RX_MAILBOX_CAN0 (0UL)
#define TX_MAILBOX_CAN0 (1UL)
/******************************************************************************/
/*-----------------------------Data Structures--------------------------------*/
/******************************************************************************/
char IRQ_CAN0_RX;
can_message_t recvMsg_CAN0;
can_message_t rxMsg_CAN0_0x18F;
can_message_t txMsg_CAN0_0x314 =
{
.cs = 0U,
.id = EPS_ECU_ID,
.data[0] = 0x01,
.data[1] = 0x0,
.data[2] = 0x0,
.data[3] = 0x0,
.data[4] = 0x0,
.data[5] = 0x0,
.data[6] = 0x0,
.data[7] = 0x0,
.length = 8
};
///这个一定要定义为全局,因为初始化,地址传进去保留在里面,要用的
can_buff_config_t Rx_buffCfg = {
.enableFD = false,
.enableBRS = false,
.fdPadding = 0U,
.idType = CAN_MSG_ID_STD,
.isRemote = false
};
can_buff_config_t Tx_buffCfg = {
.enableFD = false,
.enableBRS = false,
.fdPadding = 0U,
.idType = CAN_MSG_ID_STD,
.isRemote = false
};
/******************************************************************************/
/*------------------------------Global variables------------------------------*/
/******************************************************************************/
/*CAN0回调函数*/
void CAN0_Callback_Func (uint32_t instance,can_event_t event,uint32_t buffIdx,void *flexcanState)
{
(void)flexcanState; //此处防止警报
(void)instance;
(void)buffIdx;
CAN_Receive(&can_pal0_instance, RX_MAILBOX_CAN0, &recvMsg_CAN0); //接收报文并重新注册回调函数
switch(event) //回调事件
{
case CAN_EVENT_RX_COMPLETE: //接收完成 事件
IRQ_CAN0_RX =1;
break;
case CAN_EVENT_TX_COMPLETE: //发送完成事件
break;
default:
break;
}
}
/**
* @name DRI_CAN0_Init
* @brief DRI_CAN0_Init module initialize
* @parameter void
* @return void
*
*/
void DRI_CAN0_Init(void)
{
CAN_Init(&can_pal0_instance, &can_pal0_Config0);
CAN_ConfigRxBuff(&can_pal0_instance, RX_MAILBOX_CAN0, &Rx_buffCfg, Rx_Filter); //注册接收配置和MSGID过滤器(如过滤器配置为0x1,则只接受msgid 0x1发来的报文)
CAN_ConfigTxBuff(&can_pal0_instance, TX_MAILBOX_CAN0, &Tx_buffCfg); //配置发送
/*设置MSGID的掩码,掩码粗略可以理解为对11bit MSGID地址的过滤 如果某bit位需要过滤设置为1,不过滤设置为0,例如掩码设置为0x7ff则过滤全部标准id,如果设置为0x7fe,这只能接受0x01的报文(不存在0x0的地址)*/
CAN_SetRxFilter(&can_pal0_instance,CAN_MSG_ID_STD,RX_MAILBOX_CAN0,0); //设置MSGID掩码,
CAN_InstallEventCallback(&can_pal0_instance,&CAN0_Callback_Func,(void*)0); //注册回调函数
CAN_Receive(&can_pal0_instance, RX_MAILBOX_CAN0, &recvMsg_CAN0); //*****重点****此函数不只有接收作用 还有续订回调函数的作用.
INT_SYS_SetPriority(CAN0_ORed_IRQn,configLIBRARY_LOWEST_INTERRUPT_PRIORITY); ///<设置中断优先级小,
INT_SYS_SetPriority(CAN0_Error_IRQn,configLIBRARY_LOWEST_INTERRUPT_PRIORITY); ///<设置中断优先级小,
INT_SYS_SetPriority(CAN0_Wake_Up_IRQn,configLIBRARY_LOWEST_INTERRUPT_PRIORITY); ///<设置中断优先级小,
INT_SYS_SetPriority(CAN0_ORed_0_15_MB_IRQn,configLIBRARY_LOWEST_INTERRUPT_PRIORITY); ///<设置中断优先级小,
}
/**
* @name DRI_CAN0_Task
* @brief DRI_CAN0_Task module
* @parameter void
* @return void
*
*/
void DRI_CAN0_Task(void)
{
///发送0x314报文
CAN_Send(&can_pal0_instance, TX_MAILBOX_CAN0, &txMsg_CAN0_0x314);
///发送0x1F8报文
if (IRQ_CAN0_RX == 1)
{
if(EPS_Report_ID == recvMsg_CAN0.id)
{
rxMsg_CAN0_0x18F = recvMsg_CAN0;
}
else
{
memset(&rxMsg_CAN0_0x18F.data,0x00,sizeof(rxMsg_CAN0_0x18F.data));
}
// int i;
// DBG_PRINTF("CAN0 RECV ID:0x%x \r\n",recvMsg_CAN0.id);
// for(i=0; i<recvMsg_CAN0.length;i++)
// {
// DBG_PRINTF("Data %d : %x\r\n",i,recvMsg_CAN0.data[i]);
// if(i==recvMsg_CAN0.length-1) DBG_PRINTF("***************\r\n");
// }
IRQ_CAN0_RX=0;
}
}