问答

汇集网友智慧,解决技术难题

21ic问答首页 - 有关HC32F460的CAN通讯问题

CAN通讯 hc32f460 tc ST ni LTE

有关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**))这一句循环,没有发送成功。因此想请教一下可能是什么原因造成的呢?
回答 +关注 1
5366人浏览 21人回答问题 分享 举报
21 个回答
  • 对这个片子不熟,但是如果内部回环模式都不正常的话,那多半是配置上有问题了。
  • mark
  • 直接在官方demo上把引脚改成PH02/PC13也不行,示波器抓不到信号~但是官方的demo配置却可以跑,好奇怪!!!
  • 本帖最后由 lxllidong 于 2021-11-12 14:05 编辑

    大神,我也碰到类似的问题 :用官方的demo + 开发板,程序改成间隔20ms发送,示波器可以抓到gpio口的电平变化报文~~~但是把管脚改成PH02/PC13其他什么也不变,示波器在PH02/PC13上什么也没抓到~~~
  • wubangmi 发表于 2021-11-2 21:07
    CAN时钟只能来自外部高速晶振,不能用内部。
    我看你说用内部回环可以了,那把内部回环改成外部回环的就行 ...

    好的,麻烦您了,最终找到问题所在,其设置没有问题,只不过这款芯片的PB2引脚并无CAN功能的复用,所以将管脚改至PH2后可以正常跑了,十分感谢您的解答
  • Wtt小菜鸟 发表于 2021-11-2 19:59
    您好,我根据您给的建议进行了简单的尝试,但仍然无法实现CAN的外部回环通讯,不仅发送中断没有正常标志 ...

    CAN时钟只能来自外部高速晶振,不能用内部。
    我看你说用内部回环可以了,那把内部回环改成外部回环的就行了,其他的都不用改,我今天特意用例程跑了下,都是通的。
  • wubangmi 发表于 2021-11-2 11:18
    两种方式,按需采用其中的一种:
    1、在例程里屏蔽所有以下等待发送中断的代码
    //    // ...

    您好,我根据您给的建议进行了简单的尝试,但仍然无法实现CAN的外部回环通讯,不仅发送中断没有正常标志,接收中断标志位同样如此,因此怀疑数据根本没有发出去,所以猜想是否是时钟或者波特率设置出现了什么问题,想请教一下您,CAN总线的时钟源是来自外部高速振荡器,那么哪个函数可以具体表示CAN时钟源的选择呢,还有就是,如果我不使用Xtal,采用内部振荡器,那么CAN总线的时钟源又该怎么设置呢
  • Wtt小菜鸟 发表于 2021-11-2 09:53
    别沉呀,有没有哪位比较熟悉华大芯片的或者比较熟悉CAN通讯的大佬,麻烦告知一下小弟哪里出问题了 ...

    两种方式,按需采用其中的一种:
    1、在例程里屏蔽所有以下等待发送中断的代码
    //    //<< Wait transmitting done.
    //    while (false == CAN_Irq**Get(CanTxPrimaryIrq**));
    //    CAN_Irq**Clr(CanTxPrimaryIrq**);

    2、在CAN初始化后增加发送中断使能函数,其他代码不改动
    CAN_IrqCmd(CanTxPrimaryIrqEn, Enable);
  • 别沉呀,有没有哪位比较熟悉华大芯片的或者比较熟悉CAN通讯的大佬,麻烦告知一下小弟哪里出问题了
123下一页

您需要登录后才可以回复 登录 | 注册