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.

[参考译文] F29H85X-EVM SOM:mcan_ex6_transmit_syscfg 不工作

Guru**** 2473260 points
Other Parts Discussed in Thread: TMDSHSECDOCK, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1472825/f29h85x-som-evm-mcan_ex6_transmit_syscfg-not-working

器件型号:F29H85X-EVM SOM
主题中讨论的其他器件: TMDSHSECDOCKSysConfig

工具与软件:

大家好!

首先、这是我使用的硬件:

  • F29H85X-MCU114E1-002 SOM
  • MCU134A 适配器
  • XDS110调试器
  • TMDSHSECDOCK 修订版 F
  • NCV7351 CANFD 收发器

因此、在这个背景下、我可以告诉您、我更改了 SysConfig 以匹配 HSEC 引脚80和82、我确实将这些引脚从瞬变器连接到 TX 和 RX 引脚。

/**
 * These arguments were used when this file was generated. They will be automatically applied on subsequent loads
 * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
 * @cliArgs --device "F29H85x" --part "F29H85x_256ZEX" --package "256ZEX" --context "CPU1" --product "MCU_SDK_F29H85x@1.00.00.00"
 * @v2CliArgs --device "F29H850TU" --package "256ZEX" --variant "TMS320F29H850TU9" --context "CPU1" --product "MCU_SDK_F29H85x@1.00.00.00"
 * @versions {"tool":"1.22.0+3893"}
 */

/**
 * Import the modules used in this configuration.
 */
const clocktree = scripting.addModule("/driverlib/clocktree.js");
const jtag      = scripting.addModule("/driverlib/jtag.js");
const mcan      = scripting.addModule("/driverlib/mcan.js", {}, false);
const mcan1     = mcan.addInstance();

/**
 * Write custom configuration values to the imported modules.
 */
const divider8       = system.clockTree["MCANACLKDIV"];
divider8.divideValue = 10;

const divider15       = system.clockTree["PLL_REFDIV"];
divider15.divideValue = 1;

const multiplier1         = system.clockTree["PLL_IMULT"];
multiplier1.multiplyValue = 40;

const mux7       = system.clockTree["OSCCLKSRCSEL"];
mux7.inputSelect = "INTOSC2";


mcan1.$name                   = "myMCAN0";
mcan1.additionalCoreConfig    = true;
mcan1.stdFiltsUsed            = [0];
mcan1.loopbackMode            = false;
mcan1.nomRatePrescalar        = 0;
mcan1.nomTimeSeg1             = 9;
mcan1.nomTimeSeg2             = 8;
mcan1.nomSynchJumpWidth       = 8;
mcan1.dataRatePrescalar       = 0;
mcan1.mcan.$assign            = "MCAND";
mcan1.mcan.mcan_rxPin.$assign = "GPIO68";
mcan1.mcan.mcan_txPin.$assign = "GPIO67";
mcan1.periphClock.$name       = "driverlib_perClock0";
mcan1.periphConfig.$name      = "driverlib_perConfig0";
mcan1.stdFilt0.$name          = "stdFilt0";
mcan1.stdFilt0.sfec           = "MCAN_STDFILTEC_RXBUFF";
mcan1.stdFilt0.sfid1          = 4;

/**
 * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
 * version of the tool will not impact the pinmux you originally saw.  These lines can be completely deleted in order to
 * re-solve from scratch.
 */
jtag.JTAG.$suggestSolution        = "JTAG";
jtag.JTAG.tdoPin.$suggestSolution = "GPIO223/TDO";
jtag.JTAG.tdiPin.$suggestSolution = "GPIO222/TDI";

我知道这样一个事实、即代码在这段时间有库存:

这是因为 MCAN_TXBRP 为2、所以这意味着缓冲区仍处于等待发送的状态。

我只是想再次确认一下、我没有错过硬件上任何其他与 CAN 相关的更改。

感谢您的支持、

Martin

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

    尊敬的 Martin:

    一些问题、有助于我们开始调试您的问题。

    项目/应用程序的目标是什么?

    您是否从特定的 mCAN 示例开始、并验证它是否能与当前的硬件(默认板载 CAN 收发器)配合使用?

    您是否能够在当前示例中启用环回模式、并验证控制器/缓冲器运行是否正确、而不受收发器的影响?

     NCV7351如何连接到 MCAND TX/RX 引脚?

    感谢您提供更多信息。

    此致、

    Zackary Fleenor

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

    您好!

    感谢您回答您的问题:
    项目/应用程序的目标是什么?  

    -我想为 MCAN 开发一个 CAN 层(我们在其他传统项目中有 DCAN )。

    您是否从特定的 MCAN 示例开始、并验证它是否能与当前的硬件(默认板载 CAN 收发器)配合使用?

    -是的回送示例( mcan_ex6_transmit_syscfg )工作的问题是当我取消该回送。

    您是否能够在当前示例中启用环回模式、并验证控制器/缓冲器运行是否正确、而不受收发器的影响?

    -是的,它的工作只要长不是没有回送

     NCV7351如何连接到 MCAND TX/RX 引脚?

    -使用 TMDSHSECDOCK 修订版 F 引脚80为 RX、引脚82为 TX

    此外、 在示例 mcan_ex6_transmit_syscfg 中 、我在 Tx 和 Rx 的示波器上测量该值。

    TX 始终为高电平、Rx 始终为低电平。

     

    谢谢!

    Martin

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

    嗨、Martin、

    感谢您提供更多信息。 您能否确认  R25/R26/R27和 R29/R45/R54的硬件电阻器配置?

    这些开关控制将 GPIO67/68路由至 CANTX/RX 还是 GPIO64/65。 这种情况下应使用默认配置。

    屏幕截图取自 https://www.ti.com/lit/df/sprm870b/sprm870b.pdf

    此致、

    Zackary Fleenor

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

    您好、Zackary、

    今天早些时候、我做了一个小示例程序来切换 GPIO67和 CPIO68、它很有效。

    那么我知道这些引脚将路由到输出。

    我可以执行任何其他与硬件或软件相关的操作来进行测试?

    谢谢!

    Martin

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

    您好!

    有更新吗?

    谢谢!

    Martin

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

    Martin、您好!

    很高兴您能够验证到这些引脚的正确硬件连接。 当前信息中没有什么明显的突出之处。

    您能否提供 mcan_ex6_transmit_syscfg.c 文件和 MCAN 初始化代码的其余部分以进行额外审查?

    MCAN 初始化完成后、您是否可以确认 GPIO67/68多路复用器模式配置?

    此致、

    Zackary Fleenor

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

    您好、Zackary、

    这是我正在使用的代码、与示例中的代码相同、只是做了一些修改、以实现对 GPIO 的测试:

    #include "board.h"
    #include "gpio.h"
    
    uint32_t counter = 0;
    
    void TogglePair() 
    {
      GPIO_togglePin(PINRX);
      GPIO_togglePin(PINTX);
    }
    
    //
    //  main function
    //
    
    int main(void) {
      MCAN_TxBufElement txMsg;
    
      //
      // Initialize device clock, peripheral clocks and interrupts
      //
      Device_init();
    
      //
      // Board initialization
      //
      Board_init();
    
      TogglePair();
    
      //
      // Initialize message to transmit.
      //
      txMsg.id = ((uint32_t)(0x4)) << 18U; // Identifier Value.
      txMsg.rtr = 0U;                      // Transmit data frame.
      txMsg.xtd = 0U;                      // 11-bit standard identifier.
      txMsg.esi = 0U;   // ESI bit in CAN FD format depends only on error
                        // passive flag.
      txMsg.dlc = 4U;   // CAN + CAN FD: transmit frame has 0-8 data bytes.
      txMsg.brs = 1U;   // CAN FD frames transmitted with bit rate
                        // switching.
      txMsg.fdf = 1U;   // Frame transmitted in CAN FD format.
      txMsg.efc = 1U;   // Store Tx events.
      txMsg.mm = 0xAAU; // Message Marker.
    
      //
      // Data bytes.
      //
      txMsg.data[0] = 0x12;
      txMsg.data[1] = 0x34;
      txMsg.data[2] = 0x56;
      txMsg.data[3] = 0x78;
    
      //
      // Write Tx Message to the Message RAM.
      //
      MCAN_writeMsgRam(myMCAN0_BASE, MCAN_MEM_TYPE_BUF, 1U, &txMsg);
    
      //
      // Add request for transmission.
      //
      MCAN_txBufAddReq(myMCAN0_BASE, 1U);
    
      //
      // Wait for the transmission to be complete
      //
      while (MCAN_getTxBufReqPend(myMCAN0_BASE)) 
      {
        if(counter > 200000)
        {
            TogglePair();
            counter = 0;
        }
        counter++;
      }
    
      //
      // Stop Application.
      //
      ESTOP0;
    }
    

    这是 syscfg 文件:

    /**
     * These arguments were used when this file was generated. They will be automatically applied on subsequent loads
     * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
     * @cliArgs --device "F29H85x" --part "F29H85x_256ZEX" --package "256ZEX" --context "CPU1" --product "MCU_SDK_F29H85x@1.00.00.00"
     * @v2CliArgs --device "F29H850TU" --package "256ZEX" --variant "TMS320F29H850TU9" --context "CPU1" --product "MCU_SDK_F29H85x@1.00.00.00"
     * @versions {"tool":"1.22.0+3893"}
     */
    
    /**
     * Import the modules used in this configuration.
     */
    const clocktree = scripting.addModule("/driverlib/clocktree.js");
    const gpio      = scripting.addModule("/driverlib/gpio.js", {}, false);
    const gpio1     = gpio.addInstance();
    const gpio2     = gpio.addInstance();
    const jtag      = scripting.addModule("/driverlib/jtag.js");
    const mcan      = scripting.addModule("/driverlib/mcan.js", {}, false);
    const mcan1     = mcan.addInstance();
    
    /**
     * Write custom configuration values to the imported modules.
     */
    const divider8       = system.clockTree["MCANACLKDIV"];
    divider8.divideValue = 10;
    
    const divider15       = system.clockTree["PLL_REFDIV"];
    divider15.divideValue = 1;
    
    const multiplier1         = system.clockTree["PLL_IMULT"];
    multiplier1.multiplyValue = 40;
    
    const mux7       = system.clockTree["OSCCLKSRCSEL"];
    mux7.inputSelect = "INTOSC2";
    
    gpio1.$name             = "PINTX";
    gpio1.direction         = "GPIO_DIR_MODE_OUT";
    gpio1.writeInitialValue = true;
    gpio1.initialValue      = 1;
    gpio1.gpioPin.$assign   = "GPIO23";
    
    gpio2.direction         = "GPIO_DIR_MODE_OUT";
    gpio2.writeInitialValue = true;
    gpio2.$name             = "PINRX";
    gpio2.gpioPin.$assign   = "GPIO9";
    
    
    mcan1.$name                   = "myMCAN0";
    mcan1.additionalCoreConfig    = true;
    mcan1.stdFiltsUsed            = [0];
    mcan1.loopbackMode            = false;
    mcan1.nomRatePrescalar        = 0;
    mcan1.nomTimeSeg1             = 9;
    mcan1.nomTimeSeg2             = 8;
    mcan1.nomSynchJumpWidth       = 8;
    mcan1.dataRatePrescalar       = 0;
    mcan1.mcan.$assign            = "MCAND";
    mcan1.mcan.mcan_rxPin.$assign = "GPIO68";
    mcan1.mcan.mcan_txPin.$assign = "GPIO67";
    mcan1.periphClock.$name       = "driverlib_perClock0";
    mcan1.periphConfig.$name      = "driverlib_perConfig0";
    mcan1.stdFilt0.$name          = "stdFilt0";
    mcan1.stdFilt0.sfec           = "MCAN_STDFILTEC_RXBUFF";
    mcan1.stdFilt0.sfid1          = 4;
    
    /**
     * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
     * version of the tool will not impact the pinmux you originally saw.  These lines can be completely deleted in order to
     * re-solve from scratch.
     */
    jtag.JTAG.$suggestSolution        = "JTAG";
    jtag.JTAG.tdoPin.$suggestSolution = "GPIO223/TDO";
    jtag.JTAG.tdiPin.$suggestSolution = "GPIO222/TDI";
    

    这是多路复用器配置:

    谢谢!

    Martin

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

    您好!  

    为了完成这个线程、几天前、我发现收发器分线板上的一个跳线连接器松动、并且从 TI 角度来看、这个示例的文档很错误、因为这个示例显示比特率为1000Mbps 和2000Mbps (实际上是500和1000)。

    在更改跳线连接并将独木舟仿真上的波特率校正为实际比特率后、现在该示例正在工作。

    我建议 TI 更正文档或更改 syscfg 文件以与文档匹配。

    谢谢!

    Martin