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:发送和接收 CAN 数据写入时:没有可用的缓冲区空间问题

Guru**** 2805855 points

Other Parts Discussed in Thread: TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1616748/tcan4550-while-sending-and-receiving-can-data-write-no-buffer-space-available-issue

器件型号: TCAN4550

分别使用 ECSPI1 和 ECSPI3 配置两个 CAN 接口 (CAN0 和 CAN1)。 两个接口都基于 ti、tcan4x5x 驱动程序 (https://github.com/nxp-imx/linux-imx/blob/lf-6.6.y/drivers/net/can/m_can/tcan4x5x-core.c)、CAN 通信通过在 CAN0Left right arrowCAN1 之间连续传输数据进行测试。

在长时间 CAN 流量测试期间、反复观察到以下错误:
写入:没有可用的缓冲区空间

此问题在长时间运行 CAN 接口后发生、而短时测试可以正常运行。

以下是用于 CAN0 的器件树配置(ecspi3 上的 CAN1 采用了类似的配置):
&ecspi1{/* ECSPI3:TCAN4550 CAN-FD2 */
#address-cells =<1>;
#size-cells =<0>;
FSL、spi-num-chipselects =<1>;
pinctrl-names =“default";“;
pinctrl-0 =<&pinctrl_ecspi3 &pinctrl_ecspi3_cs>;
CS-GPIO =<&GPIO5 25 GPIO_ACTIVE_LOW>;
状态=“正常“;

tcan4x5x1:tcan4x5x@0{
兼容=“ti、tcan4x5x“;
reg =<0>;
pinctrl-names =“default";“;
#address-cells =<1>;
#size-cells =<1>;
Interrupt-parent =<&GPIO1>;
中断=<15 IRQ_TYPE_LEVEL_LOW>;
SPI-max-frequency =<18000000>;
Bosch、MRAM-cfg =<0x0 3 2 12 10 0 26 1>;
Clocks =<&hclk>、<&cclk>;
时钟名称=“hclk",“,"cclk"、"cclk";“;</s>“
数据就绪 GPIO =<&GPIO1 15 GPIO_ACTIVE_HIGH>;
RESET-GPIO =<&GPIO3 20 GPIO_ACTIVE_HIGH>;
状态=“正常“;
};
};
它是否与 TCAN4550 驱动器中的 MRAM 配置、中断处理、SPI 吞吐量或 TX 队列饱和有关。
请就我们应如何向前推进提供建议。

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

    尊敬的 Ashwani:

    问题在于 SPI 吞吐量。  您发送的 CAN 消息速度比处理器读取和清除 RX 缓冲区的速度快、这最终会导致 RX FIFO 填满或溢出情况。

    您本质上需要确定处理器检测通过中断或 SPI 寄存器读取到达的新消息所需的总时间、确定用于消息的 RX FIFO 缓冲区、计算缓冲区的起始地址、从缓冲区读取消息内容、然后确认缓冲区已读取并通过 SPI 写入清除中断。   

    SPI 接口将是最大 CAN 消息吞吐量的限制因素。  增加 RX FIFO 缓冲器元素的数量有助于减少增加消息接收的短时间间隔、因为它允许将这些消息保留在存储器中、直到 MCU 可以读取它们。  但是、如果消息接收时间过长、超过处理消息所需的时间、最终会导致溢出、CAN 消息数据将丢失。

    此致、

    Jonathan