查看: 12786|回复: 7

[原创] LPC54608如何配置CAN标准帧滤波

[复制链接]
  • TA的每日心情
    开心
    2025-7-10 13:07
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    56

    主题

    548

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1528

    热心会员

    最后登录
    2025-7-23
    发表于 2022-6-27 10:30:53 | 显示全部楼层 |阅读模式
    LPC54608如何配置CAN标准帧滤波

    分享一下最近在学的LPC54608的板子吧最近在研究CAN这部分,板子是很早之前社区获得的,还是要感谢论坛一下。
    LPC54.png
    LPC.png

    寄存器的配置部分
    Global filter configuration register GFC
    设置滤波配置首先要设置全局滤波器配置,当前配置的是标准帧滤波,所以仅需要配置标准帧的部分:
    RRFS [1]:1 表示拒绝所有11位ID的遥控帧。
    ANFS [4:5]:2 表示拒绝所有不匹配的标识符。
    Standard ID filter configuration register SIDFC

    设置标准帧的滤波表配置:
    FLSSA [15:2]:设置标准帧滤波表位置相对于Message RAM Base address的偏移。
    LSS [23:16]:表示标准帧滤波表中表单个数,一个表单占4个字节。数量最大为128。
    在设置偏移时,要注意Message RAM configuration的内存分配情况,避免在初始化以后又增加滤波表导致占用后面的RxFIFO的内容等情况,要及时的同步的修改后面所用到的接收FIFO的配置:
    Standard message ID filter element
    标准帧的滤波表单:
    SFID2 [10:0]:滤波的标准帧11位标识符。
    SDIF1 [26:16]:滤波的标准帧11位标识符。
    SFEC [29:27]:滤波表配置:
    0:关闭滤波选项
    1:如果匹配则保存在RxFIFIO0中
    2:如果匹配则保存在R小FIFO1中
    3:拒绝匹配的ID
    4:如果匹配则产生中断
    5:如果匹配则保存在RxFIFO0中,并产生中断
    6:如果匹配则保存在RxFIFO1中,并产生中断
    7:保存在接收Buf中或者作为debug信息
    PS:一般设置为1或者2保存在RxFIFO中
    SFT [31:30]:滤波类型:
    0:滤波类型从SFID2到SFID1
    1:双ID滤波
    2:典型滤波,filter=SFID1,mask=SFID2
    3:关闭滤波
    PS:一般设置为0或者2
    RxFIFO 0 configuration register RF0CR
    如果是在初始化以后,修改滤波表的话,可能会对原来RxFIFO0或者RxFIFO1在Message RAM中所使用的内存产生影响,所以也有可能需要对RF0CR寄存器进行调整,一般也只调整 FOSA:
    FOSA:设置RxFIFO0的的起始位置相对于Message RAM的地址的偏移。一条普通CAN帧是4个字节。

    Control register CCCR

    一般在设置以下寄存器时,首先要将CCCR寄存器的CCE置位,但是置位CCE前,要将INIT位置位:

    HPMS – High priority message status
    RXF0S – Rx FIFO 0 status.
    RXF1S – Rx FIFO 1 status
    TXFQS – Tx FIFO/queue status.
    TXBTO – Tx buffer transmission occurred.
    TXBRP – Tx buffer request pending.
    TXBCF – Tx buffer cancellation finished.
    TXEFS – Tx event FIFO status.
    所以一定要将CCE和INIT位置一后GFC和SIDFC寄存器才能够被正常的写入。
    要先写INIT位,之后延时1ms,之后再写CCE位,否则CCE为不能被置一。

    配置函数

    1. /*! @brief MCAN Filter Type. */
    2. typedef enum _mcan_std_filter_type
    3. {
    4.     kMCAN_range           = 0x0U, /*!< Range filter from SFID1 to SFID2. */
    5.     kMCAN_dual            = 0x1U, /*!< Dual ID filter for SFID1 or SFID2. */
    6.     kMCAN_classic         = 0x2U, /*!< Classic filter: SFID1 = filter, SFID2 = mask. */
    7.     kMCAN_disableORrange2 = 0x3U, /*!< Filter element disabled for standard filter
    8.                                     or Range filter, XIDAM mask not applied for extended filter. */
    9. } mcan_filter_type_t;

    10. /*! @brief MCAN Filter Element Configuration. */
    11. typedef enum _mcan_fec_config
    12. {
    13.     kMCAN_disable       = 0x0U, /*!< Disable filter element. */
    14.     kMCAN_storeinFifo0  = 0x1U, /*!< Store in Rx FIFO 0 if filter matches. */
    15.     kMCAN_storeinFifo1  = 0x2U, /*!< Store in Rx FIFO 1 if filter matches. */
    16.     kMCAN_reject        = 0x3U, /*!< Reject ID if filter matches. */
    17.     kMCAN_setprio       = 0x4U, /*!< Set priority if filter matches. */
    18.     kMCAN_setpriofifo0  = 0x5U, /*!< Set priority and store in FIFO 0 if filter matches. */
    19.     kMCAN_setpriofifo1  = 0x6U, /*!< Set priority and store in FIFO 1 if filter matches. */
    20.     kMCAN_storeinbuffer = 0x7U, /*!< Store into Rx Buffer or as debug message. */
    21. } mcan_fec_config_t;

    22. /*! @brief MCAN Standard Message ID Filter Element. */
    23. typedef struct _mcan_std_filter_element_config
    24. {
    25.     uint32_t sfid2 : 11; /*!< Standard Filter ID 2. */
    26.     uint32_t : 5;        /*!< Reserved. */
    27.     uint32_t sfid1 : 11; /*!< Standard Filter ID 1. */
    28.     uint32_t sfec : 3;   /*!< Standard Filter Element Configuration. */
    29.     uint32_t sft : 2;    /*!< Standard Filter Type. */
    30. } mcan_std_filter_element_config_t;

    31. void CANStdFilterSet(CAN_Type *base, mcan_std_filter_element_config_t *pcfTable, INT8U ucLen)
    32. {
    33.     uint32_t *elementAddress = NULL;
    34.     INT8U i;
    35.    
    36.     if (ucLen > 128) {
    37.         ucLen = 128;
    38.     }
    39.    
    40.     if (pcfTable == NULL) {
    41.         return;
    42.     }
    43.    
    44.     base->CCCR |= (1 << 0);
    45.     OSTimeDly(2);
    46.     base->CCCR |= (1 << 1);

    47.     base->RXF0C &= ~(0x3fff << 2);
    48.     base->RXF0C |= ((ucLen + 1) << 2);

    49.     base->GFC &= ~(1 << 1);
    50.     base->GFC |= (1 << 1);          // RRFS
    51.     base->GFC &= ~(0x3 << 4);   
    52.     base->GFC |= (0x2 << 4);        // ANFS

    53.     base->SIDFC &= ~(0x3fff << 2);
    54.     base->SIDFC |= (0 << 2);        //FLSS
    55.     base->SIDFC &= ~(0x3f << 16);
    56.     base->SIDFC |= (ucLen << 16);     //LSS

    57.     base->CCCR &= ~(1 << 1);
    58.     base->CCCR &= ~(1 << 0);
    59.    
    60.    
    61.     for (i = 0; i < ucLen; i++) {
    62.         elementAddress = (uint32_t *)(base->MRBA + i * 4U);
    63.         (void)memcpy((void *)elementAddress, (const void *)(pcfTable + i), sizeof(mcan_std_filter_element_config_t));
    64.     }
    65.    
    66. }

    67. void CANFilter_Sample(void)
    68. {
    69.    
    70.         mcan_std_filter_element_config_t stdFileter[6];
    71.         stdFileter[0].sfid1 = 0x100;
    72.     stdFileter[0].sfid2 = 0x200;
    73.     stdFileter[0].sft = kMCAN_range;
    74.     stdFileter[0].sfec = kMCAN_storeinFifo0;   
    75.    
    76.     stdFileter[1].sfid1 = 0x300;
    77.     stdFileter[1].sfid2 = 0x400;
    78.     stdFileter[1].sft = kMCAN_range;
    79.     stdFileter[1].sfec = kMCAN_storeinFifo0;
    80.    
    81.     stdFileter[2].sfid1 = 0x500;
    82.     stdFileter[2].sfid2 = 0x7ff;
    83.     stdFileter[2].sft = kMCAN_classic;
    84.     stdFileter[2].sfec = kMCAN_storeinFifo0;
    85.    
    86.     stdFileter[3].sfid1 = 0x555;
    87.     stdFileter[3].sfid2 = 0x7ff;
    88.     stdFileter[3].sft = kMCAN_classic;
    89.     stdFileter[3].sfec = kMCAN_storeinFifo0;
    90.    
    91.     stdFileter[4].sfid1 = 0x600;
    92.     stdFileter[4].sfid2 = 0x700;
    93.     stdFileter[4].sft = kMCAN_range;
    94.     stdFileter[4].sfec = kMCAN_storeinFifo0;
    95.    
    96.     stdFileter[5].sfid1 = 0x777;
    97.     stdFileter[5].sfid2 = 0x7ff;
    98.     stdFileter[5].sft = kMCAN_classic;
    99.     stdFileter[5].sfec = kMCAN_storeinFifo0;
    100.    
    101.     CANStdFilterSet(CAN_0, stdFileter, 6);
    102. }
    复制代码
    今天就分享到这吧,时间有限,摸鱼写了一会,准备恰饭了!

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3946

    主题

    7567

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    40297
    最后登录
    2025-9-12
    发表于 2022-6-27 10:33:06 | 显示全部楼层
    感谢分享,就是排版一言难尽
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 09:00
  • 签到天数: 2424 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    84

    主题

    2万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    22557
    最后登录
    2025-9-12
    发表于 2022-6-27 12:02:14 | 显示全部楼层
    分享的都要赞一下。哈哈哈。。。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 00:05
  • 签到天数: 1884 天

    连续签到: 9 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112771
    最后登录
    2025-9-12
    发表于 2022-6-27 13:55:37 | 显示全部楼层
    NXP管管 发表于 2022-6-27 10:33
    感谢分享,就是排版一言难尽

    编辑器要是支持markdown就好了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 00:05
  • 签到天数: 1884 天

    连续签到: 9 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112771
    最后登录
    2025-9-12
    发表于 2022-6-27 13:56:31 | 显示全部楼层
    看样子你也是习惯手动撸寄存器的啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3946

    主题

    7567

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    40297
    最后登录
    2025-9-12
    发表于 2022-6-27 13:58:37 | 显示全部楼层
    stm1024 发表于 2022-6-27 13:55
    编辑器要是支持markdown就好了

    markdown也有markdown的难点,markdown对于Discuz貌似适配不高
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4693

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10105
    最后登录
    2025-9-11
    发表于 2022-6-27 14:12:43 | 显示全部楼层
    点个赞
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 19:02
  • 签到天数: 737 天

    连续签到: 1 天

    [LV.9]以坛为家II

    14

    主题

    2705

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4677
    最后登录
    2025-9-11
    发表于 2022-6-28 08:58:19 | 显示全部楼层
    感谢分享,楼主辛苦了
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-13 07:36 , Processed in 0.106357 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表