当前位置:   article > 正文

S32K144-12.flexcan fifo_s32k144 flexcan

s32k144 flexcan

S32K146 FLEXCAN SDK解读:

FlexCAN 模块是一个通信控制器,该模块实现了 CAN 协议即CAN2.0B 协议规范。 FlexCAN 模块的字模块,包括了用来存储消息缓冲的相关联的内存区域,Rx 全局掩码寄存器、Rx 私有掩码寄存器、Rx 先进先出队列以及 Rx 队列标识过滤器。消息缓冲区存储在一个专用于 FlexCAN 模块的 RAM 区,请求存取 RAM 接收和传输消息帧,验证接收到的消息以及进行错误处理。控制器主机接口子模块用来选择接收和传输的消息缓冲区,使用仲裁与 ID 匹配算法,以建立同 CPU 或者其他模块的连接。

私有掩码则有64个,RXIMR0 - RXIMR63,对应MB0 – MB63,是一一对应的关系,所以私有掩码和对应的MB可以放到一起配置。

掩码不影响筛选表,而是与对应的ID位是否需要去和MB里面设定的预期ID对比。eg:flexcan_msgbuff_t recmsg;

当设置私有掩码时

#define CAN_ID_STD_MASK       0x1FFC0000u

0xC0000000|0x7FF ID为标准帧

 (stdMask << CAN_ID_STD_SHIFT) & CAN_ID_STD_MASK;

0xC0000000|0x7FF左移18与上0x1FFC0000还是为 0x1FFC0000

即(base->RXIMR[msgBuffIdx])为0x1FFC0000    二进制00011111111111000000000000000000

标准帧看29-19位 11111111111 也就是全关心

所以筛选id设置啥只接收啥

中断

  1. uint8_t canrxdata[8];
  2. flexcan_msgbuff_t recmsg;
  3. flexcan_id_table_t canidtable[8];
  4. void canrxcallback(uint8_t instance, flexcan_event_type_t eventType,
  5.                                    uint32_t buffIdx, flexcan_state_t *flexcanState)
  6. {
  7.     // RxFIFO接收完成
  8.           if(eventType == FLEXCAN_EVENT_RXFIFO_COMPLETE) {
  9.         // CAN0接收
  10.                   if(instance == INST_CANCOM1)
  11.                   {
  12.                           memcpy(&canrxdata, &recmsg.data, 8);
  13.    //此函数使用 Rx FIFO 接收 CAN 帧。该函数立即返回。如果安装了回调,则在接收到帧并读入指定的缓冲区后,将调用该回调。
  14.                           FLEXCAN_DRV_RxFifo(INST_CANCOM1, &recmsg);
  15.                   }
  16.           }
  17. }
  18. void can_fifo_init(void){
  19. FLEXCAN_DRV_Init(INST_CANCOM1, &canCom1_State, &canCom1_InitConfig0);
  20. //过滤器表元素设置
  21.  flexcan_id_table_t canidtable[8];
  22.     for(uint8_t i=0;i<8;i++)
  23.     {
  24.         canidtable[i].isExtendedFrame = 0;
  25.         canidtable[i].isRemoteFrame = 0;
  26.         canidtable[i].id = 0x11;
  27.     }
  28.     //配置RX FIFO ID过滤器表元素,并启用RX中断
  29.     FLEXCAN_DRV_ConfigRxFifo(INST_CANCOM1,FLEXCAN_RX_FIFO_ID_FORMAT_A,canidtable);
  30.     /*私有掩码设置*/
  31. /*    FLEXCAN_DRV_SetRxMaskType(INST_CANCOM1,FLEXCAN_RX_MASK_INDIVIDUAL);
  32.     for(uint8_t id_index=0;id_index<8;id_index++)
  33.     {
  34.         FLEXCAN_DRV_SetRxIndividualMask(INST_CANCOM1,FLEXCAN_MSG_ID_STD,id_index,0xc0000000|0x7ff);
  35.     }*/
  36. /*自定义
  37.     flexcan_id_table_t canidtable[8];
  38.     for(uint8_t i=0;i<8;i++)
  39.     {
  40.         canidtable[i].isExtendedFrame = true;
  41.         canidtable[i].isRemoteFrame = false;
  42.         canidtable[i].id = 0x12345678;
  43.     }
  44.     FLEXCAN_DRV_ConfigRxFifo(INST_CANCOM1,FLEXCAN_RX_FIFO_ID_FORMAT_A,canidtable);
  45.     */
  46.     //将RX掩码类型设置为RX全局掩码或RX单个掩码
  47.     FLEXCAN_DRV_SetRxMaskType(INST_CANCOM1,FLEXCAN_RX_MASK_GLOBAL);
  48. //将Rx FIFO全局掩码设置为11位标准掩码或29位扩展掩码
  49. FLEXCAN_DRV_SetRxFifoGlobalMask(INST_CANCOM1,FLEXCAN_MSG_ID_STD,0);
  50. FLEXCAN_DRV_InstallEventCallback(INST_CANCOM1,canrxcallback,NULL);
  51. //此函数使用 Rx FIFO 接收 CAN 帧。该函数立即返回。如果安装了回调,则在接收到帧并读入指定的缓冲区后,将调用该回调。
  52. FLEXCAN_DRV_RxFifo(INST_CANCOM1,&recmsg);
  53. }
  54. void can_fifosend(void){
  55. flexcan_data_info_t can_tx_data_config;
  56. can_tx_data_config.msg_id_type = FLEXCAN_MSG_ID_STD;
  57. //8字节数据帧
  58. can_tx_data_config.data_length = 8;
  59. can_tx_data_config.is_remote = 0;
  60. //不使能自动波特率
  61. can_tx_data_config.enable_brs = 0;
  62. //                  CAN      邮箱       配置           发送ID  数据
  63. FLEXCAN_DRV_Send(INST_CANCOM1,2,&can_tx_data_config,0x1,canrxdata);
  64. }

DMA的代码和中断一样

只要配置DMA通道和初始化

代码中会自动调用

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

闽ICP备14008679号