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.

[参考译文] TCAN4550:MCU 接收停止/无中断

Guru**** 2805925 points

Other Parts Discussed in Thread: TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1079446/tcan4550-receiving-stopped-no-interrupt-to-mcu

部件号:TCAN4550
“线程: 测试”中讨论的其它部件

您好,

我已经设置了多个 CAN 节点,在这些节点上工作了一段时间,但经过一段时间后,其中一些节点停止接收。  

在注意到 TCAN 接收到数据但未向 MCU 提供中断(GPIO2配置为向 MCU 提供中断)后,发现 TCAN 接收到数据。

以下是供参考的配置:

MCU 的 SPI 速度设置为6Mbps

/************************* TCAN 配置************** /

TCAN4x5x_Device_ClearSPIERR();//清除由于 MCU 启动期间 PIN mux 发生变化而可能设置的任何 SPI ERR 标志

/*步骤一尝试清除所有中断*/
TCAN4x5x_Device_Interrupt _Enable dev_ie ={0};//初始化为0至所有位均设置为0。
TCAN4x5x_Device_ConfigureInterruptEnable(&DED_IE);//为了简单起见,禁用所有与 MCAN 无关的中断

TCAN4x5x_Device_Interrupts dev_ir ={0};//设置新的 MCAN IR 对象以方便中断检查
TCAN4x5x_Device_ReadInterrupts (/dev/ir);//请求使用当前设备(非 MCAN)中断值更新结构

//printmsg("PWRON %x",dev_ir.PWRON);

如果(dev_ir.PWRON)//设置了“启动中断”标志
TCAN4x5x_Device_ClearInterrupts (/dev/ir);//清除它是因为如果它在~4分钟内未被清除,它将进入睡眠状态

/*配置 CAN 总线速度*/
TCAN4x5x_MCAN_NOMINAL_Timing_Simple TCANNomTiming ={0};// 40 MHz 晶体的500k 仲裁(((40E6 / 2)/(32 + 8)= 500E3)
TCANNomTiming.NominalBitRatePrescaler =2;
TCANNomTime.NominalTqBeforeSamplePoint =32;
TCANNomTime.NominalTqAfterSamplePoint =8;

TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming ={0};//具有40 MHz 晶体的500kbps CAN FD (40E6 /(15 + 5)= 2E6)
TCANDataTiming.DataBitRatePrescaler =2;
TCANDataTime.DataTqBeforeSamplePoint =32;
TCANDataTiming.DataTqAfterSamplePoint =8;

/*配置 MCAN 核心设置*/
TCAN4x5x_MCAN_CCCR_Config cccrConfig ={0};//记得初始化到0,否则会出现随机垃圾!
cccrConfig.FDOE = 1;// CAN FD 模式启用
cccrConfig.BRSE = 1;// CAN FD 位速率开关启用

/*配置默认 CAN 数据包过滤设置*/
TCAN4x5x_MCAN_Global_Filter_Configuration GFC ={0};
GFC.RRFE = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC.RRFS = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC.ANFE = TCAN4x5x_GFC_reject;//如果传入消息与过滤器不匹配,默认行为是接受 RXFIO0接收扩展 ID 消息(29位 ID)
GFC.ANFS = TCAN4x5x_GFC_reject;//如果传入消息与过滤器不匹配,默认行为是接受标准 ID 消息的 RXFIO0 (11位 ID)

/*
*在下一个配置块中,我们将 MCAN 核心设置为:
*- 1 SID 滤芯
*- 1个 XID 过滤器滤芯
*- 5 RX FIFO 0元件
*- RX FIFO 0支持高达64字节的数据有效负载
*- RX FIFO 1和 RX 缓冲器不会有任何元素,但我们仍会设置它们的数据有效负载大小,即使这不是必需的
*-无发射事件 FIFO
*-2个传输缓冲区,支持多达64字节的数据负载
*
TCAN4x5x_MRAM_Config MRAMConfiguration ={0};
MRAMConfiguration.SIDNumElements = 1;//标准 ID 元素数,您必须为定义的每个元素都有一个写入 MRAM 的过滤器
MRAMConfiguration.XIDNumElements = 1;//扩展 ID 元素数,您必须为定义的每个元素编写一个过滤器到 MRAM
MRAMConfiguration.Rx0NumElement = 16;// RX0元素数
MRAMConfiguration.Rx0元素大小= MRAM_32_Byte 数据;// RX0数据有效负载大小
MRAMConfiguration.Rx1NumElements = 0;// RX1元素数
MRAMConfiguration.Rx1元素大小= MRAM_32_Byte_Data;// RX1数据有效负载大小
MRAMConfiguration.RxBufNumElements = 0;// RX 缓冲区元素数
MRAMConfiguration.RxBufElementSize = MRAM_32_Byte_Data;// RX 缓冲区数据有效负载大小
MRAMConfiguration.TxEventFIFO 元素= 0;// TX 事件 FIFO 元素数
MRAMConfiguration.TxBufferNumElements = 8;// TX 缓冲区元素数
MRAMConfiguration.TxBufferElementSize = MRAM_32_Byte_Data;// TX 缓冲区数据有效负载大小


/*使用上述设置配置 MCAN 核心,此块中的更改为写保护寄存器,*
因此,一次完成所有操作是最有意义的,所以我们只解锁一次,然后锁定一次*/

TCAN4x5x_MCAN_EnableProtectedRegisters ();//首先让受保护的寄存器可访问
TCAN4x5x_MCAN_ConfigureCCCRRegister (&cccrConfig);//启用 FD 模式和比特率切换
TCAN4x5x_MCAN_ConfigureGlobalFilter(&GFC);//配置全局过滤器配置(默认 CAN 消息行为)
TCAN4x5x_MCAN_ConfigureNominalTiming_Simple (&TCANNomTiming);//设置标称/仲裁位计时
TCAN4x5x_MCAN_ConfigureDataTiming_Simple (&TCANDataTiming);//设置 CAN FD 计时
TCAN4x5x_MRAM_CLEAR ();//清除所有 MRAM (向所有 MRAM 写入0)
TCAN4x5x_MRAM_Configure (&MRAMConfiguration);//设置与 MRAM 配置相关的适用寄存器
TCAN4x5x_MCAN_DisableProtectedRegisters();//禁用保护写入并使设备退出初始化模式


/*设置要为 MCAN */启用的中断
TCAN4x5x_MCAN_Interrupt _Enable mCAN_ie ={0};//记得初始化到0,否则会出现随机垃圾!
mCAN_i.RF0NE = 1;// RX FIFO 0新消息中断启用

TCAN4x5x_MCAN_ConfigureInterruptEnable(&mCAN_IE);//启用相应的寄存器


/*设置过滤器,此过滤器将把 ID 为0x055的任何邮件标记为优先级邮件*/
TCAN4x5x_MCAN_SID_Filter SID_ID ={0};
SID_ID.SFT = TCAN4x5x_SID_SFT_DUALID;// SFT:标准滤波器类型。 配置为经典过滤器
SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;//标准滤波器元件配置,将其作为优先信息存储在 RX fifo 0中
SID_ID.SFID1 =唯一 ID;// SFID1 (经典模式筛选器)
SID_ID.SFID2 = global_ID;// SFID2 (经典模式掩码)
TCAN4x5x_MCAN_WriteSIDFilter (0,&SID_ID);//写入 MRAM

/*配置 TCAN4550与 CAN 无关的功能*/
TCAN4x5x_dev_config devConfig ={0};//请记住初始化为0,否则将出现随机垃圾!
devConfig.SWE_DIS = 0;//保持休眠唤醒错误已启用(这是一个禁用位,而不是启用位)
devConfig.device_reset = 0;//未请求软件重置
devConfig.WD_EN = 0;//看门狗已禁用
devConfig.nWKRQ_config = 0;// Mirror INH 函数(默认)
devConfig.INH_DIS = 0;// INH 已启用(默认)
devConfig.GPIO1_GPO_config = TCAN4x5x_dev_config_GPO1_MCAN_INT1;// MCAN nINT 1 (默认)
devConfig.fail_safe_EN = 0;//已禁用故障安全(默认)
devConfig.GPIO1_config = TCAN4x5x_dev_config_GPIO1_CONFIG_GPO;// GPIO 设置为 GPO (默认)
devConfig.WD_action = TCAN4x5x_dev_config_WDT_action_nINT;//看门狗设置中断(默认)
devConfig.WD_bit_reset = 0;//不要重置看门狗
devConfig.nWKRQ_voltage = 0;//将 nWKRQ 设置为内部电压轨(默认)
devConfig.GPO2_config = TCAN4x5x_dev_config_GPO2_MCAN_INT0;// GPO2无行为(默认)
devConfig.CLK_REF = 1;//输入晶体为40 MHz 晶体(默认)
devConfig.wak_config = TCAN4x5x_dev_config_wak_both _edges;//唤醒引脚可由任一边缘触发(默认)
TCAN4x5x_Device_Configure (&devConfig);//使用上述配置配置配置设备

TCAN4x5x_Device_SetMode (TCAN4x5x_device_mode_normal);//配置完成后设置为正常模式。 这条线路将打开收发器

TCAN4x5x_MCAN_ClearInterruptsAll();//重置所有 MCAN 中断(不包括任何 SPIERR 中断)

/************************* TCAN 配置结束************** /

/******************** 接收 停止时注册值*************** /

状态注册0x000C:4000A
中断注册器0x0820:4AA
MCAN 接口注册器0x824:10101
错误计数注册器0x1040:b00000
协议状态注册器0x1044:25300f
中断注册器0x1050:10101
模式控制0x0800:c84004a0
Rx FIFO 0配置0x10A0:8010000c
RX FIFO 0状态0x10A4:3090a

/******************** 接收 停止后注册值***************** /

 

由于 RX_FIFO 寄存器正在接收数据,但对 MCU 的中断却没有生成级,所以我无法准确找到问题所在。

谢谢  

蒂尔特拉伊·索兰基

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

    蒂尔特拉伊

    我已将此分配给一位专家,以便他们能够提供帮助。

    此致,

    埃里克·哈克特  

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

    埃里克,您好!

    感谢您的回复。

    您能给出一些估计时间段。  

    实际上,我们即将推出产品,并且在产品测试期间面临这一问题,其中节点数为8。

    此致  

    蒂尔特拉伊·索兰基

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

    您好,Tirthraj,

    当您说“MCU 中断未生成”时,您能否阐明 nINT,GPO2和 GPIO1引脚的值?  它们总是高还是低等?  我知道 MCU 没有响应新的中断,但我不知道这是因为中断引脚一直处于低位还是一直处于高位。  

    要么是有一些中断位未被清除,这些中断位正在屏蔽 MCU 的新中断位,要么是设备停止生成中断,我发现这种中断不太可能。  通常有未清除的中断位来掩盖新的中断位。

    我发现寄存器0x0824中设置了三个特定的 MCAN 中断。  如果不是所有这些都得到维修和清除,则它们可能会阻止 PIN 在收到新消息时更改状态。  您是否还可以提供寄存器0x0830和0x1054的值(MCAN 中断启用)?

    您可能需要验证是否仅启用和禁用其他中断。

    我从寄存器0x0842中看到,您正在获得时间戳环绕(TSW),高优先级消息(HPM)和 RF0N (RX FIFO 0新消息。  这些都是常见的中断。 时间戳计数器已绕过,需要确认(清除)。  有两种类型的计数器可供选择,可以更改分隔符以降低计数器的速度,并防止您经常清除此中断。  如果您当前未使用时间戳计数器,则这可能是掩码新消息中断位的位集。 我还看到您在 RX FIFO 0 (RF0N)中有一条新消息,也有一条高优先级消息,它只是一种消息类型的指定。  所有这些中断都需要清除,以便在配置用于 MCAN 中断的 GPIO 引脚上发生状态变化时生成新的中断。

    您的错误计数寄存器0x1040报告了 CEL[7:0]值,但有不少错误表明某些节点上的配置可能存在一些问题,并且信号完整性不好,导致位错误。  REC[6:0]和 TEC [7:0]值为零,因此 CEL 错误可能是旧的,只需读取即可清除。

    您还可以在状态寄存器0x000C 中设置一些标志,这表示 SPI 通信可能存在问题。  写入下溢(第18位)表明在指定的 SPI 消息中传输的数据不足。  这也可能是设置 SPI 错误中断(位1)的原因。  TCAN4550计算切换低和高的芯片选择信号之间的时钟周期(或位)数,以确保消息中传输的位数正确,以此作为错误检查的形式。  如果位数不正确,它将放弃写入时收到的数据,并且不会使用此新损坏的数据更改寄存器或 MRAM 数据。  如果传输的数据字节或字词太少,它也将假定出现错误并设置如图所示的写入下溢位。  这些错误是全局错误,将作为中断反映在 nINT 引脚上,而不是 GPIO 引脚上,但这些错误表明寄存器和 RX/TX FIFO 消息读取/写入可能未正确完成。  如果 SPI 错误持续存在,则需要验证 SPI 信号是否正确且质量良好。

    此致,

    乔纳森

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

    乔纳森您好,

    感谢您的快速响应。

    今天,在使用 我前面提到的相同配置进行测试时,我们没有看到问题。

    此外,我们将再次进行测试,并将在更新完成后立即提供给您。

    此致

    蒂尔特拉伊·索兰基

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

    您好,Tirthraj,

    感谢您的更新,我希望它能继续无问题地运行。  我没有看到任何明显的问题是你上一个帖子的问题,所以它的配置看起来很好。  我会在您进行其他测试时保持线程打开,以便您在遇到其他问题时可以继续进行。

    此致,

    乔纳森

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

    乔纳森您好,

    在这些天的测试中,我们再次注意到同一问题,我正在附上我们收集的一些数据,请您也提供帮助。

    发生问题时节点1数据:

    GPIO2值0 (即 低)
    状态注册0x000C:8.
    中断注册器0x0820:4a2
    MCAN 接口注册器0x824:10105
    中断字段注册0x0830:809628ff
    错误计数注册器0x1040:FF0000
    协议状态注册器0x1044:25300f
    中断注册器0x1050:10105
    中断启用注册器0x1050:1.
    模式控制0x0800:c84004a0
    Rx FIFO 0配置0x10A0:8010000c
    RX FIFO 0状态0x10A4:1020210

    请注意,两个节点都在不同的总线上,此数据供参考

    发生问题时的节点2数据:

    GPIO2值0 (即 低)
    状态注册0x000C:804000e
    中断注册器0x0820:4AA
    MCAN 接口注册器0x824:10105
    中断字段注册0x0830:809628ff
    错误计数注册器0x1040:200000
    协议状态注册器0x1044:25300f
    中断注册器0x1050:10105
    中断启用注册器0x1050:1.
    模式控制0x0800:c84004a0
    Rx FIFO 0配置0x10A0:8010000c
    Rx FIFO 0状态0x10A4:10f0f10

    系统重置后节点2数据:

    GPIO2值1 (即 高)
    状态注册号0x000C:834000e
    中断注册器0x0820:4a8
    MCAN 接口注册器0x824:10000
    中断字段注册0x0830:809628ff
    错误计数注册器0x1040:0
    协议状态注册器0x1044:300f
    中断注册器0x1050:10000
    中断启用注册器0x1050:1.
    模式控制0x0800:c84004a0
    Rx FIFO 0配置0x10A0:8010000c
    Rx FIFO 0状态0x10A4:0
    设备 ID =8

    还想提到的是,我们没有使用 GPIO 1,因此它没有连接,在开发的初始阶段,我们发现 nINT 引脚上的中断过多,无法区分是错误中断还是数据中断, 因此,我们迁移到 GPIO 2 ,目前我们不使用 nINT Pin 的任何功能。

    此致

    蒂尔特拉伊·索兰基

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

    您好,Tirthraj,

    只是为了澄清,当您说这两个节点位于不同的总线上时,您告诉我这些设备不是相互通信,而是处于两个不同的测试设置上,对吗?  您能告诉我巴士的外观,还是提供一个简单的图表?  我很好奇它们上有哪些类型的收发器,我知道你已经提到总线上有8个节点。 例如,它们都是 TCAN4550设备,还是只有一个 TCAN4550,以及您发送消息的频率等?  此外,总线的长度,节点之间的间距等是多少?  您是否已尝试交换总线上节点的位置,该错误是随物理节点(设备)发生的,还是停留在总线上的特定位置?

    我已查看设备寄存器。  我发现节点1具有完全 RX FIFO 0, 但我看不到什么迹象表明,除非 MCU 清除了所有中断位,否则 GPIO2引脚为什么会停止生成中断,这将导致即使在收到新消息时 GPIO2引脚仍保持低电平。  在 MCU 检查中断寄存器并尝试清除中断寄存器(例如在收到新消息后)后,您能否确认 GPIO2引脚是否正过渡回高位?

    我看到总是设置时间戳环绕(TSW)和高优先级消息接收(HPM)位。  这些问题是否也已被清除,或者您只是清除 RX FIFO 相关位?

    我观察到的节点1的所有内容都适用于节点2,但节点2还有一些其他观察内容。  “状态寄存器0x000C”显示还存在一些与 SPI 相关的错误,这些错误可能会导致一些问题。  如果错误发生在写入事务上,MCU 可能认为寄存器已更新,但 TCAN4550可能会放弃该事务,因为它不符合 SPI 要求,如正确的位数或 SPI 时钟周期。  MCU 是否在发现 SPI 错误时监控 SPI 错误并验证寄存器值?  访问 MRAM 以从 TX 和 RX FIFO 写入或读取数据时也会出现 SPI 错误,因为这些 FIFO 仍需要传递32位的倍数。

    SPI 错误仅作为 nINT 引脚上的中断传递,但在每次 SPI 事务开始时,NCS 引脚被拉低后,总是在 SDO 引脚上报告。  

    您能否验证 SPI 信号质量是否良好,是否应无噪音和错误?  我不希望 SPI 驱动程序中出现基于您工作多少的协议错误,因此我怀疑信号质量较差,或者可能有某种形式的时钟中断会导致 SPI 错误。  

    另一个可能导致 SPI 错误或某些设备损坏和信息丢失的问题是设备时钟中断(晶体或单端时钟),这将阻止数字内核在 SPI 信息中完全向设备传递数据, 或从发送或接收 CAN 消息。  您能否与我分享 TCAN4550原理图的部分以及您连接到设备的哪些组件(包括晶体/时钟)?

    我还看到 CAN 静音位设置与其中一个设备故障保护功能相关。  这表明在总线上检测不到 CAN 活动的时间超过了大约1秒的超时时间。  总线上是否有足够的 CAN 消息来确保不应设置此标志?  硬件是否可以解释为什么此节点在一段时间内看不到导致其设置此标志的消息?

    此致,

    乔纳森

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

    乔纳森您好,

    1.是的,两个节点之间没有通信,并且它们处于不同的设置中,这一点是正确的。

    所有收发器均为 TCAN4550。

    3.每个总线上的节点数如下图所示,其中不同颜色代表不同的总线。

    4.消息收发频率是随机的。

    5.两个节点之间的最大间距为1米,总线最大长度为100米,每个总线可连接的最大设备数为100。

    6.是的,已尝试在总线上更改位置,但也要注意,问题不出在任何特定的设备或位置。 这是一种随意的方式。

    7.到目前为止,我们只清除了 SPI 错误和 Rx FIFO 位。 我们已实施以清除您提到的其他状态,目前该配置正在测试中。

    8.同时,我将检查 SPI 信号并向您提供更新。  

    您能否提供电子邮件 ID 来共享总 线架构系统的原理图文件和图像?

    此致

    蒂尔特拉伊·索兰基

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

    您好,Tirthraj,

    我已向您发送了一封电子邮件,您可以使用它来提供这些文件。

    此致,

    乔纳森