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.

[参考译文] TCAN4550EVM:发送 CAN 消息时出现问题

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/999466/tcan4550evm-problem-sending-can-messages

器件型号:TCAN4550EVM
主题中讨论的其他器件:TCAN4550TCAN4550-Q1

您好!

我使用 Infineon TLE9869QXA20通过 SPI 向 TCAN4550的寄存器写入数据。 我已经配置了 TCAN4550并希望发送消息、但我在 CANH 或 CANL 上没有得到可测量信号。
如果我在发送前读取寄存器0x10C4、我会得到值0x0000000A、如果我通过寄存器0x10D0发出写入命令、我会在之后读取寄存器0x10C4中的0x00010009。 因此、CAN 消息的发送应该已经成功、但我在示波器上看不到任何信号。
下面是我用于发送 CAN 消息的初始化代码和命令。

我希望能得到快速的回答、谢谢您。
相关信息
蒂莫祝福

//Initializerung 前两个十六进制值是地址、而不是写入字节

   SPI_WRITE_1reg (0x10、0x18、0x00、0x00、0x00、 0x0B);
   SPI_WRITE_1reg (0x10、0x84、0x00、0x02、0x00、 0x00);
   SPI_WRITE_1reg (0x10、0x88、0x00、0x01、0x00、 0x08);
   SPI_WRITE_1reg (0x10、0xA0、0x02、0x04、0x00、 0x10);
   SPI_WRITE_1reg (0x10、0xB0、0x03、0x05、0x00、 0xF0);
   SPI_WRITE_1reg (0x10、0xAC、0x00、0x00、0x00、 0x00);
   SPI_WRITE_1reg (0x10、0xBC、0x00、0x00、0x00、 0x76);
   SPI_WRITE_1reg (0x10、0xF0、0x02、0x03、0x02、 0x58);
   SPI_WRITE_1reg (0x10、0xC0、0x0A、0x00、0x02、 0x70);
   SPI_WRITE_1reg (0x10、0xC8、0x00、0x00、0x00、 0x07);    
   SPI_WRITE_1reg (0x10、0x1C、0x02、0x03、0x06、 0x01);
   SPI_WRITE_1reg (0x10、0x18、0x00、0x00、0x00、 0x19);
   SPI_WRITE_1reg (0x80、0x00、0x48、0xAA、0x78、 0xBB);
   SPI_WRITE_2reg (0x80、0x08、0x20、0x00、0x11、 0x11、0x40、0x00、0x22、0x22);
   SPI_WRITE_1reg (0x08、0x00、0xC8、0x00、0x04、 0xA8);

//发送代码

   SPI_SEND_Receive (0x41、0x10、0xC4、0x01);
   SPI_WRITE_1reg (0x82、0x70、0x02、0xA8、0x00、 0x00);
   SPI_WRITE_1reg (0x82、0x74、0x01、0x04、0x00、 0x00);
   SPI_WRITE_1reg (0x82、0x78、0x44、0x33、0x22、 0x11);   

SPI_WRITE_1reg (0x10、0xD0、0x00、0x00、0x00、 0x01);

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

    Timo、

    应用工程师已收到此帖子的通知、并将作出相应的回复。 感谢您的耐心等待。

    此致、

    Eric Hackett  

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

    您好 Eric、

    感谢你的答复。 我想问什么是当前状态?

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

    您好、Timo、

    分析每个函数调用的目的有点困难。 您是否能够使用TCAN4550演示软件中的驱动程序测试您的设置? 此演示中的 C 驱动程序包含每个器件寄存器的可读函数和结构、从而使配置和其他功能在代码中更具可读性。 main.c 文件还提供了可用于测试硬件设置的示例配置。

    我不知道 SPI_WRITE_nreg ()函数是如何运行的,但前两个字段似乎是写入地址。 我还假设以下四个字段包含按降序(最高有效字节优先)写入的数据。 基于此布局、我不会看到共享代码有任何问题、但我无法检查此格式中的所有配置值。 我建议对每一个调用进行注释、以使配置更具可读性、因此每个寄存器写入的意图都是明确的。  

    请确保满足以下所有条件、以便正确配置器件:

    • 读取器件 ID 寄存器('h0000 -'h0004)以确保 SPI 通信正常工作。
    • 检查并清除中断状态标志、根据需要处理中断。
    • 在尝试发送数据之前、读取模式控制寄存器以确认器件处于正确模式。
    • 验证所有电源轨(Vsup、Vio)是否均已充分供电。  

    此致、
    Eric Schott

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

    嗨、Eric、

    您对我的代码的解释是正确的。
    我检查了 Vsup、Vio 等各处的电压是否正确。
    我的 SPI 通信也在工作。 我可以读取寄存器、当我写入寄存器并读取它们时、它会显示正确的内容。
    但是、当我通过 SPI 写入或读取某个内容时、我会在 SDO 线路上获得寄存器0x0820[7:0]的状态、我认为那里有问题。 当我在初始化之前读取寄存器时、得到值0x89、当我在初始化之后读取寄存器时、始终得到值0xA9。 这意味着我有一个 SPI 错误和一个 CAN 错误、但我不知道这些错误应该在哪里或与什么相关。 我附上了一个寄存器读取命令示例。


    您是否知道答案、这是我的 CAN 通信不起作用的原因?


    感谢您的反馈。


    相关信息
    蒂莫祝福

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

    此外、当我读取寄存器0x000C 时、我得到值0x0020000A

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

    您好、Timo、

    感谢您提供的额外信息和示波器截图。  

    它确实听起来像是 SPI 问题可能会阻止 CAN 的正确配置和使用。 来自中断寄存器和状态寄存器的值表明器件已识别 SPI_END_ERROR。 当 SPI 事务在未完成当前字节的情况下结束时、会导致这种情况。 一旦识别到这个中断、就应该将其清除(向相应的寄存器写入1)、这样以后发生的任何情况也可以被识别。  

    您共享的 SPI 接口范围快照似乎没有任何问题、不应导致 SPI_END_ERROR。 但是、之前的事务可能包含这样一个错误、并且状态标志自那时以来未被清除。 您是否能够在启动后捕获此器件的第一个 SPI 事务? 在某些系统中、我在第一个事务中看到了可能导致此类错误的来自 MCU 的杂散时钟脉冲。  

    当一个 SPI 事务被启动时、中断状态总是作为第一个字节被发送。 这是在数据表中的预期和说明。 图8-17 (TCAN4550-Q1数据表)展示了这一点。 示波器屏幕截图与此一致。  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    在第一个图像中、您可以看到两个电路板上启动电压后的第一个 SPI 读取请求的示波器图像。 对于寄存器0x0820、我得到值0x81、这意味着 VTWD 中断得到了、我将通过复位摆脱该中断。 但是、当我发送第二个 SPI 读取请求时、我再次得到值0x89、这意味着 SPI 错误。

    在第二个图像中、您可以看到在 TCAN4550复位后、第一个 SPI 读取请求的示波器捕获。 对于寄存器0x0820、我得到值0x00、这意味着一切都将完美或? 但是、当我发送第二个 SPI 读取请求时、我得到值0x88、因此出现 SPI 错误。

    您能看到错误来自哪里吗?

    如前所述、我使用 AHB_WRITE_32 (0x000C、0x00200000)命令来清除中断标志。 之后、我还得到了寄存器0x0820的值0x00、因此它起作用。 但是、当我重新刷新 Infineon 板以加载新的读取或写入命令时、我既没有得到值0x88的错误。 这意味着、第一个 SPI 传输始终未正确执行、因此中断标志被置位。 但我不知道第一次传输到底有什么问题、也不知道如何解决。

    相关信息

    蒂莫祝福

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

    我认为该错误源于这样一个事实、即 CS 在 Infineon 复位后直接设置为低电平、直到 Infineon 初始化完成。 TCAN4550已经将其视为通过 SPI 进行的第一次发送尝试、这是不是?
    如果是、是否可以忽略此"首次发送"?  

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

    您好、Timo、

    我正在查看您的回复、并将在明天回复您。  

    此致、
    Eric Schott

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

    您好、Timo、

    我同意您在此处进行的第二次分析。 MCU 启动时 NCS 的初始置位将被视为 SPI 结束错误(由于未发送数据、帧不会在字节边界上结束)。 我们在这里的两个示波器快照中都看到了这个状态(状态寄存器000Ch 中的位21)。 我怀疑中断状态(81h 与00h)的差异是由于不同的复位情况-一个由电源完成(UV 标志设置)、另一个由复位完成。  

    由于我们无法将器件配置为忽略 nCS 断言的初始出现、因此我建议在启动后首先清除所有中断(向状态寄存器000Ch 写入1)。 一旦确认这些位被清除、器件的配置就可以再次开始。  

    我再次建议您考虑使用 TCAN4550驱动程序库 来提高此程序的可读性。 它仍将使用您已经实现的 SPI 读取和写入函数、但会将 TCAN4550寄存器和功能组织到命名变量和结构中、以便于使用、修改和调试。 如果您对此库有任何疑问、请告诉我。

    此致、
    Eric Schott

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

    尊敬的 Eric:

    正如您所说的、我现在使用了 TCAN4550 Libaray。 我重写了 SPI 函数以与 TLE9869配合使用、并复制了其余文件(TCAN4550.h、TCAN4550.c、TCAN4x5x_Data_Struct.h 和 TCAN4x5x_Reg.h)。 到目前为止、这也起了作用、我通过 SPI 也不再出现错误。
    此外、到目前为止、我已经从演示代码的 main.c 中取出了我所需的所有内容、主要是 CAN_Init。 但我在 CAN 线路上仍然没有收到任何消息。 当我用示波器测量 CANH 或 CANL 时、两者均为0伏。
    下面是随附的 main.c。 您是否看到任何其他错误或知道它可能是什么?

    谢谢
    Timo

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include "tle_device.h"
    #include "port.h"
    #include "spi.h"
    #include "eigene_uart.h"
    #include <string.h>
    #include <stdio.h>
    #include "tcan4550.h"
    //Variablen
    extern uint16 receive_Array[12];
    char string[8];
    volatile uint8_t TCAN_Int_Cnt = 0;
    //Funktionen
    //void Init_GPIO(void);
    //void Init_Clock(void);
    //void Init_SPI(void);
    void Init_CAN(void);
    int main(void)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    闪烁代码后、我在 Vio 和 VCCOUT 处没有任何电压。 但 INH-LED 和 GPIO1 LED 亮起。

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

    您好、Timo、

    欢迎回来参加该项目! 我很高兴听到转换为新代码的效果良好。 这里的代码看起来很好! 看起来这将正确配置 TCAN4550并让它将前两条消息传输到 CAN 总线。  

    根据观察到的 CAN 总线和电源引脚状态、TCAN4550听起来不是处于正常模式。 VIO 需要由外部电源供电、以便器件通过任何逻辑电平引脚(包括 SPI)正确连接。 如果未提供 Vio、器件将在 UVio 计时器到期后自动进入睡眠状态、这也会关闭 Vccout。 一旦进入睡眠模式、INH 将处于非激活状态(悬空)、并且 CAN 总线将弱偏置为0V。  

    器件可能自动进入睡眠模式的另一个原因是未激活的计时器在初始上电后过期。 如果为 TCAN4550供电、然后空闲几分钟、则可能会发生这种情况。 这还将停用 Vccout、INH 和 CAN 总线。 一旦处于睡眠状态、器件将从总线活动或 WAKE 引脚上的转换唤醒。 一旦唤醒、它将能够通过 SPI 与之连接。

    在器件处于睡眠模式的这两种情况下、将无法访问 SPI 接口。 为了在软件中考虑这一点、MCU 可以从 TCAN4550读取一个已知值的寄存器(例如器件 ID 或暂存区寄存器)以确认接口是否正常工作。 如果没有响应(全0或全1)、则需要在 SPI 通信成功启动之前发生唤醒事件。 如果没有可用于 TCAN4550的 Vio、则需要先返回该电源、然后才能实现正常模式 (通常该电源与 MCU 共享、因此如果不可用、则无需 SPI)。  

    我不确定您使用的电路板上的 LED 是什么极性。 您能否在器件引脚处探测电压以获得器件状态的最佳清晰度?  

    让我知道后续调试工作是如何进行的。 您现在似乎对软件有很好的处理能力、因此它只是在某些硬件处于工作状态之前解决问题。  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    由于我使用的是 TCAN4550EVM 板、我的 Vio 引脚是否由 LDO 供电? 那么、我不需要为 Vio 使用外部电源。
    我尝试刷写程序并注释掉 Init_CAN()。 然后我在引脚上设置了所有电平,但一旦我尝试 Init_CAN()函数,电平就会直接下降。

    通过调试、我发现这是因为 TCAN4x5x_Device_Configure (&devConfig);函数。 只要我想执行这个函数,电压就会下降,在 Init_CAN()中还有所有其他函数,电压就会保持上升。 我认为对寄存器0x0800的写入操作不正确、程序在尝试比较写入操作是否正常时挂起。 因此、我用函数"AHB_WRITE_32 (0x0800、0xC8000460);"对寄存器进行了写入。 这似乎迄今已起作用。

    但我仍然没有从 CANH 和 CANL 中获得 CAN 消息。 然后、我注意到、在寄存器0x0820[7:0]上第二次刷写程序后、我得到值0xA0、因此出现 CANSLNT 错误。 我用这个替换了


    AHB_WRITE_32 (0x000C、0xFFFFFFF);   //删除所有中断标志
    AHB_WRITE_32 (0x0830、0xFFFFFFFF);  //禁用 CANSLNT 中断
    AHB_WRITE_32 (0x0820、0x00100400);  //删除 CANSLNT 中断标志


    被清除。 如果我现在写入寄存器或执行 Init_cAN()并且希望通过 CAN 发送某些内容,那么我在寄存器0x0820中不会再出现错误,并且电路板的所有级别都在这里。 此外、CANH 和 CANL 处于正确的电平、但仍然不会发出任何消息。

    我还尝试了测试模式"SPI 和 M_CAN 内核测试模式"。 为此、我在 init_ccan ()之后直接将值"0xC8100469"写入寄存器0x0800。 但在这里、当我在 GPO2上使用示波器进行测量时、我也看不到任何东西。 还应该有可读的 CAN 消息或?

    现在可能是什么错误?

    相关信息

    Timo

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

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /* 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
    */
    //Takes the function the block above
    AHB_WRITE_32(0x0800, 0xC8000460);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    您好、Timo、

    是的、Vio 由 EVM (U2)上的 LDO 供电、该 LDO 由 TCAN4550的 INH 输出启用。 这意味着当 TCAN4550进入睡眠模式并禁用 INH 输出时、LDO 将停止提供3.3V 电压。  init_cand()函数通过将器件置于正常模式并清除所有中断来结束。  

     TCAN4x5x_Device_Configure()方法不太可能导致器件进入睡眠状态。 此方法读取器件的当前模式并使用新数据将其写回、因此器件模式不会改变。 在调试以查找发生这种情况的位置时、无效定时器可能会超时、器件会自动进入睡眠模式。 也就是说,当正常调用 Init_CAN()时,听到设备仍进入睡眠状态是很奇怪的。 如果该功能将器件置于正常模式、则在通过 SPI 明确告知器件进入睡眠状态或发生其他故障条件(例如欠压)之前、器件不应再次进入睡眠状态(禁用 INH)。  

    请通过验证两个 INH 都处于活动状态并读回模式控制寄存器来确认位[7:6]读取2'B10、检查在 Init_can ()函数之后器件是否处于正常模式。 它看起来器件处于睡眠模式、尝试使用唤醒按钮手动唤醒器件并重新启动配置。  

    如果可能 、我建议您使用 MSP430FR6989 Launchpad 尝试此配置、以验证此测试的硬件设置。 此工具无需任何修改即可运行演示软件、因此很少有变量与 我在内部多次使用的设置不同。  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    我找到了我的错误。 我的 AHB_READ_32 ()函数返回了错误的值,因此配置不能正确。 现在、我在 CANL 线路上得到一些东西、但不幸的是、还没有显示正确或完整的消息。

    在这两张图片中、您可以看到 CAN 消息出来时。 完整的帧不会被传输、但在 CRC 之后中止、并且没有数据字段。 此外、尽管代码中设置了4字节、但值0仍位于 DLC 中。

    我不得不说、我在代码中关闭了 CAN-FD、并将波特率提高到1Mbit/s 我还会向您发送新代码。 如果您能告诉我我我的更改是否正确、那会很好。 但是、在这些变化之前、CAN 消息完全相同、所以我不认为是因为这些变化。

    然后、关于此错误、我读取寄存器0x0820、0x0824、0x1020和0x1024并得到以下值:

    0x0820 = 0x00000000

    0x0824 = 0x08010000

    0x1020 = 0x00000002

    0x1024 = 0x00000E32 /但每次我尝试时、这里的值都会更改

    根据0x0824中的值、我在仲裁阶段有一个 PEA 中断或一个协议性错误、以及一个时间戳错误或中断。 但我不知道它来自哪里、也不知道如何消除它。 它是否也来自以下事实:值0位于 DLC 中? 或者、您可能还知道另一种可能的情况吗?

    感谢您的大力支持。

    相关信息

    Timo

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

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include "tle_device.h"
    #include "port.h"
    #include "spi.h"
    #include "eigene_uart.h"
    #include <string.h>
    #include <stdio.h>
    #include "tcan4550.h"
    //Variablen
    extern uint16 receive_Array[12];
    char string[8];
    volatile uint8_t TCAN_Int_Cnt = 0;
    uint32_t readData;
    //Funktionen
    void Init_CAN(void);
    int main(void)
    {
    //PORT_ChangePin(0x00U, PORT_ACTION_SET);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    您好、Timo、

    很高兴听到您可以解决上一个问题。

    我同意、这听起来像是为了响应数据帧中使用的 DLC 0而生成的当前错误帧。  它不与您共享的代码对齐、但您共享的波形(直接在 ID 字段之后)中的 RTR 位为显性状态、表示这是一个数据帧、并且数据长度代码在帧中看起来是零(尽管有填充位)。 由于发送长度为零的数据帧毫无意义、这可能是导致错误的原因、尽管我不确定。 此外、即使帧配置为远程帧、您也会收到相同的错误。   

    • 当生成此错误时、TCA4550电路板是否连接到另一个有源控制器的总线? 您能否判断哪个节点正在生成错误帧?
      • 如果有接收节点、请确保将其配置为与 TCAN4550相同的数据速率(1Mbps)。  
    • 在尝试发送数据帧时是否生成了错误帧? (DLC > 0且数据帧的 RTR 设置)

    此致、
    Eric Schott

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

    尊敬的 Eric:

    我在 CAN 总线上没有其他器件。 我只将示波器连接到 TCAN4550的 CANH 和 CANL 线路、并尝试发送一条消息。

    无论我尝试何种设置、错误帧和 DLC = 0都始终出现。 但是、如果我更改代码、例如 RTR 位或 XTD 位、那么我会在示波器上看到它可以正常工作。 如果我以远程帧的形式发送消息并在 DLC 中写入0、那么我也会得到错误。 我将值写入 DLC 的内容或方式无关紧要。

    相关信息

    Timo

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

    您好、Timo、

    这确实听起来很奇怪。 我已经多次使用演示代码配置、从未遇到过代码与波形不一致的 DLC 问题。 我看不到会改变这种行为的任何修改、但您是否从演示中更改了配置的任何其他部分、这些部分会影响帧的仲裁部分的行为?

    请指定此设置在哪些条件下正常工作。 RTR 位的工作值是多少? XTD 位? 哪些配置使得波形中的 DLC 反映了软件中显示的内容?  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    我没有更改演示中可能影响帧仲裁部分行为的任何内容。 我只在 TCAN4x5x_Data_Structs.h 中包含了一个.h 文件、以便程序识别数据类型"uint8_t"。 此外、我在 cccccr 寄存器的位配置结构中将"uint8_t moni" 中的变量"uint8_t mon"(第264行)重命名为"uint_8 moni"、因为变量"mon"已经存储了 ZW。 为 Infineon 创建。 但所有这些都不会对 DLC 产生影响、对吧?

    我想你误解了我。 无论我尝试哪种配置、DLC 都始终具有值0。 我只是想、例如、如果我更改 RTR 位、那么示波器也会显示我发送一个远程帧、但无论我输入什么、DLC 也会自动为0、并且还会出现一个错误帧。 与 XID 相同、如果我设置为1、那么我会在 Oszilosskop 上获得一个更长的 ID、但是无论我输入什么、也仍然存在 DLC = 0。
    因此、DLC 永远不会在软件中设置的波形中显示、它始终保持为0。

    为了达到其底部、我尝试了 TESTMODE "SPI 和 M_CAN 内核测试模式"。 起初、我想使用库中的函数、但我没有在任何地方找到描述哪些函数是合适的模式。 使用命令"AHB_WRITE_32 (0x0800、0xC82004A1);"、我激活了测试模式(看门狗关闭、否则我在 GPO2上没有信号)。 激活 TESTMODE 后、我尝试发送一个与示例结构相同的 CAN 消息。 我在 Oszilosskop 上看到了下面的图片。 我有一个时钟、但只有将 CAN 消息设置为连续发送。 如果消息只发送一次、那么我只会得到第一个边沿、而不会得到任何其他信息。

    为什么我在这个 TESTMODE 中甚至没有获得正确的信号、这就是为什么我得到 DLC = 0的原因? 或者您有其他想法吗?

    非常感谢。

    此致

    Timo

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

    您好、Timo、

    功能调用  TCAN4x5x_Device_EnableTestMode (TCAN4x5x_DEVICE_TEST_MODE_CONTROLLER);将器件配置为 SPI 和 MCAN 测试模式、并分别细分 TXD 和 RXD 信号 GPO2和 GPIO1。 在这种状态下、CAN 控制器仍然希望看到它自己的数据从 CAN 总线中得到反映(只要 TXD 为显性状态、RXD 就应该为显性状态)。 如果 RXD 信号在 TXD 驱动为低电平时被采样为高电平、器件会将其识别为错误。 确保从 TXD (GPO2)到 RXD (GPIO1)信号、数字连接天气或通过 CAN 收发器发生回路(以模拟环路延迟)。  

    我看不到共享范围快照。 您是要单独发布吗?

    此致、
    Eric Schott

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

    尊敬的 Eric:

    抱歉、我忘记发送示波器照片。 但我发现了错误。 当写入 TX 缓冲区时、只写入1个字。 第二个或第三个字中的所有其他值都没有写入缓冲区。 现在、我收到了整个 CAN 消息、并且可以设置和更改 DLC 以及其他所有内容。

    我现在遇到的唯一问题(希望是最后一个问题)是、我仍然在每条消息的末尾得到错误帧。 无论远程帧还是数据帧。 这样做的原因可能是什么? 我附上了以下消息的图片。

    此致

    Timo

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

    您好、Timo、

    很抱歉、我没有时间进一步研究这个问题。 明天我将运行一些测试、看看我是否可以重新创建您在这里看到的内容。

    再次提醒我、此设置仅包含 TCAN4550正确吗? CAN 总线上没有其他节点?

    此致、
    Eric Schott

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

    尊敬的 Eric:

    是的。该设置仅由发送消息的 TCAN4550组成。 示波器会记录此消息、但没有其他节点。

    此致

    Timo

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

    尊敬的 Eric:

    我注意到、当我将 TCAN4550EVM 连接到另一个 CAN 节点时、错误帧消失。

    感谢您的所有支持。

    此致

    Timo