21ic问答首页 - 有关HC32F460的CAN通讯问题
有关HC32F460的CAN通讯问题
Wtt小菜鸟2021-10-31
我尝试使用HC32F460来进行CAN通讯,但是在使用例程的时候始终无法进行正常的CAN通讯,想请教一下是不是哪里配置错误导致的问题。
选用的是20MHz外部晶振,主频与例程相同配至200MHz。
以下是有关CAN的配置
static void CanInitConfig(void)
{
stc_can_init_config_t stcCanInitCfg;
stc_can_filter_t astcFilters[CAN_FILTERS_COUNT] = \
{
{0x00000000ul, 0x1FFFFFFFul, CanFilterSel1, CanAllFrames}
};
//<< Enable can peripheral clock and buffer(ram)
PWC_RamOpMdConfig(HighSpeedMd);
PWC_RamPwrdownCmd(PWC_RAMPWRDOWN_CAN, Enable);
PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_CAN, Enable);
//<< CAN GPIO config 这里是自己配置的两个端口
PORT_SetFunc(PortB, Pin02, Func_Can1_Rx, Disable);
PORT_SetFunc(PortB, Pin10, Func_Can1_Tx, Disable);
//64pin没有PD15,所以屏蔽了以下两句
//PORT_ResetBits(PortD, Pin15);
//PORT_OE(PortD, Pin15, Enable);
MEM_ZERO_STRUCT(stcCanInitCfg);
//<< Can bit time config 这边跟例程相同选用1MHz波特率
stcCanInitCfg.stcCanBt.PRESC = 1u-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;
stcCanInitCfg.pstcFilter = astcFilters;
stcCanInitCfg.u8FilterCount = CAN_FILTERS_COUNT;
CAN_Init(&stcCanInitCfg);
}
因为通讯不上,我又尝试使用CAN内部回环模式通信的例程,想看看能不能进行内部通讯,但是仍然失败,且一直在while (false == CAN_Irq**Get(CanTxPrimaryIrq**))这一句循环,没有发送成功。因此想请教一下可能是什么原因造成的呢?
选用的是20MHz外部晶振,主频与例程相同配至200MHz。
以下是有关CAN的配置
static void CanInitConfig(void)
{
stc_can_init_config_t stcCanInitCfg;
stc_can_filter_t astcFilters[CAN_FILTERS_COUNT] = \
{
{0x00000000ul, 0x1FFFFFFFul, CanFilterSel1, CanAllFrames}
};
//<< Enable can peripheral clock and buffer(ram)
PWC_RamOpMdConfig(HighSpeedMd);
PWC_RamPwrdownCmd(PWC_RAMPWRDOWN_CAN, Enable);
PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_CAN, Enable);
//<< CAN GPIO config 这里是自己配置的两个端口
PORT_SetFunc(PortB, Pin02, Func_Can1_Rx, Disable);
PORT_SetFunc(PortB, Pin10, Func_Can1_Tx, Disable);
//64pin没有PD15,所以屏蔽了以下两句
//PORT_ResetBits(PortD, Pin15);
//PORT_OE(PortD, Pin15, Enable);
MEM_ZERO_STRUCT(stcCanInitCfg);
//<< Can bit time config 这边跟例程相同选用1MHz波特率
stcCanInitCfg.stcCanBt.PRESC = 1u-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;
stcCanInitCfg.pstcFilter = astcFilters;
stcCanInitCfg.u8FilterCount = CAN_FILTERS_COUNT;
CAN_Init(&stcCanInitCfg);
}
因为通讯不上,我又尝试使用CAN内部回环模式通信的例程,想看看能不能进行内部通讯,但是仍然失败,且一直在while (false == CAN_Irq**Get(CanTxPrimaryIrq**))这一句循环,没有发送成功。因此想请教一下可能是什么原因造成的呢?
赞0
评论
2023-12-19
赞0
评论
2023-12-15
赞0
评论
2023-12-04
赞0
评论
2022-06-09
赞0
HC32F460的CAN具体怎么调试成功的,我使用官方板子和例程内部回环和接收中断方式都行不通?
评论
2022-06-07
赞0
评论
2021-11-13
赞0
评论
2021-11-12
赞0
评论
2021-11-12
赞0
大神,我也碰到类似的问题 :用官方的demo + 开发板,程序改成间隔20ms发送,示波器可以抓到gpio口的电平变化报文~~~但是把管脚改成PH02/PC13其他什么也不变,示波器在PH02/PC13上什么也没抓到~~~
评论
2021-11-12
您需要登录后才可以回复 登录 | 注册