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发送 CAN 消息

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/951198/tcan4550evm-not-able-to-transmit-can-message-from-tcan4550

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

您好!

我正在使用 NXP (i.mx 8M Nano board)处理 TCAN4550、以便能够发送和接收 CAN 消息。我正在使用 PCAN 仿真器查看传输和接收的 CAN 消息。 我能够从 TCAN 板接收消息到 NXP 板 、但在将 CAN 消息从 NXP 板传输到 TCAN 板时、能够将0长度有效载荷发送到 TCAN4550 (CAN 消息、在仿真器上接收到其消息 ID 和长度=0)。我已附加 PCAN 的屏幕截图 模拟器。您的指导将受到高度赞赏。

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

    BIpin、

    感谢您的关注、我能问一下正在开发的应用是什么吗?  

    此外、在您的主题帖标题中、您提到无法从 TCAN4550-Q1进行传输、但在帖子的正文中、您似乎无法接收。 我只想澄清一下您遇到了哪些问题。

    此外、如果您访问 TI.com 上的 TCAN4550-Q1产品文件夹、则会有一个软件用户指南、介绍如何使用 TCAN4550-Q1器件接收和发送消息。 我建议您在调试问题时阅读此内容。

    此致、

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

    尊敬的 Eric:

    很抱歉、造成混淆。我尝试将 NXP nano 电路板的 CAN 消息发送到 TCAN4550、但只能发送 CAN 消息 ID 而不能发送有效载荷。我能够成功接收来自 TCAN4550到 NXP nano 电路板的消息。 希望这可以清除现在的混乱。

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

    BIpin、

    感谢您的澄清。 是否可以读取中断寄存器0x0820和0x0824? 我想查看是否引发了任何中断、从而阻止 TCAN4550-Q1接收到完整的 CAN 消息。

    此致、

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

    尊敬的 Eric:

    寄存器0x820->GLOBALERR、SPIERR

    对于寄存器0x824->PED:数据阶段中的协议错误(使用数据位时间)。

    在模拟器上只能看到消息 ID。 如前所述、数据长度为0。

    谢谢。

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

    BIpin、

    感谢您提供的这些信息、在 NXP 电路板的 CAN 帧数据部分期间、似乎会出现某种错误。 一些 CAN 控制器配置为在检测到错误时立即停止传输、您能确定 NXP 板是否按这种方式配置?

    您是否可以通过示波器捕获 CANH 和 CANL 信号? 此外、由于 SPI 错误被置为有效、这意味着寄存器0x000C 中的中断被置为有效。 您能否读取0x000C 以了解中断在哪里?

    此致、

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

    Eric、

    使用示波器时、我无法在 CANL 和 CANH 上看到信号。 此外、我读取寄存器000c.I 会得到 "SPI_ERROR_INTERRUPT 和 Internal_access_active"错误。

    此致、

    BIpin

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

    BIpin、

    了解 CAN 总线、如果根本没有帧通过、则可能是 NXP 器件的问题、因为 TCAN4550-Q1不会做任何事情来停止作为接收器的传输。 是否有办法检查 NXP 电路板上是否有任何中断或错误?

    此致、

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

    Eric、

    我想 NXP 电路板上的中断没有问题、因为我们在 NXP 电路板上只使用 SPI 通信。 我们是否有可能将 CAN 数据写入 TCAN4550、但它没有写入、因此我们无法获取数据?

    此致、

    BIpin

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

    尊敬的 Eric:

    还有一个疑问。  在数据表中、MRAM 中 TX 缓冲器的起始地址为0x8270。 但是、当我 使用 TI 提供的函数"TCAN4x5x_MCAN_WriteTXBuffer()"时、 计算得出的起始地址为0x81bc。计算得出的起始地址是否错误,这就是为什么我们无法在相应的 TX 缓冲区中写入数据的原因????。我正在粘贴函数定义以供您参考,以便您参考 可以看到如何在函数中计算起始地址。

    如果我的理解有误、请予以更正。

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    TCAN4x5x_MCAN_WriteTXBuffer (uint8_t bufIndex、TCAN4x5x_MCAN_TX_Header *标头、uint8_t dataPayload [])

    //步骤1:获取的起始地址
    uint32_t SPIData;
    uint16_t startAddress;
    uint8_t i、元件尺寸、温度;


    //获取 TX 开始位置和大小...
    #ifdef TCAN4x5x_MCAN_cache_configuration
    SPIData = TCAN4x5x_MCAN_Cache[TCAN4x5x_MCAN_Cache_TXBC];
    其他
    SPIData = AHB_READ_32 (REG_MCAN_TXBC);
    #endif
    startAddress =(uint16_t)(SPIData 和0x0000FFFF)+ 0x8000;
    //发送 FIFO 和队列号
    temp =(uint8_t)(((SPIData >> 24)& 0x3F);
    元件尺寸=温度> 32? 32:温度;
    //专用发送缓冲器
    temp =(uint8_t)(((SPIData >> 16)& 0x3F);
    元件尺寸+=温度>32? 32:温度;

    if (bufIndex >(元件尺寸-1)){
    返回0;

    //获取每个 TX 元素的实际元素大小
    #ifdef TCAN4x5x_MCAN_cache_configuration
    SPIData = TCAN4x5x_MCAN_Cache[TCAN4x5x_MCAN_Cache_TXESC];
    其他
    SPIData = AHB_READ_32 (REG_MCAN_TXESC);
    #endif
    元件尺寸= TCAN4x5x_MCAN_TXRXESC_DataByteValue (SPIData 和0x07)+ 8;

    //计算最新索引的实际起始地址
    startAddress +=(((uint32_t)元件大小* bufIndex);

    //现在我们需要实际检查我们正在写入的数据量(因为如果我们要发送8字节 CAN 数据包、我们不需要填充64字节 FIFO)
    元件大小=(TCAN4x5x_MCAN_DLCtoBytes (header->DLC & 0x0F)+ 8)>> 2;//将其转换为字、以便通过除以4来更轻松地读取、并且只查看数据有效载荷
    if (TCAN4x5x_MCAN_DLCtoBytes (header->DLC & 0x0F)% 4){//如果我们没有完整的数据字... 我们需要舍入到最近的字(默认情况下、它会截断)。 只需添加另一个字即可完成。
    元件尺寸+= 1;

    //读取数据,从猝发读取开始
    AHB_WRITE_BURST_START (startAddress、ElementSize);
    SPIData = 0;

    SPIData |=((uint32_t) header->ESI & 0x01)<< 31;
    SPIData |=((uint32_t) header->XTD & 0x01)<< 30;
    SPIData |=((uint32_t) header->RTR & 0x01)<< 29;

    IF (标头->XTD)
    SPIData |=((uint32_t) header->ID & 0x1FFFFFFF);
    其他
    SPIData |=((uint32_t) header->ID & 0x07FF)<< 18;

    AHB_WRITE_BURST_WRITE (SPIData);

    SPIData = 0;
    SPIData |=((uint32_t) header->DLC & 0x0F)<<16;
    SPIData |=((uint32_t) header->BRS & 0x01)<< 20;
    SPIData |=((uint32_t) header->FDF & 0x01)<< 21;
    SPIData |=((uint32_t) header->EFC & 0x01)<< 23;
    SPIData |=((uint32_t) header->mm & 0xFF)<< 24;
    AHB_WRITE_BURST_WRITE (SPIData);

    //获取实际数据
    元件大小= TCAN4x5x_MCAN_DLCtoBytes (header->DLC & 0x0F);//返回数据字节数量
    I = 0;//用于计算我们已读取的字节数。
    while (i <元件大小){
    SPIData = 0;
    //如果 ElementSize - I < 4、则表示我们位于最后一个字上、其中一个字的长度小于4字节
    如果((元件尺寸- I)< 4){
    while (i <元件大小)

    SPIData |=((uint32_t) dataPayload[i]<<((i % 4)* 8));
    i++;

    AHB_WRITE_BURST_WRITE (SPIData);
    }否则{
    SPIData |=((uint32_t) dataPayload[i++]);
    SPIData |=((uint32_t) dataPayload[i++)<< 8;
    SPIData |=((uint32_t) dataPayload[i++)<< 16;
    SPIData |=((uint32_t) dataPayload[i++)<< 24;

    AHB_WRITE_BURST_WRITE (SPIData);

    IF (I >元件尺寸)
    I =元件尺寸;

    AHB_WRITE_BURST_END ();//终止突发读取

    return (uint32_t) 1 << bufIndex;//返回检索到的字节数

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

    BIpin、

    好的、我现在理解了、我认为 NXP 板是另一个 CAN 控制器。

    至于 TX 缓冲区起始地址、该地址不需要为0x8270、这取决于您在应用中自己的存储器分配。 在软件用户指南中、使用的示例发现 TX 缓冲区起始地址为0x8270、但这不是定义的起始地址。

    由于报告的数据阶段存在协议错误、消息本身未完成其完全传输、因此这就是未接收到数据的原因。 寄存器0x1018位6中的 DAR 位。 这样、控制器就能够在未正确传输消息时持续重新发送消息。 您可以检查该位的状态吗? 我想确保它设置为0、以便控制器持续发送帧、您可以捕获波形。 我认为、我们需要了解导致数据阶段协议错误的原因、从而弄清这一点。

    此致、