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.

[参考译文] LAUNCHXL-F280039C:MCAN 发送和接收以 2Mbps 速度进行波特率设置

Guru**** 2448780 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1523428/launchxl-f280039c-baudrate-settings-for-mcan-transmit-and-receive-at-2mbps-speed

器件型号:LAUNCHXL-F280039C
主题:C2000WARE 中讨论的其他器件

工具/软件:

大家好、我是使用 F280039C C2000 微控制器的。 我 已将 MCAN Tx 和 Rx 的波特率配置为以下值。

数据比特率为 2Mbps。

我认为 MCAN 时钟为 120MHz
  //
  //配置 MCAN 位时钟的除数
  //
  SysCtl_setMCANClk (SysCtl_MCANCLK_DIV_3);
   
  bitTimes.nomRatePrescalar = 0x9U//标称波特率预分频器
  bitTimes.nomTimeSeg1    = 0xDU// SP 之前的标称时间段
  bitTimes.nomTimeSeg2    = 0x8U// SP 之后的标称时间段
  bitTimes.nomSynchJumpWidth = 0x8U//标称 SJW
  bitTimes.dataRatePrescale = 0x2U//数据波特率预分频器
  bitTimes.dataTimeSeg1   = 0xAU// SP 之前的数据时间段
  bitTimes.dataTimeSeg2   = 0x7U// SP 之后的数据时间段
  bitTimes.dataSynchJumpWidth = 0x7U// Data SJW
   //
  //初始化 MCAN 初始化参数。
  //
  initParams.fdMode       = 0x1U//启用 FD 操作。
  initParams.brsEnable     = 0x1U//比特率切换
                     //已启用传输。
另一个 CAN 节点是 Aurix TC387QP、运行速率为 2Mbps。
一旦我将 MCAN 连接到 Aurix、独木舟上的帧就会冻结、Tx CANFD 错误便会出现。>131 错误计数。
我怀疑波特率设置/值可能错误。
是否有任何 baudrate 计算器或脚本来验证这些值。 请提供正确的值。
提前感谢。
谢谢  
Narasimhaj
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Narsimha:

    请尝试针对 2Mbps 数据速率进行这些设置。  我假定标称速率(仲裁和控制)将为 500kbps、如 C2000Ware 的 MCAN 示例中所示、因此请恢复到以下标称速率设置:

      //
       //配置 MCAN 位时钟的除数
       //
       SysCtl_setMCANClk (SysCtl_MCANCLK_DIV_3);
      bitTimes.nomRatePrescalar  = 0x3U//标称波特率预分频器
      bitTimes.nomTimeSeg1     = 0x9U// SP 之前的标称时间段
      bitTimes.nomTimeSeg2     = 0x8U// SP 之后的标称时间段
      bitTimes.nomSynchJumpWidth  = 0x8U//标称 SJW
    计算为 2Mbps 的数据速率设置将如下所示:
      bitTimes.dataRatePrescale  = 0x0U//数据波特率预分频器
      bitTimes.dataTimeSeg1    = 0x9U// SP 之前的数据时间段
      bitTimes.dataTimeSeg2    = 0x8U// SP 之后的数据时间段
      bitTimes.dataSynchJumpWidth = 0x8U// Data SJW
    MCAN 时钟[ 120MHz 对于 F28003x、实际上为 SYSCLK=MCAN、 由函数 SysCtl_setMCANClk  (SysCtl_MCANCLK_DIV_3) 进行 3 分频]为 40MHz。  比特率的公式(同时适用于标称和数据比特率)为 (MCAN 时钟/(预分频器+1))/(TimeSeg1 + TimeSeg2 + 3)。  C2000Ware 中的 MCAN 示例使用 500kbps 作为标称速率、使用 1Mbps 作为数据速率、因此、要从 1Mbps 数据速率更改为 2Mbps、只需将预分频器从“1"更“更改为“0"。“。
    此致、
    Joseph
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Narsimha:

    答复插入代码时、是否可以使用下面工具栏上选项中的“插入“>"代码“代码“?  这样、它将具有正确的行号、并且更容易作为代码阅读。

    谢谢、

    Joseph

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

    您好 Joseph、

               我插入了代码。 谢谢你。

    时钟设置正确 120MHz /3(使用相应的 SYSCTL_MCANCLK_DIV_4 = 3U)。

    Aurix 侧 2Mbps 的波特率已正常运行。F280039C 也设置 2Mbps。

    由于 IAM 未接收到 CAN Rx 中断、我怀疑第 188 行是否导致任何问题、因为  使用了 MCAN_INTR_MASK_ALL。

    我附上了 ACK 组中断在发送中断后被清除的屏幕截图。

    如果代码中发生中断、则意味着为什么未将数据作为 IAM 接收到 CANRx 错误。

    提前感谢

    Narasimhaj

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

    尊敬的 Narsimha:

    mcan_ex4_receive 示例使用标准 ID(11 位长度)、需要消息 ID 为 4。  检查这是否是由发送节点设置的消息 ID 配置。  似乎代码正在进入 ISR 例程、但它没有接收到正确的 ID、因此无法读取消息帧。

    这是消息 ID 配置的那一部分:

        //
        // Initialize Message RAM Sections Configuration Parameters
        //
        msgRAMConfigParams.flssa                = MCAN_STD_ID_FILT_START_ADDR;
        // Standard ID Filter List Start Address.
        msgRAMConfigParams.lss                  = MCAN_STD_ID_FILTER_NUM;
        // List Size: Standard ID.
        msgRAMConfigParams.rxBufStartAddr       = MCAN_RX_BUFF_START_ADDR;
        // Rx Buffer Start Address.
        msgRAMConfigParams.rxBufElemSize        = MCAN_RX_BUFF_ELEM_SIZE;
        // Rx Buffer Element Size.
    
        //
        // Initialize Rx Buffer Configuration parameters.
        //
        stdFiltelem.sfid2              = 0x0U; // Standard Filter ID 2.
        // Configuring received frame to be stored in buffer element 0
        stdFiltelem.sfid1              = 0x4U; // Standard Filter ID 1.
        // Confifuring frames with msg ID = 0x4U to be accepted by filter element
        stdFiltelem.sfec               = 0x7U; // Store into Rx Buffer
                                               // configuration of SFT[1:0] ignored
    

    在 ISR 中、如果收到正确的消息 ID、代码将执行的分支应该是:

        //
        //  Check to see if the interrupt is caused by a message being
        //  received in dedicated RX Buffers
        //
        if((MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG & intrStatus) == MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG)
        {
            //
            // Read the NewData registers
            //
            MCAN_getNewDataStatus(MCANA_DRIVER_BASE, &newData);
    
            //  If message is received in buffer element 0
            if((newData.statusLow & (1UL << 0U)) != 0)
            {
                MCAN_readMsgRam(MCANA_DRIVER_BASE, MCAN_MEM_TYPE_BUF, 0U,
                              0, &rxMsg1);
    
                rxMsg[loopCnt] = rxMsg1;
            }
    
            //
            //  Clearing the NewData registers
            //
            MCAN_clearNewDataStatus(MCANA_DRIVER_BASE, &newData);
        }
        else
    

    此致、

    Joseph