This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28069M:CAN 初始化 CANES.bit.CCE 在启用 eCAN 时钟的情况下从不会被置位

Guru**** 2609955 points
Other Parts Discussed in Thread: CONTROLSUITE, LAUNCHXL-F28069M, MOTORWARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/687490/tms320f28069m-can-init-canes-bit-cce-never-gets-set-despite-the-enabled-ecan-clock

器件型号:TMS320F28069M
主题中讨论的其他器件:controlSUITELAUNCHXL-F28069MMOTORWARE

我将移植 controlSUITE 可以示例并将整个 InitECana()函数复制到 instaspin 代码中。 但是初始化会进入 Forever 循环... while (ECANaShady.CANES.bit.CCE!= 1)我已经读出我必须检查 SYSCTRL.PCLKCR0中的第14位、并且该位已设置(实际值为0100000100001100b)、因此 CANA 时钟应该正常工作。 如果我将存储器中的 CCE 位置位、那么程序将继续执行。 也根据示例设置了 CAN 上拉和模式。

您能告诉我哪些内容需要进一步检查吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果你"按原样"运行 controlSUITE 示例、CCE 位是否被设定? 您能否通过示波器检测 CANRX 引脚的逻辑电平?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在尝试初始化 eCANA 之前、CANRX 和 CANTX 引脚均为高电平。 我需要一些时间来尝试 controlSUITE、因为我以前没有设置环境。 我将在测试后报告它。 如果您对引脚逻辑电平有一些看法、请分享。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 CANRX 管脚被感测到高电平(总线空闲状态)、CCE 位应该被置位。 您能否布置连接到 CAN 引脚的电路以及显示引脚电平的示波器截图?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    电路连接与 LAUNCHXL-F28069M 上的电路连接相同。 我还插入了 Launchpad 并立即进行实验。 我从 CANRX 引脚连接示波器快照。

    这是 hal.c 中的 ECAN 初始化代码

    //可以设置
    GPIO_setXA 上拉(obj->gpioHandle、GPIO_Number_30、GPIO_Pullup_Enable);
    GPIO_setPullup (obj->gpioHandle、GPIO_Number_31、GPIO_Pullup_Enable);
    GPIO_setQualification (obj->gioHandle、GPIO_Number_30、gpio_31、gpio_mode
    
    
    
    
    
    、gpio_31、gpio_Enable);gpio_gpio_30_gpio_gpio_gpio_gpio_gpio_mode;gpio_gpio_30_gpio_gpio_gp30_gpio_gpio_gpio_gpio_gpio_gpio_gpio_gp 

    以下是 hal.c 中 CAN 的时钟源:

    clk_enableEcanaClock (obj->clkHandle); 

    我卡在以下代码的最后一个循环中:

    struct eCAN-regs ECANaShadow;
    
    enable_protected_register_write_mode;// EALLOW 启用对受保护位的访问
    
    权限//使用 eCAN regs*/
    
    ECANaShade.CANTIoc.all = ECANaRegs.CANTIoc.all;
    EUNC CANaShadow 1.CANTIoc.all = CANTIOC.EAR.CANTAN.ALL;EUNC.CANTCLAN.CANTIOC.REG.CANTAL.ALL
    
    
    = CANTIOC.CANTAN.CANTAN.ALL;EUNC = CANTANAROCON.CANTAN.CANTRON.CANTROC.CAN.CANTROCON.CANTAN.ALL;CANTAN.CANTCON.CANTRON.CANTRON.CANTAN.CANTAN.
    
    ECanaRegs.CANRIOC.ALL = ECanaShadure.CANRIOC.ALL;
    
    //将 eCAN 配置为 HECC 模式-(需要访问邮箱16到31)*//
    HECC 模式也启用时间戳功能
    
    ECanaShading.CANReg.All = ECanaRegs.CANMC.ALL;ECANAECM.CANB
    = CANTANAN.CAN.CANTANCE.ALL
    ;ECANTANCE.CANTANCE.CANTANCE.CAN.CANMC.
    
    /*将"消息控制寄存器"的所有位初始化为零*//
    MSGCTRL 寄存器的某些位出现在未知状态。 为了正常运行、
    //必须将 MSGCTRL 的所有位(包括保留位)初始化为0
    
    ECANaMboxs.MBOX0.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX1.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX2.MSGCTRL.ALL = 0x00000000;ECAN000000.MBOL.M0000.MBOL.M=0x0000X4.M0000.MBOOX4.X4.M0000.MBOX4.MBO箱
    
    
    ECANaMboxs.MBOX5.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX6.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX7.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX8.MSGCTRL.ALL = 0x00000000;
    ECANX9.M0000.MQANALL = 0x00000000
    ECANaMboxs.MBOX10.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX11.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX12.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX13.MSGCTRL.ALL = 0x00000000;
    ECANX14.MQANALL = 0x00000000
    ECANaMboxs.MBOX15.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX16.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX17.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX18.MSGCTRL.ALL = 0x00000000;
    EMX0000.MBOL.M19;EMCAX0000.MBOO箱
    ECANaMboxs.MBOX20.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX21.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX22.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX23.MSGCTRL.ALL = 0x00000000;ECANX24.MMSGCTRL.MBOO箱
    
    ECANaMboxs.MBOX25.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX26.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX27.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX28.MSGCTRL.ALL = 0x00000000;
    ECANX29.M000000
    ECANaMboxs.MBOX30.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX31.MSGCTRL.ALL = 0x00000000;
    
    // TAN、RMPn、GIFn 位在复位时均为零、并作为
    预防措施再次清零//。
    
    ECANARegs.CANTA ALL = 0xFFFFFFFF;//清除所有 Tan 位*/
    
    ECANARegs.CANRMP.ALL = 0xFFFFFFFF;//清除所有 RMPn 位*/
    
    ECANaRegs.CANGIF0.ALL = 0xCANARegs.CANGIFFF;//清除所有中断标志位*/
    ECANCANAREGL.MC.ALL
    
    = 0xCANCANGIF0.NOT.CANCANGIF0*= 0xCANCANCANCE.REGL.CAN_TRL.CAN_TRFF.REGANCE.NOT.CAN_TRENTRL.CAN_TRFF.CAN_TRENTRENTRFF.CAN_TRENTRFF.CAN_TRENTRENTRIF.ANCE.NOR = 0xCAN_TRY= 0xCANCANCANCANCAN
    
    
    
    //设置 CCR = 1
    ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
    
    //等待 CPU 被授予更改配置寄存
    
    
    
    器的权限,执行{ ECanaShading.canes.all = ECanaRegs.canes.all;} while (ECanaShading.canes.bit.= 1);等待 CCE 位被设置。// 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我可以确认 controlSUITE 的 example_2806xECanBack2Back 在此 Launchpad 上成功运行。 结论是、我的端口到 Motorware 有问题。 您能为我提供如何正确移植代码的指导吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我找到了问题的解决方案。

    我必须将此定义分离为实验项目中的新文件 CAN.c。

    #include "sw/drivers/CAN/src/32b/F28x/f2806x/can.h"
    
    #pragma DATA_SECTION (ECanaRegs、"ECANaRegsFile");
    volatile struct ECAN_regs ECANaRegs;
    
    #pragma DATA_SECTION (ECanaMboxes、"ECANaMesbox");ECCAN_OMBO 文件
    ;volatile pragma DATA_SECTION 

    然后、我必须复制实验项目目录中的文件 F2806x_Headers_nonBIOS.cmd。 之所以需要这样 做、是因为 controlSUITE 和 Motorware HAL 的存储器映射组织不同(我个人更喜欢后者)。 从 controlSUITE 复制的其余代码正常工作。