在线时间101 小时
UID3617445
注册时间2020-2-7
NXP金币217

TA的每日心情 | 开心 2025-7-10 13:07 |
---|
签到天数: 43 天 连续签到: 1 天 [LV.5]常住居民I
版主
  
- 积分
- 1528

- 最后登录
- 2025-7-23
|
LPC54608如何配置CAN标准帧滤波
分享一下最近在学的LPC54608的板子吧最近在研究CAN这部分,板子是很早之前社区获得的,还是要感谢论坛一下。
寄存器的配置部分
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为不能被置一。
配置函数
- /*! @brief MCAN Filter Type. */
- typedef enum _mcan_std_filter_type
- {
- kMCAN_range = 0x0U, /*!< Range filter from SFID1 to SFID2. */
- kMCAN_dual = 0x1U, /*!< Dual ID filter for SFID1 or SFID2. */
- kMCAN_classic = 0x2U, /*!< Classic filter: SFID1 = filter, SFID2 = mask. */
- kMCAN_disableORrange2 = 0x3U, /*!< Filter element disabled for standard filter
- or Range filter, XIDAM mask not applied for extended filter. */
- } mcan_filter_type_t;
- /*! @brief MCAN Filter Element Configuration. */
- typedef enum _mcan_fec_config
- {
- kMCAN_disable = 0x0U, /*!< Disable filter element. */
- kMCAN_storeinFifo0 = 0x1U, /*!< Store in Rx FIFO 0 if filter matches. */
- kMCAN_storeinFifo1 = 0x2U, /*!< Store in Rx FIFO 1 if filter matches. */
- kMCAN_reject = 0x3U, /*!< Reject ID if filter matches. */
- kMCAN_setprio = 0x4U, /*!< Set priority if filter matches. */
- kMCAN_setpriofifo0 = 0x5U, /*!< Set priority and store in FIFO 0 if filter matches. */
- kMCAN_setpriofifo1 = 0x6U, /*!< Set priority and store in FIFO 1 if filter matches. */
- kMCAN_storeinbuffer = 0x7U, /*!< Store into Rx Buffer or as debug message. */
- } mcan_fec_config_t;
- /*! @brief MCAN Standard Message ID Filter Element. */
- typedef struct _mcan_std_filter_element_config
- {
- uint32_t sfid2 : 11; /*!< Standard Filter ID 2. */
- uint32_t : 5; /*!< Reserved. */
- uint32_t sfid1 : 11; /*!< Standard Filter ID 1. */
- uint32_t sfec : 3; /*!< Standard Filter Element Configuration. */
- uint32_t sft : 2; /*!< Standard Filter Type. */
- } mcan_std_filter_element_config_t;
- void CANStdFilterSet(CAN_Type *base, mcan_std_filter_element_config_t *pcfTable, INT8U ucLen)
- {
- uint32_t *elementAddress = NULL;
- INT8U i;
-
- if (ucLen > 128) {
- ucLen = 128;
- }
-
- if (pcfTable == NULL) {
- return;
- }
-
- base->CCCR |= (1 << 0);
- OSTimeDly(2);
- base->CCCR |= (1 << 1);
- base->RXF0C &= ~(0x3fff << 2);
- base->RXF0C |= ((ucLen + 1) << 2);
- base->GFC &= ~(1 << 1);
- base->GFC |= (1 << 1); // RRFS
- base->GFC &= ~(0x3 << 4);
- base->GFC |= (0x2 << 4); // ANFS
- base->SIDFC &= ~(0x3fff << 2);
- base->SIDFC |= (0 << 2); //FLSS
- base->SIDFC &= ~(0x3f << 16);
- base->SIDFC |= (ucLen << 16); //LSS
- base->CCCR &= ~(1 << 1);
- base->CCCR &= ~(1 << 0);
-
-
- for (i = 0; i < ucLen; i++) {
- elementAddress = (uint32_t *)(base->MRBA + i * 4U);
- (void)memcpy((void *)elementAddress, (const void *)(pcfTable + i), sizeof(mcan_std_filter_element_config_t));
- }
-
- }
- void CANFilter_Sample(void)
- {
-
- mcan_std_filter_element_config_t stdFileter[6];
- stdFileter[0].sfid1 = 0x100;
- stdFileter[0].sfid2 = 0x200;
- stdFileter[0].sft = kMCAN_range;
- stdFileter[0].sfec = kMCAN_storeinFifo0;
-
- stdFileter[1].sfid1 = 0x300;
- stdFileter[1].sfid2 = 0x400;
- stdFileter[1].sft = kMCAN_range;
- stdFileter[1].sfec = kMCAN_storeinFifo0;
-
- stdFileter[2].sfid1 = 0x500;
- stdFileter[2].sfid2 = 0x7ff;
- stdFileter[2].sft = kMCAN_classic;
- stdFileter[2].sfec = kMCAN_storeinFifo0;
-
- stdFileter[3].sfid1 = 0x555;
- stdFileter[3].sfid2 = 0x7ff;
- stdFileter[3].sft = kMCAN_classic;
- stdFileter[3].sfec = kMCAN_storeinFifo0;
-
- stdFileter[4].sfid1 = 0x600;
- stdFileter[4].sfid2 = 0x700;
- stdFileter[4].sft = kMCAN_range;
- stdFileter[4].sfec = kMCAN_storeinFifo0;
-
- stdFileter[5].sfid1 = 0x777;
- stdFileter[5].sfid2 = 0x7ff;
- stdFileter[5].sft = kMCAN_classic;
- stdFileter[5].sfec = kMCAN_storeinFifo0;
-
- CANStdFilterSet(CAN_0, stdFileter, 6);
- }
复制代码 今天就分享到这吧,时间有限,摸鱼写了一会,准备恰饭了!
|
|