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:如何将 TCAN4550 EVM 与 MCU 连接和配置?

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/882873/tcan4550evm-how-to-connect-and-configure-tcan4550-evm-with-mcu

器件型号:TCAN4550EVM
主题中讨论的其他器件:MSP430FR6989TCAN4550

大家好、

我希望测试 TCAN4550能够正常工作、因此我将使用 MSP430FR6989与其进行连接以进行测试。

我有2个 FR6989 + 2个 TCAN4550 EVM。


连接如下所示:

电源:直流- 12V

演示: TCAN455x 驱动程序库演示(修订版 A)

当在一个 MCU 上按下 S1按钮(发送 CAN 数据)时、另一个 MCU 没有收到相应的中断、我使用逻辑分析仪来监控 CAN 总线波形、并且没有波形。

在硬件上连接错误的位置是什么? 或者我是否需要进行其他设置?

请帮帮我。

此致

Johnson

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

    尊敬的 Johnson:

    我在 TCAN4550 EVM 和 MSP430FR6989 LaunchPad 板之间看不到任何接地连接。  为了使 SPI 通信成功、您需要在 EVM 和 LauchPad 之间建立良好的接地连接。  对于这两组器件、请在 EVM 和 LauchPad 之间连接一根额外的跳线、然后重试通信。 您无需将两个 TCAN4550 EVM 的接地端连接在一起、但每个 TCAN4550 EVM 接地端必须与 SPI 一起连接到 LaunchPad 接地端。

    我希望接地连接可以解决您的问题、但是如果通信仍然不成功、那么您可以使用逻辑分析仪或示波器来捕获 TCAN4550和 MCU 之间的 SPI 通信、以便我可以验证 SPI 是否正常工作?

    此致、

    Jonathan

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

    您好、Jonathan、

    接地后、此问题仍然存在。

    我尝试使用 SPI 读取器件 ID 寄存器。

    波形如下。 结果为"TCAN4550"。

    根据数据表提供的数据、SPI 通信正常。

    我是否需要在电路板上设置其他开关?


    我观察到、当我复位 TCAN4550 EVM (S3)时、D7 (nWKRQ)和 D11 (nINT)将打开、当我执行 CAN 初始化代码时、D11 (nINT)将关闭。 这些看起来正常。

    因此、我认为 SPI 通信应该正常。 问题是我无法在 CAN 总线上捕获数据 TCAN4550似乎未发送数据。  我的连接是否有问题? 它是否与 CAN 配置相关?

    CAN_INT 演示如下(我不会更改任何由 TI 提供的演示):

    TCAN4x5x_Device_ClearSPIERR(); //清除由于我们的引脚多路复用器在 MCU 启动期间发生更改而可能设置的任何 SPI ERR 标志
    
    //第一步尝试清除所有中断*/
    TCAN4x5x_Device_Interrupt_Enable DEV_ie ={0};//初始化为0,以将所有位设置为0。
    TCAN4x5x_Device_ConfigureInterruptEnable (/dev/ie); //为简单起见、禁用所有与 MCAN 无关的中断
    
    TCAN4x5x_Device_interrupts DEV_ir ={0};//设置新的 MCAN IR 对象、以便轻松检查
    TCAN4x5x_Device_ReadInterrupts (&dev_ir);//如果
    
    (DEV_PWRON)、则请求使用当前器件(而非 MCAN)中断值更新结构 //如果加电中断标志被置位
    TCAN4x5x_Device_ClearInterrupts (&dev_ir); //清除它,因为如果它在~4分钟内未被清除,它将进入睡眠
    
    状态//配置 CAN 总线速度*/
    TCAN4x5x_MCAN_Nominal Timing_Simple TCANTiming ={0};//使用40MHz 晶体进行500k 仲裁((40E6 /2)/(32 + 8)= 500E3)
    TCANBitNominate2;// NominateRTCLAMER.NomalePoint
    计时= 32
    TCANNomTiming.NominalTqAfterSamplePoint = 8;
    
    TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming ={0};//具有40MHz 晶体的2Mbps CAN FD (40CR /(15 + 5)= 2E6)
    TCANDataTiming.DataBitRatePrescaler = 1;
    TCANQDataConfig =
    
    
    
    {5* RTCMCAN 0*= TCANQDataPoint.TCANQ5x 0};TCANQDataConfig = TCANQTRFER.TCCQTRENTRY5 *设置= TCANQTRENTRY5 *= TCANQRTCLY0;TCANQRTXT.TCCQDataConfig = TCANQ5//请记住初始化为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_Accept_Into_RXFIFO0;//如果传入消息与过滤器不匹配,则默认行为是接受到 RXFIO0
    //扩展 ID 消息(29位 ID)
    GFC.ANFS = TCAN4x5x_GFC_Accept_Into_RXFIFO0;//如果传入消息与过滤器不匹配,则默认行为是接受到 RXFIO0
    //标准 ID 消息(11位 ID)
    
    /*
    *在下一个配置块中、我们将 MCAN 内核设置为具有:
    *- 1 SID 滤波器元素
    *- 1 XID 滤波器元素
    *- 5 RX FIFO 0元素
    *- RX FIFO 0支持高达64字节的数据有效载荷
    *- RX FIFO 1和 RX 缓冲器将不包含任何元素、 但我们仍然设置它们的数据有效载荷大小、即使不是必需
    的*-无 TX 事件 FIFO
    *- 2个支持高达64字节数据有效载荷
    的发送缓冲区*/
    TCAN4x5x_MRAM_Config MRAMConfiguration ={0};
    MRAMConfiguration.SIDNumElements = 1;//标准 ID 元素数量,对于每个定义
    的 MRAMConfiguration.XIDNumElements = 1的元素,必须有一个写入 MRAM 的过滤器;//扩展 ID 元素数量,对于每个定义
    的 MRAMConfiguration.Rx0NumEElements = 5的元素,必须有一个写入 MRAM 的过滤器;// RX0元素数量
    MRAMConfiguration.RxM64_ElementByte = 5;// RX0// RX0数据有效载荷大小
    MRAMConfiguration.Rx1NumElements = 0;// RX1元素数
    MRAMConfiguration.Rx1ElementSize = MRAM_64_BYTE_Data;// RX1数据有效载荷大小
    MRAMConfiguration.RxBufNumEElements = 0;// RX 缓冲器元素数 MRAM64_BYTE_Data
    ;// RxFACYSize= 0;// EACYM64_ERF_EACYSize= 0
    // TX 事件 FIFO 元素数量
    MRAMConfiguration.TxBufferNumElements = 2;// TX 缓冲区元素数量
    MRAMConfiguration.TxBufferElementSize = MRAM_64_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 时序 AN4x5x_MRAM_CLEAR(&MCRAM5X_CLEAR);/
    设置所有适用的 TCAN4xMRAM 配置寄存器(&MCRAM5X_RAM);//清除 TCAN4xM5X_RAM//禁用受保护的写入并使器件退出初始化模式
    
    
    //设置我们要为 MCAN 启用的中断*/
    TCAN4x5x_MCAN_Interrupt_Enable mCAN_ie ={0};//记住要初始化为0,否则您将得到随机垃圾!
    mCAN_ie.RF0NE = 1;// RX FIFO 0新消息中断启用
    
    TCAN4x5x_MCAN_ConfigureInterruptEnable (&mCAN_IE);//启用相应的寄存
    
    
    器//设置筛选器,此筛选器将把 ID 为0x055的任何消息标记为优先级消息*/
    TCAN4x5x_MCAN_SID_SID_SID_ID ={SF5X_ST_SID_SID_0
    };SFT =标准类型 SFT = 0;SID_SID_SID_SID_SID_0。 配置为经典滤波
    器 SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;//标准滤波器元件配置,将其存储在 RX FIFO 0中作为优先消息
    SID_ID.SFID1 = 0x055;// SFID1 (经典模式滤波器)
    SID_ID.SF2 = 0x7SID_0/SFIDSID2
    ;SIDSIDSID_0 (SID_SIID_SION_SID0)//写入 MRAM
    
    
    //将 ID 0x12345678存储为优先级消息*/
    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 (经典模式滤波器)
    XID_ID.EFID2 = 0x1FFFFFFF; // EFID2 (经典模式掩码)
    TCAN4x5x_MCAN_WriteXIDFilter (0、&XID_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; //镜像 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_ACT_nINT;//看门狗设置中断(默认)
    devConfig.WD_BIT_RESET = 0; //不要复位看门狗
    devConfig.nWKRQ_VOLTAGE = 0; //将 nWKRQ 设置为内部电压轨(默认值)
    devConfig.gPO2_config = TCAN4x5x_dev_config_GPO2_NO_action;// GPO2没有行为(默认值)
    devConfig.CLK_REF = 1; //输入晶振是一个40MHz 晶振(默认)
    devConfig.WAKE_CONFIG = TCAN4x5x_DEV_CONFIG_WAKE_MBot_EDGE;//唤醒引脚可由任一边缘(默认)触发
    TCAN4x5x_Device_Configure (&devConfig); //使用上述配置配置配置 TCAN4x5x_Device_SetMode
    (TCAN4x5x_DEVICE_MODE_NORMAL)配置器件; //设置为正常模式,因为配置已完成。 此行将打开收发器
    
    TCAN4x5x_MCAN_ClearInterruptsAll(); //重置所有 MCAN 中断(不包括任何 SPIERR 中断) 

    此致

    Johnson

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

    您好、Jonathan、

    有关此问题的一些更新:

    我使用示波器捕获 CAN 总线波形、发现:

    按下 Lanuchpad S1 (执行 TCAN4x5x_MCAN_TransmitBufferContents (0);)、

    CAN 总线一直在发送数据、不会停止。 但另一端没有中断。

     

    因此、我更困惑:

    为什么在 CAN 总线上总是有一个数据传输的波形 、尽管一个传输完成了?
    其次、CAN 总线上有波形、但我无法接收中断。 这与 CAD ID 或过滤器有关吗?

    您能帮您使用 FR6989测试此演示吗?  

    此致

    Jonsson

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

    尊敬的 Jonson:

    首先、我将介绍您观察到的消息的重复传输。  当控制器在 CAN 总线上发送一条消息时、它期望从总线上的另一个节点接收一个应答(ACK)。  如果它没有收到 ACK、它将确定消息传输失败、并且它将尝试再次发送消息、直到它收到 ACK。  如果其中一个节点在接收消息时出现问题,它将不会确认收到无错误消息,因此原始节点将持续发送该消息,直到收到 ACK。  这是您观察到的情况、因为每次按下按钮只会导致另一个节点传输和确认单个消息。

    感谢您验证 SPI 通信是否正常。  我认为我们可以消除 EVM 与 MCU 的连接、将其作为问题的原因。  但是、我还是根据新信息和重复的消息再次查看了您的设置图片。  我发现我建议您做一个额外调整。  我看到您正在将插头 J13的"CANH_T"和"CANL_T"引脚用于电路板之间的 CAN 总线导线。  我建议您改用接头 J12的"CANH"和"CANL"引脚。  您当前使用的引脚旨在用作瞬态信号(例如噪声、干扰、失调电压等)的注入点、并在引脚和 CAN 总线之间具有330欧姆的电阻器。  由于您在两个电路板上使用相同的接头、因此您已在两个 TCAN4550收发器之间的每个 CANH 和 CANL 信号上添加了660欧姆的串联电阻器。  您的示波器信号的信号振幅看起来足够大、可以实现正确的通信、但请务必将导线移至 J12、以确保这不是通信误差的原因。

    我的第二个观察结果是、您的 CAN 波形在我看来不符合我对演示软件的期望。  我看不到您的消息 ID 和数据有效载荷是否与我的相同、因为这部分代码位于您共享的代码部分下方。  演示代码在首次启动时发送 ID 为0x144的数据包以及数据为0x55、0x66、0x77和0x88。  然后、代码将缓冲区数据更改为 ID 0x123、并在按下 S1按钮时发送数据0x11、0x22、0x33和0x44。  除非修改了代码、否则我希望您看到这些消息中的一条或另一条。

    这是我希望从 ID 为0x144的第一条消息中看到的波形:

    这是我希望从 ID 为0x123的第一条消息中看到的波形:

    我对示波器波形的观察结果:

    1) 时间刻度显示为关闭。  如果我正在正确读取示波器、则会将其设置为每分段40us。  如果是、您的整个消息看起来大约需要140uS。  使用我的设置中的默认位时序设置、我看到消息以大约66uS 的速度传输。  演示代码假定时钟频率为40MHz、默认情况下、EVM 的电路板上应安装40MHz 晶体。  该代码还将仲裁位速率设置为500kbps、数据速率设置为2Mbps。  因此、要么代码设置不同、要么晶体振荡器出现问题、使时序设置不同。  如果只有一个板出现问题、另一个板将不会确认该消息。

    2) 消息 ID 似乎与演示代码中任一默认消息的预期值不匹配。  消息中的位转换太多、仲裁阶段和消息的数据阶段似乎设置为相同的频率、而不是500kbps/2Mbps 默认值。  

    您能否尝试测量两个电路板上的晶振/时钟频率、并检查消息 ID 和数据缓冲器值?  不应应用任何筛选、并且应确认任何有效消息、但如果您准备传输与我相同的消息、则波形显然与我的不匹配。

    您能否尝试自行为电路板加电并监控每个电路板产生的波形。  它们是相同的吗?  然后接通另一个电路板的电源、查看是否有任何线索提示哪个电路板有问题。  这将有助于指向具有硬件问题或代码损坏等的特定电路板  如果两个电路板看起来相同、则需要再次查看所有代码。

    您是否还可以尝试在代码中设置一些断点并监视 TX 和 RX 缓冲区内容、以查看它们是否符合预期?  一个电路板的 RX 应与另一电路板的 TX 相匹配。  

    希望此消息中的内容能够解决问题或帮助我们解决问题。  一旦您尝试了这些东西、请告诉我您发现了什么。

    此致、

    Jonathan

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

    您好、Jonathan、

    找到问题。

    当我使用两个 FR6989 + TCAN4550进行 CAN 通信时、滤波器 ID 设置需要与另一方发送的 CAD ID 相对应。

    现在、我的设置如下:

    Board1:CAN_ID:0x123   SFID:0x124
    Board2:CAN_ID:0X124   SFID:0x123

    测试结果显示正常。


    感谢你的帮助。

    此致

    Johnson