S32K144之SDK版:CAN模块应用

一,添加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;
     }


}

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值