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.

[参考译文] TCAN4551-Q1:位时序设置

Guru**** 1712740 points
Other Parts Discussed in Thread: MSP-EXP430FR5994, TCAN4550, BOOSTXL-CANFD-LIN, MSP-EXP430FR6989
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1186796/tcan4551-q1-bit-timing-setup

器件型号:TCAN4551-Q1
主题中讨论的其他器件:MSP-EXP430FR5994TCAN4550

我有一个修改版本的 TCAN 演示、可与 MSP-EXP430FR5994和 TCAN4550 EVM 配合使用。 我可以在 PCAN 分析仪上看到 CAN 数据包。

定制 PCB 具有 TCAN4551芯片和20MHz 振荡器。 我需要有关设置 TCAN 寄存器和 PCAN 分析仪设置的帮助、因为同一个演示项目不会在 PCAN 分析仪上生成 CAN 数据包。 CAN SPI CLK 为2MHz。 这是否意味着 CAN 比特率为2kbps? 下面粘贴的是我在 PCAN 分析器中的设置。

我尝试将器件配置中的 CLK_REF 更改为0、但没有任何变化。

现有的生产 PCB 还在 TCAN 芯片上使用了一个20MHz 晶体。 以下是如何在此项目中设置 TCAN 驱动程序:

    TCAN4x5x_Device_ClearSPIERR();                              // Clear any SPI ERR flags that might be set as a result of our pin mux changing during MCU startup

    /* Step one attempt to clear all interrupts */
    TCAN4x5x_Device_Interrupt_Enable dev_ie = {
        .word = 0x0UL
    };
    TCAN4x5x_Device_ConfigureInterruptEnable(&dev_ie);          // Disable all non-MCAN related interrupts for simplicity

    TCAN4x5x_Device_Interrupts dev_ir = {
        .word = 0x0UL
    };                                                          // Setup a new MCAN IR object for easy interrupt checking
    TCAN4x5x_Device_ReadInterrupts(&dev_ir);                    // Request that the struct be updated with current DEVICE (not MCAN) interrupt values

    // If the Power On interrupt flag is set
    if (dev_ir.PWRON) {
        TCAN4x5x_Device_ClearInterrupts(&dev_ir);               // Clear it because if it's not cleared within ~4 minutes, it goes to sleep
    }

    /* Configure the CAN bus speeds */
    TCAN4x5x_MCAN_Nominal_Timing_Simple TCANNomTiming = {
        .NominalBitRatePrescaler    = 1,
        .NominalTqBeforeSamplePoint = 32,
        .NominalTqAfterSamplePoint  = 8
    };  // 500k arbitration with a 20 MHz crystal ((20E6 / 2) / (32 + 8) = 500E3)

    TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming = {
        .DataBitRatePrescaler = 1,
        .DataTqBeforeSamplePoint = 15,
        .DataTqAfterSamplePoint = 5
    };  // 1 Mbps CAN FD with a 40 MHz crystal (40E6 / (15 + 5) = 2E6)

    /* Configure the MCAN core settings */
    TCAN4x5x_MCAN_CCCR_Config cccrConfig = {
        .FDOE = FDOE_CONFIG,  // Configure CAN FD mode
        .BRSE = BRSE_CONFIG   // Configure CAN BRS
    };

    /* Configure the default CAN packet filtering settings */
    TCAN4x5x_MCAN_Global_Filter_Configuration gfc = {
        .RRFE = 1,                              // Reject remote frames (TCAN4x5x doesn't support this)
        .RRFS = 1,                              // Reject remote frames (TCAN4x5x doesn't support this)
        .ANFE = TCAN4x5x_GFC_REJECT,            // Default behavior if incoming message doesn't match a filter is to reject (29-bit)
        .ANFS = TCAN4x5x_GFC_REJECT,            // Default behavior if incoming message doesn't match a filter is to put if FIFO1 (11-bit)
    };

    /* ************************************************************************
     * In the next configuration block, we will set the MCAN core up to have:
     *   - 2 SID filter element
     *   - 1 XID Filter element (disabled)
     *   - 64 RX FIFO 0 elements (max size)
     *   - RX FIFO 0 supports data payloads up to 64 bytes
     *   - RX FIFO 1 and RX Buffer will not have any elements, but we still set their data payload sizes, even though it's not required
     *   - No TX Event FIFOs
     *   - 2 Transmit buffers supporting up to 64 bytes of data payload
     */

    TCAN4x5x_MRAM_Config MRAMConfiguration = {
        .SIDNumElements = 2,                        // Standard ID number of elements, you MUST have a filter written to MRAM for each element defined
        .XIDNumElements = 1,                        // Extended ID number of elements, you MUST have a filter written to MRAM for each element defined
        .Rx0NumElements = 2,                        // RX0 Number of elements
        .Rx0ElementSize = MRAM_8_Byte_Data,         // RX0 data payload size
        .Rx1NumElements = 64,                       // RX1 number of elements
        .Rx1ElementSize = MRAM_8_Byte_Data,         // RX1 data payload size
        .RxBufNumElements = 0,                      // RX buffer number of elements
        .RxBufElementSize = MRAM_8_Byte_Data,       // RX buffer data payload size
        .TxEventFIFONumElements = 0,                // TX Event FIFO number of elements
        .TxBufferNumElements = 2,                   // TX buffer number of elements
        .TxBufferElementSize = MRAM_8_Byte_Data     // TX buffer data payload size
    };

    /* Configure the MCAN core with the settings above, the changes in this block are write protected registers,      *
     * so it makes the most sense to do them all at once, so we only unlock and lock once                             */

    TCAN4x5x_MCAN_EnableProtectedRegisters();                   // Start by making protected registers accessible
    TCAN4x5x_MCAN_ConfigureCCCRRegister(&cccrConfig);           // Enable FD mode and Bit rate switching
    TCAN4x5x_MCAN_ConfigureGlobalFilter(&gfc);                  // Configure the global filter configuration (Default CAN message behavior)
    TCAN4x5x_MCAN_ConfigureNominalTiming_Simple(&TCANNomTiming);// Setup nominal/arbitration bit timing
    TCAN4x5x_MCAN_ConfigureDataTiming_Simple(&TCANDataTiming);  // Setup CAN FD timing
    TCAN4x5x_MRAM_Clear();                                      // Clear all of MRAM (Writes 0's to all of it)
    TCAN4x5x_MRAM_Configure(&MRAMConfiguration);                // Set up the applicable registers related to MRAM configuration
    TCAN4x5x_MCAN_DisableProtectedRegisters();                  // Disable protected write and take device out of INIT mode

    /* Set the interrupts we want to enable for MCAN */
    TCAN4x5x_MCAN_Interrupt_Enable mcan_ie = {
        mcan_ie.RF0NE = 1,                                       // RX FIFO 0 new message interrupt enable
    };
    TCAN4x5x_MCAN_ConfigureInterruptEnable(&mcan_ie);           // Enable the appropriate registers

    extern const uint16_t SET_BALANCE_VOLTAGE_BASE;
    // Send Balancing Setpoint Frames From Watchdog to FIFO #0
    TCAN4x5x_MCAN_SID_Filter SID_ID = {
        .SFT    = TCAN4x5x_SID_SFT_CLASSIC,
        .SFEC   = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0,
        .SFID1  = SET_BALANCE_VOLTAGE_BASE,                     // SFID1
        .SFID2  = SET_BALANCE_VOLTAGE_BASE                      // SFID2
    };
    TCAN4x5x_MCAN_WriteSIDFilter(0, &SID_ID);                   // Write to the MRAM

    // Send std frames to FIFO #1.  This is dynamically set by
    SID_ID.SFT   = TCAN4x5x_SID_SFT_RANGE;
    SID_ID.SFEC  = TCAN4x5x_SID_SFEC_PRIORITYSTORERX1;
    SID_ID.SFID1 = 0x200;                                       // SFID1
    SID_ID.SFID2 = 0x20F;                                       // SFID2
    TCAN4x5x_MCAN_WriteSIDFilter(1, &SID_ID);                   // Write to the MRAM

    /* Store ID 0x12345678 as a priority message */
    TCAN4x5x_MCAN_XID_Filter XID_ID = {
        .EFT = TCAN4x5x_XID_EFT_RANGENOMASK,                    // Don't filter (id values are Don't cares)
        .EFEC = TCAN4x5x_XID_EFEC_REJECTMATCH,                  // Ignore
        .EFID1 = 0x12345678,                                    // EFID1 (Classic mode filter)
        .EFID2 = 0x1FFFFFFF                                     // EFID2 (Classic mode mask)
    };
    TCAN4x5x_MCAN_WriteXIDFilter(0, &XID_ID);                   // Write to the MRAM

    /* Configure the TCAN4550 Non-CAN-related functions */
    TCAN4x5x_DEV_CONFIG devConfig = {
        .SWE_DIS          = 0,                                      // Keep Sleep Wake Error Enabled (it's a disable bit, not an enable)
        .DEVICE_RESET     = 0,                                      // Not requesting a software reset
        .WD_EN            = 0,                                      // Watchdog disabled
        .nWKRQ_CONFIG     = 0,                                      // Mirror INH function (default)
        .INH_DIS          = 0,                                      // INH enabled (default)
        .GPIO1_GPO_CONFIG = TCAN4x5x_DEV_CONFIG_GPO1_MCAN_INT1,     // MCAN nINT 1 (default)
        .FAIL_SAFE_EN     = 0,                                      // Failsafe disabled (default)
        .GPIO1_CONFIG     = TCAN4x5x_DEV_CONFIG_GPIO1_CONFIG_GPO,   // GPIO set as GPO (Default)
        .WD_ACTION        = TCAN4x5x_DEV_CONFIG_WDT_ACTION_nINT,    // Watchdog set an interrupt (default)
        .WD_BIT_RESET     = 0,                                      // Don't reset the watchdog
        .nWKRQ_VOLTAGE    = 0,                                      // Set nWKRQ to internal voltage rail (default)
        .GPO2_CONFIG      = TCAN4x5x_DEV_CONFIG_GPO2_NO_ACTION,     // GPO2 has no behavior (default)
        .CLK_REF          = 1,                                      // Input crystal is a 40 MHz crystal (default)
        .WAKE_CONFIG      = TCAN4x5x_DEV_CONFIG_WAKE_BOTH_EDGES     // Wake pin can be triggered by either edge (default)
    };
    TCAN4x5x_Device_Configure(&devConfig);                          // Configure the device with the above configuration
    TCAN4x5x_Device_SetMode(TCAN4x5x_DEVICE_MODE_NORMAL);           // Set to normal mode, since configuration is done. This line turns on the transceiver
    TCAN4x5x_MCAN_ClearInterruptsAll();                             // Resets all MCAN interrupts (does NOT include any SPIERR interrupts)

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

    您好、Priya、

    SPI 比特率与 CAN 比特率无关。  应用于 OSC1和 OSC2引脚的晶体振荡器或单端时钟用于操作数字内核和 CAN 控制器。

    20MHz 时钟将用于创建 CAN 位时间。  单个时钟周期所需的时间被称为"最小时间量子"(mtq)、因为这是可以产生的最小时间量。

    可以对时钟应用预分频器、以降低用于创建时间量子(tq)的时钟频率。  如果预分频器被设定为1、那么1tq = 1mtq。  如果使用2的预分频器、则1tq = 2mtq。

    CAN 位具有多个段、这些段由整数个时间量(tq)组成。  要实现特定的数据速率、只需为每个段配置正确的 tq 数。  因此、要实现特定的比特率或比特周期、您需要计算创建特定时间长度的比特周期所需的 tq 数。  

    40MHz 时钟将创建两倍的 mtq 20MHz 时钟将在给定的时间段内创建。  因此、使用40MHz 时钟创建的 CAN 位时间与20MHz 时钟相比、该位可用的 tq 将是该位的两倍。  

    例如、要创建2Mbps CAN FD 位速率、只需将时钟频率除以所需的位速率频率(请注意、它必须产生整数值)。

    20MHz/2MHz = 10tq

    40MHz/2MHz = 20tq

    位周期中用于对位进行采样的特定位置是通过分配该位置之后的 tq 和 tq 的数量来设置的。  通常、采样点介于70-80%之间。  对于该点、所有器件都必须匹配、否则可能会发生位错误。

    至此、您只需使 TCAN4550设置与您的 PCAN 分析仪设置相匹配。  您的代码看起来像是使用20MHz 时钟进行标称或仲裁比特率计算和设置、然后使用40MHz 时钟进行 CAN FD 数据比特率设置。  因此、您需要将"数据计时"更改为以下内容:

    TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming ={
           .DataBitRatePrescaler = 1、
           .DataTqBeforeSamplePoint = 7、
           .DataTqAfterSamplePoint = 3.
       }; //具有20MHz 晶体的2Mbps CAN FD (20E6 /(7 + 3)= 2E6)

    我将注意到、对于比特率、PCAN 分析仪似乎显示的 tq 太少。  CAN 位有4个部分、分别是同步段、Prop 段、Phase1段和 Phase2段。  Sync 段始终为1 tq。  Prop 和 Phase1段通常组合为一个单一分组、作为采样点前的 tq 量(在同步段之后)。  然后、Phase2就是采样点后的 tq 数。  看起来、PCAN 分析器软件假定同步段、因此总 tq 显示值比总 tq 少1、并且与您可以分配的 tq 量相关。

    TCAN4550的 DataTqBeforeSamplePoint 演示代码设置将 SYNC SEg 作为其值的一部分、这样代码中只有2组需要考虑、并且只需将两个数字相加即可验证 tq 的数量是否正确(即7+3=10)。

    SJW 是同步跳转宽度通常始终设置为与 Phase2相同的值。

    我希望这清楚地说明了如何确定设置以创建任何比特率。

    此外、如我刚才所述、更改 CLK_REF 设置也不会更改 CAN 位时序。  它用于告知 TCAN4550应用了哪个时钟频率、以便能够为内部计时器(例如看门狗和其他失效防护超时计时器)使用适当的内部时钟分频器。 如果您不调整 CLK_REF 以匹配时钟频率、这些计时器仍然可以工作、但时间与数据表不匹配。  

    此致、

    Jonathan

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

    Jonathan、

    感谢您的详细解释。 我将使用2MHz SPI 时钟保持与现有生产软件相同的1Mbps CAN 比特率。 将您的解释应用于生产固件中的 CAN 设置、标称位速率似乎为500kbps、CAN 数据速率为1Mbps。 我希望在新的 PCB 中保留该值。 如果我的理解不正确、请更正。  

      /* Configure the CAN bus speeds */
        TCAN4x5x_MCAN_Nominal_Timing_Simple TCANNomTiming = {
            .NominalBitRatePrescaler    = 1,
            .NominalTqBeforeSamplePoint = 32,
            .NominalTqAfterSamplePoint  = 8
        };  // 500k arbitration with a 20 MHz crystal ((20E6 / 2) / (32 + 8) = 500E3)
    
        TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming = {
            .DataBitRatePrescaler = 1,
            .DataTqBeforeSamplePoint = 15,
            .DataTqAfterSamplePoint = 5
        };  // 1 Mbps CAN FD with a 40 MHz crystal (40E6 / (15 + 5) = 2E6)
    

    我已将 PCAN 分析器设置为与数据速率匹配。 PCAN 分析器对 标称位速率应用一个5的预分频器、尽管我没有选择这个。 我使用这些设置运行了 TCAN 驱动程序固件、PCAN 分析器报告 BUSHEAVY 状态。 当我更改固件中的标称位速率预分频器以匹配 PCAN 分析器、相同状态时、它没有什么不同。

     /* Configure the CAN bus speeds */
        TCAN4x5x_MCAN_Nominal_Timing_Simple TCANNomTiming = {
            .NominalBitRatePrescaler    = 5,
            .NominalTqBeforeSamplePoint = 6,
            .NominalTqAfterSamplePoint  = 2
        };  // 500k arbitration with a 20 MHz crystal ((20E6 / 2) / (32 + 8) = 500E3)

    已确认到 TCAN4551的电源连接正常、并且传入的 SPI 信号也正常。 CAN 驱动程序设置还有什么问题?

    谢谢、

    Priya

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

    您好、Priya、

    通常、最佳做法是尝试使用尽可能多的 tq、因为这样可以提高采样点在位周期内的精度和位置。  因此、当使用1的分频器时、如果使用20M 时钟、500k 位将具有40tq。  示例代码显示了32 - 8的拆分代码、提供了80%的采样点。  但是、PCAN 显示了75%的采样点、这不是匹配项。  我们希望尝试匹配采样点。

    因此、您可以将 TCAN4550分配调整为30 - 10的拆分、从而提供75%的采样点以匹配 PCAN 分析器。

    我不知道您是否可以手动更改预分频器、还是 PCAN 分析仪中标称设置的 tq 数量、但如果您可以使用每位40tq、这会更好。

    您还可以在 TCAN4550中使用相同的设置、并应用5的预分频器并为每个标称位分配8tq、但通常优先选择每位更多 tq。

    您调整后的位时序在代码中对我来说是正确的。  但是、我可能建议您更新注释、以将40MHz 计算详细信息替换为20MHz 计算。  这可能有助于将来参考并避免混淆。

    关于 BUSHEAVY 状态、我从所读出的内容中了解到、这可能来自错误或不兼容的器件设置、这些设置会阻止节点正确解码和确认其他节点发送的消息、或者总线上的数据或消息过多。  错误的总线终端也可能导致此错误。

    您能否在 CAN 总线信号上放置一个示波器来验证两个器件发送的消息的位时间是否相同?  如果是、您可以共享这些图吗?

    您还能验证设置的任何位的 TCAN 状态和中断寄存器、并共享这些值吗?  寄存器:0x000C、0x0820和0x0824。 我还想回顾一下工作模式和引脚配置寄存器0x0800以及 MCAN 控制寄存器0x1018。  错误计数器寄存器0x1040和协议状态寄存器0x1044也将帮助处理任何 CAN 特定错误。

    此致、

    Jonathan

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

    我正在等待焊接跳线的 PCB 查看 CAN/SPI 线路。 同时、这里是 IDE 报告寄存器值的内容。 您能否对 SPI 和其他寄存器进行注释?

    我查看了 TCAN4551数据表。 读取寄存器时有 MISO 活动。 SPI 器件 ID 和版本与数据表相匹配。 SPI 状态为0x8表示内部访问处于活动状态,这看起来不像 SPI 错误。

     

    协议状态寄存器(0x1044)报告错误。  但 ECR 寄存器(0x1040)没有计算错误。 我对其他 CAN 设置寄存器的了解不够。

    示波器跟踪显示的位宽为500kbps。 CH3为 CANH、CH2为 CANL。 我在示波器上使用了数学函数来显示差分。

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

    您好、Priya、

    实际上、PSR 寄存器(0x1044)没有显示任何错误。  置位的位只是表示自该寄存器上次读取访问以来、最后一个错误代码中存在"无变化"。  活动位表示总线空闲并且器件此时既不发送也不接收。

    我注意到控制寄存器(器件地址为0x1018的 CCCR)显示的值为0x0。  默认情况下、CAN FD 运行被禁用、并且 FD 运行使能(FDOE 位8)和位速率开关使能(BRSE 位9)必须同时设置为"1"才能发送或接收 CAN FD 消息。  如果这些位设置为"0"、则 CAN 控制器会在任何 CAN FD 消息处引发错误。  因此、我建议将这些位设置为"1"并查看通信错误是否改善。

    您是否还可以将中断寄存器(器件地址0x0820)添加到您正在监控的寄存器列表中?  寄存器0x0820显示了 TCAN4550器件的中断和状态位、这些位不是特定于 MCAN 的。  寄存器0x0824显示 MCAN 特定的中断、这只是 MCAN 中断寄存器0x1050的只读副本。  寄存器0x0824中的这一只读副本与寄存器0x0820中的器件中断相邻、因此可以轻松地同时读取两组中断。  

    但是寄存器0x0820中报告的其他器件相关错误可能会阻止 CAN 通信。  因此、最好也监控该寄存器。

    此致、

    Jonathan

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

    早上好、Jonathan、

    好消息是定制板能够正确读取 CAN SPI ID 和修订寄存器。 我在 CAN Init 例程结束时从 IDE 捕获此信息。 但是、我不认为我对 FDOE 和 BRSE 字段的写入有效。  

        /* Configure the MCAN core settings */
        TCAN4x5x_MCAN_CCCR_Config cccrConfig = {
            .FDOE = 1,  // Configure CAN FD mode
            .BRSE = 1   // Configure CAN BRS
        };
        
        bool
    TCAN4x5x_MCAN_ConfigureCCCRRegister(TCAN4x5x_MCAN_CCCR_Config *cccrConfig)
    {
        uint32_t value, readValue;
    
    
        value = cccrConfig->word;
        value &= ~(REG_BITS_MCAN_CCCR_RESERVED_MASK | REG_BITS_MCAN_CCCR_CSA | REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT);		// Bitwise AND to get the valid bits (ignore reserved bits and the CCE and INIT)
    
        // If we made it here, we can update the value so that our protected write stays enabled
        value |= (REG_BITS_MCAN_CCCR_INIT | REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_BRSE | REG_BITS_MCAN_CCCR_FDOE);
    
    
        AHB_WRITE_32(REG_MCAN_CCCR, value);
    #ifdef TCAN4x5x_MCAN_VERIFY_CONFIGURATION_WRITES
        readValue = AHB_READ_32(REG_MCAN_CCCR);
    
        // Need to do these bitwise ANDs to make this work for clock stop requests and not trigger a false failure when comparing read back value
        if ((readValue & ~(REG_BITS_MCAN_CCCR_RESERVED_MASK | REG_BITS_MCAN_CCCR_CSA | REG_BITS_MCAN_CCCR_CSR | REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT))
                != (value & ~(REG_BITS_MCAN_CCCR_RESERVED_MASK | REG_BITS_MCAN_CCCR_CSA | REG_BITS_MCAN_CCCR_CSR | REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT)))
        {
            // If our written value and read back value aren't the same, then we return a failure.
            return false;
        }

     此外还随附了我的当前示波器跟踪

    我设置 CAN 时序寄存器以匹配 PCAN 分析器。 我继续获得 BUSHEAVY 状态。

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

    对 CCCR 寄存器的写入似乎有效。 在示波器或 PCAN 分析器上、CAN 跟踪仍然没有变化。 等待更多指针。

    谢谢、

    Priya

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

    您好、Priya、

    在您的最新帖子中、您的寄存器返回的值看起来不正确。  例如、器件 ID1 (地址 h0000)应为 h4E414354。  您的回读显示为 h43540002。  但是、上一个帖子之前的帖子结果显示了正确的值。

    我确实注意到、您的代码中似乎存在存储器偏移误差、并且寄存器值被移位4个字节。  您可以看到、器件 ID 和修订版寄存器值在不同的寄存器之间拆分、最高有效值和最低有效值在寄存器边界之间偏移。

    您最近发布的其他寄存器值看起来也不正确、因此我无法确认 CCCR 寄存器中的 FD 和 BRSE 位是否正确设置、 但我希望它们也不会被设置、因此您仍然会得到 BUSHEAVY 误差。

    您能否再次确认这些寄存器以确保根据您在代码中设置的值设置位?

    谢谢、此致、

    Jonathan

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

    Johnathan、

    上次捕获屏幕截图时、我可能已将断点放置在其他位置。 在 CAN 初始化例程结束时、IDE 寄存器正在读取其正确的值。 我也没有看到 SPI 状态错误。

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

    您好、Priya、

    好的、这是个好消息。  但是、对于 CAN FD 操作、CCCR 寄存器的值不应为"0"。  位8和位9 (FDOE 和 BRSE)都应设置为"1"、因此配置后寄存器值应类似于0x00000300。  只要 BRSE 和 FDOE 位设置为"0"、就无法在总线上发送 CAN FD 消息而不会出现错误。  

    如果您只发送了传统 CAN (非 FD)消息、则如果这是导致 BUSHEAVY 错误状态的根本原因、则不应出现错误。

    您能否将 FDOE 和 BRSE 位设置为"1"并通过读回它们来验证它们是否已设置?  请注意、这些是受写保护的位、在写入 FDOE 和 BRSE 位之前、要求该寄存器的 INIT 和 CCE 位都为"1"。  否则、这些位将不会更新。  这可能需要最多3次写入才能将所有位设置为正确的值。  然后、您需要对寄存器执行另一个写入来将初始化(以及可选的 CCE)位设置回"0"来恢复正常操作。  

    示例代码应处理此问题、但如果这些寄存器未更新、则应验证配置过程中是否会对该寄存器执行多次写入操作。

    此致、

    Jonathan

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

    Jonathan、

     TCAN4x5x_MCAN_EnableProtectedRegisters 是否是设置两个位字段的正确位置? 如果是、则未正确执行、则返回的 bool 为 false。 如果您在此设置中看到错误、请查看该功能并分享。 我还尝试在 TCAN4x5x_MCAN_ConfigureCCCRRegister 中设置这些位。 此函数没有重试次数。 在该函数的末尾、CCCR 没有所需的值。

    bool
    TCAN4x5x_MCAN_EnableProtectedRegisters(void)
    {
        uint8_t i;
        uint32_t readValue, firstRead;
    
        firstRead = AHB_READ_32(REG_MCAN_CCCR);
    
        if ((firstRead & (REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT | REG_BITS_MCAN_CCCR_BRSE | REG_BITS_MCAN_CCCR_FDOE)) == (REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT | REG_BITS_MCAN_CCCR_BRSE | REG_BITS_MCAN_CCCR_FDOE))
            return true;
    
        // Unset the CSA and CSR bits since those will be set if we're in standby mode. Writing a 1 to these bits will force a clock stop event and prevent the return to normal mode
        firstRead &= ~(REG_BITS_MCAN_CCCR_CSA | REG_BITS_MCAN_CCCR_CSR | REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT | REG_BITS_MCAN_CCCR_BRSE | REG_BITS_MCAN_CCCR_FDOE);
        // Try up to 5 times to set the CCCR register, if not, then fail config, since we need these bits set to configure the device.
        for (i = 10; i > 0; i--)
        {
            readValue = AHB_READ_32(REG_MCAN_CCCR);
    
            if ((readValue & (REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT | REG_BITS_MCAN_CCCR_BRSE | REG_BITS_MCAN_CCCR_FDOE)) == (REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT | REG_BITS_MCAN_CCCR_BRSE | REG_BITS_MCAN_CCCR_FDOE))
                return true;
            else if (i == 1)		// Ran out of tries, give up
                return false;
        }
        return true;
    }

    TCAN4x5x_MCAN_ConfigureCCCRRegister(TCAN4x5x_MCAN_CCCR_Config *cccrConfig)
    {
        uint32_t value, readValue;
    
    
        value = cccrConfig->word;
        value &= ~(REG_BITS_MCAN_CCCR_RESERVED_MASK | REG_BITS_MCAN_CCCR_CSA | REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT );		// Bitwise AND to get the valid bits (ignore reserved bits and the CCE and INIT)
    
        // If we made it here, we can update the value so that our protected write stays enabled
        value |= (REG_BITS_MCAN_CCCR_INIT | REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_BRSE | REG_BITS_MCAN_CCCR_FDOE);
    
    
        AHB_WRITE_32(REG_MCAN_CCCR, value);
    #ifdef TCAN4x5x_MCAN_VERIFY_CONFIGURATION_WRITES
        readValue = AHB_READ_32(REG_MCAN_CCCR);
    
        // Need to do these bitwise ANDs to make this work for clock stop requests and not trigger a false failure when comparing read back value
        if ((readValue & ~(REG_BITS_MCAN_CCCR_RESERVED_MASK  | REG_BITS_MCAN_CCCR_CSA | REG_BITS_MCAN_CCCR_CSR | REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT | REG_BITS_MCAN_CCCR_BRSE | REG_BITS_MCAN_CCCR_FDOE))
                != (value & ~(REG_BITS_MCAN_CCCR_RESERVED_MASK | REG_BITS_MCAN_CCCR_CSA | REG_BITS_MCAN_CCCR_CSR | REG_BITS_MCAN_CCCR_CCE | REG_BITS_MCAN_CCCR_INIT | REG_BITS_MCAN_CCCR_BRSE | REG_BITS_MCAN_CCCR_FDOE)))
        {
            // If our written value and read back value aren't the same, then we return a failure.
            return false;
        }
    
        // Check to see if the CSR bits are not as expected, since this can be set by the hardware.
        if ((readValue & REG_BITS_MCAN_CCCR_CSR) != cccrConfig->CSR)
        {
            // Then there's a difference in the CSR bits, which may not be a failure.
            if (TCAN4x5x_Device_ReadMode() == TCAN4x5x_DEVICE_MODE_STANDBY)
            {
                // CSR bit is set due to being in standby mode. Not a failure.
                return true;
            } else {
                // It's not matching for some other reason, we've got a real failure.
                return false;
            }
        }
    #endif
        return true;

     在 TCAN4x5x_MCAN_ConfigureCCCRRegister 的末尾、读取的值没有设置 BRSE 和 FDOE。 这是为什么?  

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

    您好、Priya、

    TCAN4x5x_MCAN_ConfigureCCCRRegister 函数将"cccrConfig"数据结构的值写入寄存器。  这与演示代码设置其他寄存器位的方式类似。  

    因此、在 main.c 文件中、您应该找到一个具有所有器件结构位分配的"Init_CAN()"函数。  这也是位时序值被设定的地方。

    在我的演示代码版本中、可以在位时序设置之后立即找到以下代码行。

    	/* Configure the MCAN core settings */
    	TCAN4x5x_MCAN_CCCR_Config cccrConfig = {0};					// Remember to initialize to 0, or you'll get random garbage!
    	cccrConfig.FDOE = 1;										// CAN FD mode enable
    	cccrConfig.BRSE = 1;										// CAN FD Bit rate switch enable

    然后,在该 Init_CAN()函数中,在各种数据结构中设置了所有其他寄存器位之后,您应该找到几行代码,这些代码使用这些位设置来实际写入寄存器。  

    	/* Configure the MCAN core with the settings above, the changes in this block are write protected registers,      *
    	 * so it makes the most sense to do them all at once, so we only unlock and lock once                             */
    
    	TCAN4x5x_MCAN_EnableProtectedRegisters();					// Start by making protected registers accessible
    	TCAN4x5x_MCAN_ConfigureCCCRRegister(&cccrConfig);			// Enable FD mode and Bit rate switching
    	TCAN4x5x_MCAN_ConfigureGlobalFilter(&gfc);                  // Configure the global filter configuration (Default CAN message behavior)
    	TCAN4x5x_MCAN_ConfigureNominalTiming_Simple(&TCANNomTiming);// Setup nominal/arbitration bit timing
    	TCAN4x5x_MCAN_ConfigureDataTiming_Simple(&TCANDataTiming);	// Setup CAN FD timing
    	TCAN4x5x_MRAM_Clear();										// Clear all of MRAM (Writes 0's to all of it)
    	TCAN4x5x_MRAM_Configure(&MRAMConfiguration);				// Set up the applicable registers related to MRAM configuration
    	TCAN4x5x_MCAN_DisableProtectedRegisters();					// Disable protected write and take device out of INIT mode

    首先、代码启用受保护的寄存器、通过 TCAN4x5x_MCAN_EnableProtectedRegisters ()函数将 INIT 和 CCE 位设置为"1"。  这允许设置其他写保护位、例如 FDOE 和 BRSE 位。  

    下一个函数调用是 TCAN4x5x_MCAN_ConfigureCCCRRegister (&cccrConfig)、如果 FDOE 和 BRSE 位在前几行代码中被设置为"1"、它将设置这些位。

    在所有包含写保护位的寄存器之后、TCAN4x5x_MCAN_DisableProtectedRegisters ()函数被调用以将 INIT 和 CCE 位设置回'0'。

    您能否验证您是否有代码行在 cccrConfig 数据结构中设置 FDOE 和 BRSE 位、并且它们是否将这些位设置为"1"?

    此致、

    Jonathan

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

    Jonathan、

    今天、我只能重新使用来自 TCAN 演示的 CAN_init 例程。 我删除了之前对 TCAN4x5x_MCAN_EnableProtectedRegisters 和 TCAN4x5x_MCAN_ConfigureCCCRRegister 例程所做的所有编辑。 在 CAN_init 末尾、CCR 寄存器值看起来更好。 今天捕获的示波器迹线 I 也不显示 MOSI 和 MISO 的 TTL 振幅、仅显示 SPI_CLK 和 CS。 没有任何变化、仍然获得 BUSHEAVY 状态。 我明天将继续这样做。

    void initCAN (void)
    {
    uint32_t spi_device_id0, spi_device_id1, spi_revision, spi_status, reg_dev_ir, mcan_int_flags, dev_modes_pins, mcan_cccr, mcan_ecr, mcan_psr;
        TCAN4x5x_Device_ClearSPIERR();                              // Clear any SPI ERR flags that might be set as a result of our pin mux changing during MCU startup
    
         /* Step one attempt to clear all interrupts */
         TCAN4x5x_Device_Interrupt_Enable dev_ie = {0};              // Initialize to 0 to all bits are set to 0.
         TCAN4x5x_Device_ConfigureInterruptEnable(&dev_ie);          // Disable all non-MCAN related interrupts for simplicity
    
         TCAN4x5x_Device_Interrupts dev_ir = {0};                    // Setup a new MCAN IR object for easy interrupt checking
         TCAN4x5x_Device_ReadInterrupts(&dev_ir);                    // Request that the struct be updated with current DEVICE (not MCAN) interrupt values
    
         if (dev_ir.PWRON)                                           // If the Power On interrupt flag is set
             TCAN4x5x_Device_ClearInterrupts(&dev_ir);               // Clear it because if it's not cleared within ~4 minutes, it goes to sleep
    
         /* Configure the CAN bus speeds */
         TCAN4x5x_MCAN_Nominal_Timing_Simple TCANNomTiming = {0};    // 500k arbitration with a 40 MHz crystal ((40E6 / 2) / (32 + 8) = 500E3)
         TCANNomTiming.NominalBitRatePrescaler = 1;
         TCANNomTiming.NominalTqBeforeSamplePoint = 32;
         TCANNomTiming.NominalTqAfterSamplePoint = 8;
    
         TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming = {0};      // 2 Mbps CAN FD with a 40 MHz crystal (40E6 / (15 + 5) = 2E6)
         TCANDataTiming.DataBitRatePrescaler = 1;
         TCANDataTiming.DataTqBeforeSamplePoint = 15;
         TCANDataTiming.DataTqAfterSamplePoint = 5;
    
         /* Configure the MCAN core settings */
         TCAN4x5x_MCAN_CCCR_Config cccrConfig = {0};                 // Remember to initialize to 0, or you'll get random garbage!
         cccrConfig.FDOE = 1;                                        // CAN FD mode enable
         cccrConfig.BRSE = 1;                                        // CAN FD Bit rate switch enable
    
         /* Configure the default CAN packet filtering settings */
         TCAN4x5x_MCAN_Global_Filter_Configuration gfc = {0};
         gfc.RRFE = 1;                                               // Reject remote frames (TCAN4x5x doesn't support this)
         gfc.RRFS = 1;                                               // Reject remote frames (TCAN4x5x doesn't support this)
         gfc.ANFE = TCAN4x5x_GFC_ACCEPT_INTO_RXFIFO0;                // Default behavior if incoming message doesn't match a filter is to accept into RXFIO0 for extended ID messages (29 bit IDs)
         gfc.ANFS = TCAN4x5x_GFC_ACCEPT_INTO_RXFIFO0;                // Default behavior if incoming message doesn't match a filter is to accept into RXFIO0 for standard ID messages (11 bit IDs)
    
         /* ************************************************************************
          * In the next configuration block, we will set the MCAN core up to have:
          *   - 1 SID filter element
          *   - 1 XID Filter element
          *   - 5 RX FIFO 0 elements
          *   - RX FIFO 0 supports data payloads up to 64 bytes
          *   - RX FIFO 1 and RX Buffer will not have any elements, but we still set their data payload sizes, even though it's not required
          *   - No TX Event FIFOs
          *   - 2 Transmit buffers supporting up to 64 bytes of data payload
          */
         TCAN4x5x_MRAM_Config MRAMConfiguration = {0};
         MRAMConfiguration.SIDNumElements = 1;                       // Standard ID number of elements, you MUST have a filter written to MRAM for each element defined
         MRAMConfiguration.XIDNumElements = 1;                       // Extended ID number of elements, you MUST have a filter written to MRAM for each element defined
         MRAMConfiguration.Rx0NumElements = 5;                       // RX0 Number of elements
         MRAMConfiguration.Rx0ElementSize = MRAM_64_Byte_Data;       // RX0 data payload size
         MRAMConfiguration.Rx1NumElements = 0;                       // RX1 number of elements
         MRAMConfiguration.Rx1ElementSize = MRAM_64_Byte_Data;       // RX1 data payload size
         MRAMConfiguration.RxBufNumElements = 0;                     // RX buffer number of elements
         MRAMConfiguration.RxBufElementSize = MRAM_64_Byte_Data;     // RX buffer data payload size
         MRAMConfiguration.TxEventFIFONumElements = 0;               // TX Event FIFO number of elements
         MRAMConfiguration.TxBufferNumElements = 2;                  // TX buffer number of elements
         MRAMConfiguration.TxBufferElementSize = MRAM_64_Byte_Data;  // TX buffer data payload size
    
    
         /* Configure the MCAN core with the settings above, the changes in this block are write protected registers,      *
          * so it makes the most sense to do them all at once, so we only unlock and lock once                             */
    
         TCAN4x5x_MCAN_EnableProtectedRegisters();                   // Start by making protected registers accessible
         TCAN4x5x_MCAN_ConfigureCCCRRegister(&cccrConfig);           // Enable FD mode and Bit rate switching
         TCAN4x5x_MCAN_ConfigureGlobalFilter(&gfc);                  // Configure the global filter configuration (Default CAN message behavior)
         TCAN4x5x_MCAN_ConfigureNominalTiming_Simple(&TCANNomTiming);// Setup nominal/arbitration bit timing
         TCAN4x5x_MCAN_ConfigureDataTiming_Simple(&TCANDataTiming);  // Setup CAN FD timing
         TCAN4x5x_MRAM_Clear();                                      // Clear all of MRAM (Writes 0's to all of it)
         TCAN4x5x_MRAM_Configure(&MRAMConfiguration);                // Set up the applicable registers related to MRAM configuration
         TCAN4x5x_MCAN_DisableProtectedRegisters();                  // Disable protected write and take device out of INIT mode
    
    
         /* Set the interrupts we want to enable for MCAN */
         TCAN4x5x_MCAN_Interrupt_Enable mcan_ie = {0};               // Remember to initialize to 0, or you'll get random garbage!
         mcan_ie.RF0NE = 1;                                          // RX FIFO 0 new message interrupt enable
    
         TCAN4x5x_MCAN_ConfigureInterruptEnable(&mcan_ie);           // Enable the appropriate registers
    
    
         /* Setup filters, this filter will mark any message with ID 0x055 as a priority message */
         TCAN4x5x_MCAN_SID_Filter SID_ID = {0};
         SID_ID.SFT = TCAN4x5x_SID_SFT_CLASSIC;                      // SFT: Standard filter type. Configured as a classic filter
         SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;           // Standard filter element configuration, store it in RX fifo 0 as a priority message
         SID_ID.SFID1 = 0x055;                                       // SFID1 (Classic mode Filter)
         SID_ID.SFID2 = 0x7FF;                                       // SFID2 (Classic mode Mask)
         TCAN4x5x_MCAN_WriteSIDFilter(0, &SID_ID);                   // Write to the MRAM
    
    
         /* Store ID 0x12345678 as a priority message */
         TCAN4x5x_MCAN_XID_Filter XID_ID = {0};
         XID_ID.EFT = TCAN4x5x_XID_EFT_CLASSIC;                      // EFT
         XID_ID.EFEC = TCAN4x5x_XID_EFEC_PRIORITYSTORERX0;           // EFEC
         XID_ID.EFID1 = 0x12345678;                                  // EFID1 (Classic mode filter)
         XID_ID.EFID2 = 0x1FFFFFFF;                                  // EFID2 (Classic mode mask)
         TCAN4x5x_MCAN_WriteXIDFilter(0, &XID_ID);                   // Write to the MRAM
    
         /* Configure the TCAN4550 Non-CAN-related functions */
         TCAN4x5x_DEV_CONFIG devConfig = {0};                        // Remember to initialize to 0, or you'll get random garbage!
         devConfig.SWE_DIS = 0;                                      // Keep Sleep Wake Error Enabled (it's a disable bit, not an enable)
         devConfig.DEVICE_RESET = 0;                                 // Not requesting a software reset
         devConfig.WD_EN = 0;                                        // Watchdog disabled
         devConfig.nWKRQ_CONFIG = 0;                                 // Mirror INH function (default)
         devConfig.INH_DIS = 0;                                      // INH enabled (default)
         devConfig.GPIO1_GPO_CONFIG = TCAN4x5x_DEV_CONFIG_GPO1_MCAN_INT1;    // MCAN nINT 1 (default)
         devConfig.FAIL_SAFE_EN = 0;                                 // Failsafe disabled (default)
         devConfig.GPIO1_CONFIG = TCAN4x5x_DEV_CONFIG_GPIO1_CONFIG_GPO;      // GPIO set as GPO (Default)
         devConfig.WD_ACTION = TCAN4x5x_DEV_CONFIG_WDT_ACTION_nINT;  // Watchdog set an interrupt (default)
         devConfig.WD_BIT_RESET = 0;                                 // Don't reset the watchdog
         devConfig.nWKRQ_VOLTAGE = 0;                                // Set nWKRQ to internal voltage rail (default)
         devConfig.GPO2_CONFIG = TCAN4x5x_DEV_CONFIG_GPO2_NO_ACTION; // GPO2 has no behavior (default)
         devConfig.CLK_REF = 1;                                      // Input crystal is a 40 MHz crystal (default)
         devConfig.WAKE_CONFIG = TCAN4x5x_DEV_CONFIG_WAKE_BOTH_EDGES;// Wake pin can be triggered by either edge (default)
         TCAN4x5x_Device_Configure(&devConfig);                      // Configure the device with the above configuration
    
         TCAN4x5x_Device_SetMode(TCAN4x5x_DEVICE_MODE_NORMAL);       // Set to normal mode, since configuration is done. This line turns on the transceiver
    
         TCAN4x5x_MCAN_ClearInterruptsAll();                         // Resets all MCAN interrupts (does NOT include any SPIERR interrupts)
    
    
         spi_device_id0 = AHB_READ_32(REG_SPI_DEVICE_ID0);
         spi_device_id1 = AHB_READ_32(REG_SPI_DEVICE_ID1);
         spi_revision = AHB_READ_32(REG_SPI_REVISION);
         spi_status = AHB_READ_32(REG_SPI_STATUS);
         reg_dev_ir = AHB_READ_32(REG_DEV_IR);
         mcan_int_flags = AHB_READ_32(REG_MCAN_INT_FLAGS);
         dev_modes_pins = AHB_READ_32(REG_DEV_MODES_AND_PINS);
         mcan_cccr = AHB_READ_32(REG_MCAN_CCCR);
         mcan_ecr = AHB_READ_32(REG_MCAN_ECR);
         mcan_psr = AHB_READ_32(REG_MCAN_PSR);
    
    
    
    }
    

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

    您好、Priya、

    我们似乎正在取得进展、很高兴看到 CCCR 寄存器未正确设置。  MOSI/ MISO 信号电平是一个有趣的观察结果。  但是、由于您能够写入/读取寄存器、这有望是测试设置问题、并不真实。

    我不是峰值系统创建的 PCAN 分析器工具的专家、因此我不知道出现 BUSHEAVY 指示灯的所有原因。  但是、在峰值系统支持论坛上、我看到了几个提到 BUSHEAVY 状态的线程。  

    第一个线程有一个帖子、提示"当您想要发送 CAN 消息并且其他 CAN 节点无法发送确认帧(错误波特率、CAN 总线未连接、CAN 终端、CAN 总线系统仅具有一个 CAN 节点等)时、可能会发生总线重载" - (https://forum.peak-system.com/viewtopic.php?t=35)

    另一个线程表示、当 PCAN 节点的错误计数器大于127时会出现 BUSHEAVY 指示器、您可以通过重新初始化该节点来重置该节点来清除该错误。 - (https://forum.peak-system.com/viewtopic.php?f=120&t=39)

    但是、我可能会建议帮助缩小这是 TCAN4550还是 PCAN 配置问题的范围。  现在、我们只知道这两个器件似乎没有采用相同的配置方式。  我相信您还有第二块使用 TCAN4550 EVM 的 TCAN4550板或设置、并且您尝试使用相同的设置将两个 TCAN4550器件连接在一起、然后查看您是否可以发送和接收 CAN 消息。  

    这至少有助于验证 TCAN4550设置和定制板的硬件。  由于我知道 TCAN4550 MCAN 控制器中不同的中断和错误标志、因此我可以更好地帮助处理两个板上的发送和接收设置、我们知道这两个板是兼容的、因为它们都是 TCAN4550。  是否可以进行这样的测试?

    此外、请确保 CAN 总线两端都使用120欧姆电阻器正确端接、如果电路板之间的导线短路、则在其中一个电路板上使用一个60欧姆电阻器。  不正确的总线终端可能会导致 CAN 错误、这些错误可能会累加并导致通信错误。

    此致、

    Jonathan

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

    今天早上、我在定制 PCB 上看到了正确的 CANH-CANL 电压电平(白色)。 两个示波器探头昨天设置为10倍。  虽然这是一个缓解措施、但 PCAN 分析器保持一个 BUSHEAVY 状态。 我更改了 initCAN 例程以使用与 PCAN 相同的 tq 设置、这不会产生影响。

    定制 PCB 上确实有一个120欧姆电阻连接到 CANH 线路。  

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

    您好、Priya、

    最好将信号电平结起来。  但是、我不确定显性到隐性边缘上的大"峰值"是什么、因为它大于我通常看到的值。  PCAN 分析仪上是否还有120欧姆端接?

    总线通信是如何工作的、在哪个电路板上进行传输、在哪个电路板上进行接收?  或者它们是否同时尝试发送和接收?  尽管处于 BUSHEAVY 状态、RX FIFO 是否接收到新消息、还是错误计数器记录错误?  

    此设置是连续发送消息、还是尝试发送单个消息、但我们看到多条消息、因为它没有得到应答?

    您能否一次只让一个板发送一条消息、以查看是否在 RX FIFO 中接收到该消息或以任何方式更改错误计数器?  例如、将一条消息从 TCAN4550发送到 PCAN 分析器、并检查它是否被接收。  TCAN4550具有一个 DAR 位来禁用自动重传、该位可以在 CCCR 寄存器中设置。  这将导致 TCAN4550仅尝试发送消息、而不管消息是否已被应答。  这对于测试和调试很有用。

    然后、您能否尝试反转方向并将消息从 PCAN 发送到 TCAN4550、然后查看是否已确认和接收?

    我认为我们需要尝试打破通信路径、并确定这是两个节点之间的 TX 还是 RX 路径问题、以便我们知道哪些设置需要调整。

    此外、如果您有两个 TCAN4550板、是否可以在不使用 PCAN 分析仪的情况下一起对它们进行测试?  我不知道这对您的设置是否可行、或者是否太困难。 但它也可能有助于提供有关错误设置的一些见解。

    您能否分享 CAN 消息 ID 和数据有效载荷的预期值、以便我可以查看 CAN 波形以查看这些位是否正确匹配?

    此致、

    Jonathan

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

    MSP430是唯一通过 CAN 发送消息的处理器。 CAN 控制器无接收消息。 但是、mCAN_ECR 读取0x80和 mCAN_CCR 0x300。 我更仔细地查看了 CAN 消息的位宽。 最薄的脉冲测量值为500kbps。 那么、CAN FD 可能仍然存在问题吗?

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

    您好、Priya、

    消息标头将始终处于标称位速率、该速率必须小于1Mbps、如果我们的时序设置正确、则在您的配置中为500kbps。  如果这是您要测量的值、那么这将验证我们的时序设置。

    如果节点赢得仲裁、则如果消息配置为具有比特率切换功能的 FD 消息、则数据速率将增加到 FD 比特率。  启用 CCCR 寄存器中的 FDOE 和 BRSE 位只需使能 TCAN4550以更快的数据位速率发送和接收 FD 消息。  但这不能保证消息将作为 FD 发送。  报文头中有两个位指示控制器将报文作为传统报文或 FD 报文发送、如果是 FD 报文、则指示控制器是切换到更快的比特率还是继续使用标称比特率。  

    如果有比特率开关、它将发生在报文头中 BRS 位的采样点。  下面是完整 CAN FD 报文的表格视图、其中每行都是报文中的单个32位字。  顶部的两个字 T0和 T1是消息标头。  T2-TN 等字是消息的数据有效载荷。

    此图以及 MCAN CAN FD 控制器的其他信息可在 Bosch 开发的 MCAN 用户手册中找到。

    https://www.bosch-semiconductors.com/media/ip_modules/pdf_2/m_can/mcan_users_manual_v330.pdf

    您能告诉我您要发送的消息的具体细节、还是验证 FD 和 BRS 是否正确?  此外、您能否将消息标题中的位与 CAN 波形相匹配? 例如、您能否验证消息 ID 和其他位值是否正确?  如果它们不匹配、可能是消息 RAM (MRAM)分配存在问题、并且 TX 缓冲区中的字节不正确。

    但是、如果该消息看起来是从 TCAN4550正确传输的、那么 PCAN 分析器中可能有一些设置阻止它确认消息。

    另一个需要注意的问题是、消息的完整数据有效载荷是否正在 CAN 总线上传输。  我在总线上看不到错误标志信号、但是检测到 CAN 错误后会立即引发 CAN 错误、因此如果 CAN 消息比预期短、消息中最后一位的位置可能会提示原因。

    此外、我刚刚注意到、在这个更放大的示波器图像中、CANH 和 CANL 波形对我来说并不是很正确。  哪条彩色轨迹是 CANH 和 CANL?  其中一个应该是另一个的反相副本、并且显性位之间的隐性电压应该大约为2.5V。  蓝色和洋红色波形的形状和极性看起来相同、但其中一个波形比另一个波形大。  我也看不到2.5V 隐性电平。  如果波形不正确、则我们的设置可能正常、相反、我们遇到硬件问题和 CAN 波形不正确。

    此致、

    Jonathan

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

    Jonathan、

    我需要对我的设置进行故障排除、从而导致我的响应延迟。 所附是示波器上的 CAN 波形。 粉色为 CANH、黄色为 CANL。 它们没有您描述的振幅。 我还意识到逻辑分析仪可以对 CAN 进行解码。 我在 CANH 的下降沿触发、比特率为1Mbps、采样点为75%。 这些与固件中的 TCANDataTiming 相匹配、请告诉我 LA 的输入是否正确。 数据字段看起来与正在传输的测量值不同。 最好确认固件 CAN 设置是否正确。 在从固件传输的标头中、我将.FDF 和.brs 字段设置为1。  

    TCAN4x5x_MCAN_TX_Header 接头={
    .dlc = 8、
    .id = HDR、
    FDF = HEADER_FDF_CONFIG、
    .bRS = header_BRS_CONFIG、
    EFC = 0、
    0.mm = 0、
    .RTR = 0、
    .xtd = 0、
    ESI = 0

    以下是固件如何封装 CAN 数据的方法、该方法看起来正确:


    }; e2e.ti.com/.../CANFields.csv

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

    您好、Priya、

    感谢您提供更多详细信息。  今天我没有时间完成所有内容的审核并提供回复、因此我明天将跟进您的情况。

    此致、

    Jonathan

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

    您好、Priya、

    在所有方面、CAN 波形看起来都不正确。  电压电平与 CAN 物理层规格不匹配、并且从我对消息配置的理解来看、位序列不正确。

    我已经尝试复制您的消息并使用测试设置捕获波形、测试设置包括2个 TCAN4550器 件、它们通过连接到 MSP-EXP430FR6989 LaunchPad 的 BOOSTXL-CANFD-LIN BoosterPack 通过一条简单总线连接在一起。  两个电路板上的120欧姆端接电阻均通过跳线启用、以产生60欧姆的总线阻抗。

    C1探针(黄色)是相对于 GND 在2.5V (隐性)和3.5V (显性)之间摆动的 CANH 信号。

    C2探针(蓝色)是相对于 GND 在2.5V (隐性)和1.65V (显性)之间摆动的 CANL 信号。

    除了电路板上显示的错误状态指示器(ESI)位与您的值不同之外、消息标头位似乎匹配、直到数据有效载荷字段中出现一个位。  然后两个波形开始偏离。

    但是、最令我担忧的是您的 CANL 波形。  它应与 CANH 波形反相、并具有大约2.5V 的常见隐性电平。  您的 CANL 波形具有与 CANH 波形相同的形状和极性、并且其电压电平不正确。  此外、在 CANH 边沿转换时也会出现很多在边沿转换时未出现的振铃噪声。  由于这是差分总线、因此噪声或振幅不应存在这样的差异。  

    CANH 和 CANL 波形之间的振幅通常会有一些差异、但它们是相当对称的。

    我注意到、在您之前的示波器图中、CANH/L 波形电平看起来也不正确。  CANH 的振幅似乎几乎为3V、CANL 仍然只有1V、并且极性与 CANH 相同。  这些信号中的任何一个似乎都没有隐性电压、并且在隐性位期间它们几乎会进入 GND。  测量期间、探头的 GND 基准在哪里?  它是否连接到电路板上的 GND?  

    您能否分享 TCAN4550电路的原理图以及 CANH/L 引脚上的组件以供我回顾?  

    此致、

    Jonathan

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

    乔纳森-我把原理图作为附加到了 PM。

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

    您好、Priya、

    谢谢、我已经查看了您发送的原理图。  现在、我相信我了解您波形中的 CAN 信号电平。

    CANH 和 CANL 上的10k 下拉电阻器不常见、可能会导致隐性状态电压电平出现共模问题。  在显性位期间、收发器将 CANH 驱动至约3.5V、并将 CANL 驱动至约1.65V、然后在隐性位期间变为高阻抗、从而允许将这些位拉至弱偏置的2.5V 隐性电压电平。  在隐性位期间、CANH 和 CANL 上的下拉电阻器将线路电压下拉至 GND、而不是2.5V、这就是信号以其方式出现的原因。  

    CAN 收发器是一个差分接收器、用于查看 CANH 和 CANL 之间的电压差、因此仍然可以通过总线上的下拉电阻接收数据、但这对于其他几个问题来说是有问题的。  例如、使用这些下拉电阻器可能无法通过任何射频发射测试标准。

    因此、我建议移除10k 下拉电阻器 R208和 R209。  原理图中包含这些组件的原因是否具体?

    我在原理图中也没有看到 CANH 和 CANL 之间的120欧姆端接电阻。  CAN 总线应具有两个120欧姆的终端电阻器、总并联电阻为60欧姆。  这些端接电阻应放置在总线的两端。  当您仅使用两个节点进行测试时、例如一个 PCAN 分析仪和一个 TCAN4550电路板、每个节点上应连接一个120欧姆的端接电阻器。  如果有2个以上的节点、则总线上的中间节点不需要终端。

    在前面的消息中、您提到定制 PCB 在 CANH 线路上有一个120欧姆的电阻器、但我没有看到它。   在我们的调试过程中、这个120欧姆电阻器是否放置在 CANH 和 CANL 引脚之间? 或者您是否在线束本身上应用了外部端接?  请确保 CAN 总线端接正确、因为错误端接也会导致错误。  

    您还提到、MSP430是唯一通过 CAN 发送消息的处理器。 CAN 控制器无接收消息。 您是否尝试将消息从 PCAN 发送到 TCAN4550以查看它是否可以接收消息?  我想知道两个板之间的通信两个方向上是否都有错误、或者错误仅在一个方向上。

    您能否移除下拉电阻器、验证 CANH 和 CANL 之间的总阻抗是否为60欧姆、然后重新测试通信、以便查看是否有任何改进?

    此致、

    Jonathan

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

    Jonathan

    原理图中的120欧姆 CAN 端接电阻器为 R105。

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

    H Ptiya、

    感谢您的讲解。  我不知道我是如何忽视它的。

    此致、

    Jonathan

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

    Jonathan、

    生产 PCB 具有您提到的两个相同的电阻器。 将收集此 PCB 中 CAN 波形的示波器迹线。 我还注意到、生产 PCB 未将.FDF 或.brs 设置为1。 我假设这意味着 TCAN4550仅用于 CAN 模式而不是 CAN FD? CAN 报头仍然是29位、这在传统 CAN 校正中也是可能的?

    在我更改任何 PCAN 分析器设置之前、我能够使用修改后的 TCAN 演示项目收集 CAN 跟踪。 我有 FDF 和 BRS 设置、以匹配生产固件。 已通知我 CAN USB 软件狗 GC-CAN-USB 无法与 CAN-FD 配合使用。 如果我禁用 CAN FD 模式并仅发送 CAN2.0A 或 CAN2.0B 帧、我将能够接收 CAN 帧。  

    出于某种原因、我无法返回使用 TCAN EVM 获取 CAN 跟踪。  

    我已附加了可以通过 EVM 看到的 CAN 波形。

    谢谢、

    Priya

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

    您好、Priya、

    感谢您的 CAN 软件狗的更新和器件型号。  我们似乎正在取得进展。  当 CAN FD 在总线上时、CAN 软件狗肯定会发出错误。

    是的、传统 CAN 或标准 CAN 消息可以使用11位或"扩展"29位 ID。  要使用扩展的29位 ID、报文标题中的 XTD 位必须设置为"1"。  这些消息被限制为小于2Mbps 的单比特率和最大8字节的数据有效载荷。

    您提供的波形看起来正确、具有适当的电压电平、并且质量非常好。  它们是对称的、具有2.5V 隐性电平、振铃或过冲极少。  这就是我们想要看到的。

    回想一下、设置 CCCR 寄存器中的 FDOE 和 BRSE 位只需启用 TCAN4550即可发送和接收 CAN FD 消息。  但是、报文标头中的 FDF、BRS 和 DLC 位决定了报文在总线上的传输方式。  因此、即使 FDOE 和 BRSE 位设置为"1"、也可以发送经典(非 FD)消息。  但是、报文头需要将 FDF 和 BRS 位设置为"0"、以指示该报文是一条经典(非 FD)报文。

    此致、

    Jonathan

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

    Jonathan、

    TCAN 演示项目不使用扩展的29位 ID、现在我将保持这种状态。 我当前的目标是使用此 CAN 软件狗获取 PCAN 跟踪。  

    在 CAN_init 例程中、我将 MCAN 内核设置保留为:

    /*配置 MCAN 内核设置*/
    TCAN4x5x_MCAN_CCCR_Config cccrConfig ={0};//请记住初始化为0、否则您将获得随机垃圾!
    cccrConfig.FDOE = 1;// CAN FD 模式启用
    cccrConfig.BRSE = 1;// CAN FD 比特率开关使能

    下面是我尝试发送到 TCAN EVM 的 CAN 消息:

        /* Define the CAN message we want to send*/
    
        uint8_t data[4] = {0x55, 0x66, 0x77, 0x88};     // Define the data payload
        header.DLC =  MCAN_DLC_4B;                       // Set the DLC to be equal to or less than the data payload (it is ok to pass a 64 byte data array into the WriteTXFIFO function if your DLC is 8 bytes, only the first 8 bytes will be read)
        header.id = 0x52;                              // Set the ID
        header.FDF = 0;                                 // CAN FD frame enabled
        header.BRS = 0;                                 // Bit rate switch enabled
        header.EFC = 0;
        header.MM  = 0;
        header.RTR = 0;
        header.XTD = 0;                                 // We are not using an extended ID in this example
        header.ESI = 0;                                 // Error state indicator
    
    
        TCAN4x5x_MCAN_WriteTXBuffer(0, &header, data);  // This function actually writes the header and data payload to the TCAN's MRAM in the specified TX queue number. It returns the bit necessary to write to TXBAR,
                                                        // but does not necessarily require you to use it. In this example, we won't, so that we can send the data queued up at a later point.
    
        /* Let's make a different CAN message */
        data[0] = 0x11;
        data[1] = 0x22;
        data[2] = 0x33;
        data[3] = 0x44;                                 // Define the data payload
    
        header.DLC =  MCAN_DLC_4B;                       // Set the DLC to be equal to or less than the data payload (it is ok to pass a 64 byte data array into the WriteTXFIFO function if your DLC is 8 bytes, only the first 8 bytes will be read)
        header.id = 0x123;                              // Set the ID
        header.FDF = 0;                                 // CAN FD frame enabled
        header.BRS = 0;                                 // Bit rate switch enabled
        header.EFC = 0;
        header.MM  = 0;
        header.RTR = 0;
        header.XTD = 0;                                 // We are not using an extended ID in this example
        header.ESI = 0;                                 // Error state indicator
    

    我将 PCAN 分析器和 TCAN 驱动程序项目都设置为在500kbps 时具有75%的标称数据采样点。 我将 MCAN_Data Timng 更改为:

    TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming ={0};// 1Mbps CAN 、具有40MHz 晶体(40E6 /(30 + 10)= 1E6)
    TCANDataTiming.DataBitRatePrescaler = 1;
    TCANDataTiming.DataTqBeforeSamplePoint = 30;
    TCANDataTiming.DataTqAfterSamplePoint = 10;

    请确认 TCAN 驱动程序设置是否正确、以便传输常规 CAN 消息、而不是 CAN FD。 PCAN 分析器以 OK 状态连接、并在我运行固件时立即切换到 BUSHEAVY 状态。

    我还尝试对从固件传输的任何消息进行注释。 我尝试从 PCAN 分析器发送消息。 同样、也是相同的 BUSHEAVY 状态。 我真的需要解决这个问题。

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

    您好、Priya、

    对于常规 CAN 消息、消息信息对我而言看起来很好。

    您在什么电路板、TCAN4550 EVM 或您的定制电路板上尝试此测试?  TCAN4550 EVM 上有一个40MHz 晶体、但您的定制板上有一个20MHz 振荡器。  因此、由于您有两种不同的时钟频率、因此两个板的 TCAN4550标称和数据位时序配置将有所不同。

    在传统 CAN 中、只有一个标称位速率、因此整个消息将使用标称位速率设置。   当 TCAN4550看到 FDF 位设置为"0"的报文标头时、应忽略数据时序设置并对整个报文使用标称时序设置。  因此、如果您有一个标称500kbps 配置、消息的每个位的宽度应该为2us。

    您能否检查是否使用正确的时钟频率配置设置、或验证示波器上的位宽?  

    您还可以将数据时序设置为与标称时序匹配、以确保永远不会以更快的速度传输消息。  但您不需要执行此操作。

    我不知道 PCAN 分析器软件是否需要单独的 CAN 和 CAN FD 位时序配置。  您在上一个帖子中显示的图像同时显示了 CAN 和 CAN FD 选项卡、因此您可能也可以验证这一点。

    此致、

    Jonathan

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

    感谢 Jonathan 的来电。 现在、使用 EVM 设置时、CAN 跟踪功能可以再次正常工作。 我现在了解正确的示波器触发器。 如果定制 PCB 继续存在复杂问题、我将再次联系我们。 非常感谢!

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

    您好、Priya、

    我很乐意提供帮助、很高兴我们能够让它正常工作!

    此致、

    Jonathan