请问一个关于 CAN 滤波器的问题。已解决。
本帖最后由 芯LYS 于 2023-8-16 11:15 编辑怎样设置滤波器,使得程序只接收 ID 为 0x280 ~ 0x2ff 的标准帧报文呢?
我尝试着按照手册上的指引,在初始化 CAN 的时候写了下面这段代码:
void Can_Config(u8 baudrate)
{
CAN_InitTypeDef init;
// P0.0 和 P0.1 设置为准双向口
P0_MODE_IO_PU(GPIO_Pin_0 | GPIO_Pin_1);
CAN1_SW(CAN1_P00_P01);
// CAN 控制器使能, 可选值: ENABLE, DISABLE
init.CAN_Enable = ENABLE;
// CAN 中断寄存器, 可选值:
// CAN_DOIM, CAN_BEIM, CAN_TIM, CAN_RIM,
// CAN_EPIM, CAN_EWIM, CAN_ALIM, CAN_ALLIM, DISABLE
init.CAN_IMR = CAN_ALLIM;
// 重新同步跳跃宽度, 可选值: 0~3
init.CAN_SJW = 0;
// 总线电平采样次数, 可选值:
// 0=采样一次, 1=采样三次
init.CAN_SAM = 0;
// CAN 总线波特率: Fclk / ((1 + (TSG1 + 1) + (TSG2 + 1)) * (BRP + 1) * 2)
// 250kHz = 32000000 / ((1 + 3 + 12) * 4 * 2)
init.CAN_TSG1 = 12;
init.CAN_TSG2 = 1;
init.CAN_BRP = baudrate <= 125 ? 7 : 3;
// 只接收 ID 为 0x280 ~ 0x2ff, 类型为标准帧的 CAN 报文
// 11 位 CAN ID 的二进制范围为 01010000000 ~ 01011111111
//
// ID.10 | ID.09 | ID.08 | ID.07 | ID.06 | ID.05 | ID. 4 | ID.03
// 0 | 1 | 0 | 1 | x | x | x | x(0x50)
// 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1(0x0f)
//
// ID.02 | ID.01 | ID.00 |RTR| | | |
// x | x | x | 0 | x | x | x | x(0x00)
// 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1(0xef)
init.CAN_ACR0 = 0x50;
init.CAN_ACR1 = 0x00;
init.CAN_ACR2 = 0x00;
init.CAN_ACR3 = 0x00;
init.CAN_AMR0 = 0x0f;
init.CAN_AMR1 = 0xef;
init.CAN_AMR2 = 0xff;
init.CAN_AMR3 = 0xff;
// CAN1 初始化
CAN_Inilize(CAN1, &init);
NVIC_CAN_Init(CAN1, ENABLE, Priority_1);
} // Can_Config(u8)但实际运行的时候,发现滤波器并没有生效,其余 ID 的标准帧也能被接收。这是什么问题呢,有大佬知道吗?非常感谢!
CAN的MR寄存器的bit0(AFM)你有设置吗
lib里面默认是设置为0,即双滤波设置
你的代码使用的是单滤波 确实是滤波类型没有设置为单滤波模式。
之前的库函数没有设置滤波模式,默认是双滤波模式。
附件例程已添加了滤波模式设置,请参考。
明白了,谢谢!我再去试试。 我也是滤波的问题,我设置的是扩展帧的单滤波器,设置完就什么消息都接收不到,AFM位也置1了。我要求能通过的ID是0x1828D0E0,AMR、ACR设置如下:
CAN_write_reg(MR ,0x01); //退出Reset Mode,设置为单滤波器
CAN_write_reg(ACR0,0x18); //总线验收代码寄存器
CAN_write_reg(ACR1,0x28);
CAN_write_reg(ACR2,0xD0);
CAN_write_reg(ACR3,0xE0);
CAN_write_reg(AMR0,0x00); //总线验收屏蔽寄存器
CAN_write_reg(AMR1,0x00);
CAN_write_reg(AMR2,0x00);
CAN_write_reg(AMR3,0x07);
是我哪里搞错了吗,比如CAN ID的位置顺序错了?
页:
[1]