华大HC32F460 Can总线筛选问题
华大单片机手册上说:ID CODE 和 ID MASK通过 ACF寄存器访问且只能在 CFG_STAT.RESET=1 即 CAN 软件复位时设定。我在debug的过程中:当CAN软件复位时,ACF寄存器是软件设置的AccCode和AccMask的值:
但是当我把can回复到正常工作状态时即STAT寄存器REST位置0后,ACF寄存器的值被清0了,而且can也没有过滤掉无关的帧ID
给你发个能用的代码吧。遇到了跟你同样的问题,我的解决方法是把 CAN_FilterConfig(&stcFilter, Enable); 这个函数 提前执行。希望能帮到你,
顺便吐槽一句,想支持一把国产真特么不容易!!!就这还想抢stm32的市场,且不说产品做得怎么样,虽然我这个用起来了,但是费死了劲。手册写得不明不白的,只能靠蒙。
还有什么波特率设置之类的,特么的就不能跟串行口一样把波特率作为参数传进去?设4个寄存器。谁特么有空看这些设置?
void hal_can_init(void)
{
PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_CAN, Enable);
PORT_SetFunc(PortB, Pin13, Func_Can1_Rx, Disable);
PORT_SetFunc(PortB, Pin14, Func_Can1_Tx, Disable);
stc_can_init_config_t stcCanInitCfg;
stc_can_filter_t stcFilter;
stc_can_txframe_t stcTxFrame;
//<<Can filter config
stcFilter.enAcfFormat = CanStdFrames;
stcFilter.enFilterSel = CanFilterSel1;
stcFilter.u32CODE = 0x00000601ul;
stcFilter.u32MASK = 0x1FFFF000ul;
CAN_FilterConfig(&stcFilter, Enable);
MEM_ZERO_STRUCT(stcCanInitCfg);
MEM_ZERO_STRUCT(stcFilter);
MEM_ZERO_STRUCT(stcTxFrame);
stcCanInitCfg.stcCanBt.PRESC = 2u - 1u;
stcCanInitCfg.stcCanBt.SEG_1 = 5u - 2u;
stcCanInitCfg.stcCanBt.SEG_2 = 3u - 1u;
stcCanInitCfg.stcCanBt.SJW = 3u - 1u;
stcCanInitCfg.stcWarningLimit.CanErrorWarningLimitVal = 10u;
stcCanInitCfg.stcWarningLimit.CanWarningLimitVal = 16u - 1u;
stcCanInitCfg.enCanRxBufAll= CanRxNormal;
stcCanInitCfg.enCanRxBufMode = CanRxBufNotStored;
stcCanInitCfg.enCanSAck = CanSelfAckEnable;
stcCanInitCfg.enCanSTBMode = CanSTBFifoMode;
CAN_Init(&stcCanInitCfg);
CAN_IrqCmd(CanRxIrqEn, Enable);
} 应该还是配置没对吧? 还是不得行? 配置方面有没有问题 过滤方式没有配置对 你用的是哪个库版本?1.0的库没问题,如果是2.0的库是有问题的,3.0的库测试没问题,你可以用3.0的试一下, 我是直接移植了华大提供的官方例程里的相关函数,挺顺利的啊 弱弱的问一下,官方为啥要这样写?不就是1u,3u,2u和2u么?
stcCanInitCfg.stcCanBt.PRESC = 2u - 1u;
stcCanInitCfg.stcCanBt.SEG_1 = 5u - 2u;
stcCanInitCfg.stcCanBt.SEG_2 = 3u - 1u;
stcCanInitCfg.stcCanBt.SJW = 3u - 1u;
这些都是只读的吧 过滤方式的配置有问题 我就一直也配置不对呢 这就是书写习惯 移植的时候需要修改哪里呢 表示的是无符号数吧
页:
[1]