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-Q1:如果有效载荷全部为0、则发送 CAN 消息会生成 TCAN4550

Guru**** 2473260 points
Other Parts Discussed in Thread: TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1457411/tcan4550-q1-sending-can-messages-wit-payload-all-zero-generate-issues-tcan4550

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

工具与软件:

大家好!

我正在使用 TCAN4550开发一个板、用于通过 CAN FD 进行扩展。

我的应用包括一个在多个 CAN 端口之间重新传输 CAN 帧的器件、如一个路由器。 到目前为止、我正在 TCAN4550的 CAN 模块与 uC 的集成 DCAN 模块(TMS570LS1227ZWT)之间测试 retransmisison。

我的日常工作包括:

-> CAN 寄存器3 ISR 处理程序:

-阅读新消息

-将相关信息(DLC,扩展 ID 标志,有效负载)复制到临时缓冲区

-在 TCAN 模块上重新传输消息

我在有效负载数据全部设为0时发现了一个问题、特别是我看到 TCAN 多次随机发送消息而不是一次(我检查后发现 CAN3上没有收到虚假消息或 CAN 3 ISR 中的条目)。 这就导致 TCAN 模块多次发出消息、并在抛出 PEA 错误并为总线关闭设置标志的过程中随机停止。

如果至少一位有效载荷数据不同于0、则该问题不存在。

下面我报告了我的 MRAM 配置以及 ISR 处理程序例程。

如何发送数据全为零的帧而不会出现问题? 我可以知道链接到有效载荷、因为如果我强制静态有效载荷不同于0、或者只是发送有效载荷不同于0的消息、则问题不再发生。

写入例程是 TMS570的 TCAN4550演示节点1中的一个例程

SPI 设置为18MHz、TCAN4550的晶体为40MHz、UC 频率设置为180MHz。

我已在总线负载的50%以上进行了重新传输测试、没有任何问题、因此它似乎与任何物理层问题无关。

CAN 3 IRS 处理程序:

 if (node == canREG3)

Received_frames[CAN_PORT_3]++;
if (Forward_To > 0)

//获取 ID
if (CAN_Ports[CAN_MODULE_3].IDExtended)

CAN_REG3[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_RX[CAN_PORT_3]].FRAME_id Receive_Buffer = canGetID (canREG3、MessageBox)>>0U;
Receive_Buffer = 1;
}
设计

CAN_REG3[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_RX[CAN_PORT_3]].FRAME_id Receive_Buffer = canGetID (canREG3、MessageBox)>>18u;
Receive_Buffer = 0;
}
//获取数据
can_REG3[can_port_3][can_transmit_queue_index_rx[can_port_3].dlc Receive_Buffer =(uint8_t) canGetPacketData (canREG3、MessageBox、can_REG3][can_port_3][can_transmit_queue_index_rx[can_port_3].data Receive_Buffer);

//这是跟踪消息是否不能同时发送的必要条件、因此仍然设置相应的标志
标头。 DLC = CAN_DLC[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_RX[CAN_PORT_3]].dlc;//将 Receive_Buffer 设置为等于或小于数据有效载荷(如果您的 DLC 是8个字节、则可以将64字节的数据数组传递到 WriteTXFIFO 函数中、但只会读取前8个字节)
标头。 ID = CAN_ID[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_rx[CAN_PORT_3].FRAME_id;//设置 Receive_Buffer。 1号电路板使用0x128、2号电路板使用0x158
标头。 XTD = Receive_Buffer;

TCAN45xStatus[9]= MCAN_WriteTXFIFO (CAN4_MSB_TX_INDEX、&HEADER、CAN_FIFO[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_RX[CAN_PORT_3]].data Receive_Buffer);

IF (TCAN45xStatus[9]>0)

AHB_WRITE_B_FL_32 (M_CAN_TXBAR、TCAN45xStatus[9]);//现在我们可以发送先前排队但未发送的 TX FIFO 元素1数据。
DataTxCount++;

}
if (++CAN_TRANSMIT_QUEURE_INDEX_RX[CAN_PORT_3]>=RX_BUFFER_LEN)

can_transmit_queue_index_rx[can_port_3]= 0;
}
if (++CAN4_MSB_TX_INDE>20)

CAN4_MSB_TX_INDEX = 0;
}

//调试
TCAN45xStatus[0]= AHB_READ_B_FL_32 (SPI_STATUS);
TCAN45xStatus[1]= AHB_READ_B_FL_32 (DEV_IR);
TCAN45xStatus[2]= AHB_READ_B_FL_32 (0x0824);
MCAN_ReadInterruptRegister (&MCAN_IR);//读取中断寄存器
}

MRAM 配置

#define TCAN_NominalBitRatePrescaler 1.
#define TCAN_NominalTimeSeg1andProp 32.
#define TCAN_NominalTimeSeg2 8.
#define TCAN_NominalSyncJumpWidth 8.

#define TCAN_DataBitRatePrescaler 1
#define TCAN_DataTimeSeg1andProp 32.
#define TCAN_DataTimeSeg2 8.
#define TCAN_DataSyncJumpWidth 8.

/* TCAN MRAM 配置*/
#define MRAM_SIDNumElements 1 //标准 ID 元素数量
#define MRAM_XIDNumElements 1 //扩展 ID 号
#define MRAM_Rx0NumElements 64 //RX0数量
#define MRAM_Rx0ElementSize MRAM_8_FIFO//RX0 Byte_Data 数据有效载荷大小(使用 defines)
#define MRAM_Rx1NumElements 0 //RX1元素数量
#define MRAM_Rx1ElementSize MRAM_8_FIFO//RX1 Byte_Data 数据有效载荷大小(使用 defines)
#define MRAM_RxBufNumElements 0 //RX buffer 数量
#define MRAM_RxBufElementSize MRAM_8_R2C/RX Byte_Data 缓冲区数据有效载荷大小(使用 define)
#define MRAM_TxEventFIFONumElement 0 //TX 事件 FIFO 元素数量
#define MRAM_TxBufferNumElements 21 /TX buffer 数量
#define MRAM_TxBufferElementSize MRAM_8_TX/TX Byte_Data 缓冲区数据有效载荷大小(使用 define)

如果有人能给我一个提示,这将是非常感谢,谢谢!

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

    我更新了该线程、声称我能够通过更改消息标头的有效载荷大小(DLC)来重现问题。

    似乎 使用大于8字节的 DLC 有助于避免消息传输停止。 我不明白为什么。 我检查了 TXFQS 寄存器来检查是否存在可用的 FIFO、并且我使用 Put 索引作为 FIFO 使用的参考、但这个值并没有改变。 您可能会理解、由于我需要静态地更改消息的 DLC、因此我不能使用超过8字节的有效载荷

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

    尊敬的 Alberto:

    我很抱歉因假期而延迟响应。

    我是否理解您使用1Mbps 针对具有80%采样点的 CAN 标称(仲裁)和数据比特率?

    您是发送传统 CAN 消息还是 CAN FD 消息?

    [报价用户 id="629754" url="~/support/interface-group/interface/f/interface-forum/1457411/tcan4550-q1-sending-can-messages-wit-payload-all-zero-generate-issues-tcan4550 "]

    我在有效负载数据全部设为0时发现了一个问题、特别是我看到 TCAN 多次随机发送消息而不是一次(我检查后发现 CAN3上没有收到虚假消息或 CAN 3 ISR 中的条目)。 这就导致 TCAN 模块多次发出消息、并在抛出 PEA 错误并为总线关闭设置标志的过程中随机停止。

    如果至少一位有效载荷数据不同于0、则该问题不存在。

    [报价]

    PEA 是消息的仲裁阶段的协议错误。  这意味着未正确对固定或所需的位进行采样。  如果在传输过程中发生 PEA 之类的错误、TCAN4550将尝试重新传输该消息、直到成功无错误地传输该消息。 这可能就是为什么您会看到消息被"随机"多次发送、并且在发送错误计数器(TEC)超过上限时最终进入总线关闭状态的原因。

    造成错误的原因可能是 TCAN4550与 CAN 总线上其他接收节点之间存在位时序和采样点位置问题。  但是、这可能是消息缓冲器本身的内容出现错误。  您能否提供正在加载到 TCAN4550的 MRAM TX 缓冲器元素中的 TX 消息缓冲器内容?

    您可以尝试读回并记录各种状态、中断和错误计数器寄存器吗? (0x000C、0x0820、0x0824或0x1050、0x1040、0x1044)

    CANH 和 CANL 之间的总线端接电阻是否总共为60欧姆(两组120欧姆)?

    您能否捕获正在生成错误的 CAN 消息的任何示波器图?  

    CAN 协议使用位填充、将传输的连续1或0的数量限制为5、并且该器件将在连续位的长字符串之间自动插入或填充极性相反的单个位。  在本例中、全零数据有效负载将导致一串很长的显性位、并且器件将在每5个显性位后插入或填充一个隐性位。  如果比特率过快、或者总线负载和终端没有足够的时间达到所需的隐性电压、则可能会看到来自该单一隐性位的错误无法达到完整的隐性电平。

    更改一个数据位将导致消息的数据部分添加额外的隐性位、并分解位填充。  但是、我希望错误发生在数据阶段、而不是正如您所指出的那样发生在消息的仲裁阶段。 协议状态寄存器(PSR 0x1044)中的信息可能能够提供附加信息和错误代码。

    您是否尝试过使用全部为1的数据字段进行反向转换?

    您是否尝试过使用较慢的 CAN 比特率配置或不同的采样点位置?

     使用大于8字节的 DLC 似乎有助于避免消息传输停止。 我不明白为什么。 [报价]

    这也可能指向位采样或时序配置问题、不同的 DLC 值会导致消息标头中出现不同的位。  

    此致、

    Jonathan