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**** 2586845 points
Other Parts Discussed in Thread: TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1093636/tcan4550-how-to-increase-the-reception-of-can-data-frames-per-second

部件号:TCAN4550

尊敬的团队:

       我们在基于i.MX8M微型处理器的硬件中使用TCAN4550模块,内核5.4 .70的tcan4x5x驱动程序已修改。  我们设置了以下配置,

       SPI频率:18MHz
       晶体时钟频率:40MHz
       传输CAN数据的比特率:500kbps

        目前,我们可以使用模拟器以500 Kbps的速度接收每秒150帧。 超过160帧/秒后,我们会注意到candump应用程序挂起。 帧有8个字节的数据,而有效负载共有16个字节的帧。

       我们需要测试我们的硬件,以便每秒从CAN模拟器接收1500个数据帧。 CAN模拟器每秒发送1500个数据帧。 如何增加CAN数据帧的接收?
       我是否需要在DTS文件的MRAM配置中增加RX FIFO 0和RX FIFO 1值?

DTS文件中的当前tcan4x5x配置如下所示。

&ecspi3 { 
        fsl,spi-num-chipselects = <1>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi3>;
        cs-gpios = <&gpio5 25 GPIO_ACTIVE_LOW>;
        status = "okay";

        tcan4x5x1: tcan4x5x@0 {    
                compatible = "ti,tcan4x5x";
                reg = <0>;
                pinctrl-names = "default";
                #address-cells = <1>;
                #size-cells = <1>;
                interrupt-parent = <&gpio1>;
                interrupts = <15 IRQ_TYPE_LEVEL_LOW>;
                spi-max-frequency = <18000000>;
                bosch,mram-cfg = <0x0 3 2 32 10 1 32 7>;
                clocks = <&hclk>, <&cclk>;
                clock-names = "hclk", "cclk";
                data-ready-gpios = <&gpio1 15 GPIO_ACTIVE_HIGH>;
                reset-gpios = <&gpio3 20 GPIO_ACTIVE_HIGH>;
                status = "okay";
        	};
	};

此致,
Aysha T

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

    您好,Aysha,

    我们有一个很好的应用说明,介绍了如何为TCAN4550编写软件。第5部分实际上会介绍优化,以提高数据发送和接收的效率,从而最大限度地提高设备的性能。 我强烈建议遵循第5节中列出的步骤,特别是5.3 ,它会批量读取传入的CAN消息。 实际上,您可以增加FIFO大小以存储多条传入的CAN消息,然后仅执行1个SPI事务以同时读取所有内容。 这意味着您的CAN设备可以连续读取传入的消息并将其存储在FIFO中。 您必须牢记一些事项,以确保不会覆盖数据或错误地阅读邮件。 因此,我建议通读第5节的全部内容。

    如果您已经预制了所有这些优化,那么我们可以谈谈您的系统中还有什么可能会阻碍您的发展。

    最佳,

    Chris

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

    您好,Chris:

    在“5.1 SPI事务空闲时间”部分中,它指定减少空闲时间。 我们是否需要更改任何tcan或m_can寄存器设置,以缩短空闲时间并发送最大CAN消息?
    您是否有任何参考代码来使SPI模块支持FIFO操作,从而允许用户一次排队多个数据字?

    5.3 部分 指定批量数据传输。 我们正在使用内核5.4 .70的tcan4x5x驱动程序。 是否支持批量传输?
    要支持批量传输,需要对驱动程序进行哪些更改?

    此致,
    AyshaT

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

    Aysha,

    您在5.1 中阅读的内容是有关如何编写代码以减少SPI空闲时间的最佳实践。 没有可更改以降低闲置时间的设置。 这要由您编写代码的方式来决定,以减少闲置时间。  如果您阅读该部分,它将指导您如何编写代码以获得最佳的SPI效率。 SPI模块没有FIFO操作,这是您需要执行突发读取的情况。

    同样,批量传输的能力将取决于您编写代码的方式。 使用当前设备,您应该能够执行批量数据传输。 以下是5.3 部分中概述的步骤:

    如果遵循此过程,您应该能够读取包含一个SPI事务的消息,然后将最后一条消息的索引发送到确认寄存器。 这将释放您阅读的所有消息。 这大大缩短了每次读取SPI之后必须写入Acknowledge寄存器的时间。 但是在5.3 部分有一个警告,所以我强烈建议通读整个部分,以确保您的FIFO不会溢出。 当您在FIFO中读取多条消息并且尚未发送确认位时,就会发生这种情况。 如果FIFO中有更多的消息,则可能会开始溢出,并且消息可能会丢失。

    最佳,

    Chris

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

    亲爱的Chris:

    CAN设备在一秒内接收到的最大数据帧数是多少? 帧的大小是多少?
    您是否有关于接收每秒1000帧的CAN数据的参考? 要获得最大帧速率,需要哪些MCAN配置? 是否有数据可作为证据?
    哪种MCU或MPU用于测试最大帧速率? CPU的速度是多少?

    此致,
    Aysha T

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

    您好,Aysha,

    CAN总线每秒处理的数据帧数将由使用的数据速率和每个CAN数据包的有效负载大小决定。 如果配置的CAN数据速率为500kbp,假设最大有效负载大小为64字节(仅限CAN FD),并假设最坏情况下的物料位(每个帧的最大位数),则每个CAN数据包的时间将接近1.4毫秒。 这将导致最大帧吞吐量约为每秒700帧。  

    要提高此值,需要提高CAN总线的数据速率,或者需要降低数据有效负载大小。 由于数据有效负载大小可能取决于实际数据,因此更改CAN总线使用的数据速率可能会更容易。 CAN FD允许帧的数据部分使用比仲裁部分更高的数据速率。 如果在此示例中将此数据相位数据速率提高到2Mbps,则CAN分组时间将减少到407us,相应的吞吐量可能超过2400帧/秒。 有关如何对TCAN4550进行编程以获得更高数据速率的信息,请参阅Chris链接的用户指南第4节  "如何为TCAN4550编写软件"。  

    此致,
    Eric Schott

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

    您好,Eric,

             我们已为RF0N进行了配置,在发送数据时不会收到任何中断。 我们已在MRAM配置中将RX FIFO 0配置为64字节。 当缓冲区已满 时,我们可以获得中断,并且在ifconfig的RX数据包中更新一个字节的数据。

             但是,对于 发送方发送的第一个字节,接收方端没有发生中断。

    此致,
    Aysha T

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

    您好,Aysha,

    您正在检查什么中断? 当您收到消息时 ,应该抛出M_CAN_INT中断标志,让您知道MCAN设备有中断。 接收到此中断后,应读取中断寄存器0h1050。 这将为您提供信息,说明信息的存储位置以及您的RXFIFO是否有新信息:

    您说您已经配置了RF0N,但这意味着什么? 您执行了哪些步骤来配置设备以使用RX FIFO 0?

    在软件指南中,这是我们指定用于从RX FIFO读取一条消息的命令列表:

    但是406.3884万但是对于 第一个发送方字节,接收器端没有发生中断。
    [/引述]

    仅供确认,当您这样说时,您意味着在向TCAN4550发送消息后,您不会看到中断RF0N = 1。

    最佳,

    Chris

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

    亲爱的Chris:

        我们每2毫秒持续发送8字节的CAN数据,并且CAN数据已成功接收。 但有时,在接收器端检测到帧错误,并且在收到的所有帧都被拒绝为错误帧后,出现了该错误帧,如下面所附的控制台图像中突出显示的那样。 ifconfig命令用于捕获状态。

    要从这种错误状态中恢复,必须在接收器端通过提供以下命令并重新运行发送和接收程序来关闭和打开CAN链路。

        # ifconfig CAN0 down
        # ip link set CAN0 type can bitrate 50万采样点0.750 dbitrate 50万 pro-seg 3 phase seg1 6 phase seg2 1 SJW 1 FD on FD-non-ISO On
        # ip link set CAN0 up
        # ip -det link show CAN0

    为什么会出现这种错误情况? 如何在不断开和连接的情况下从该错误状态恢复。 由于链路的启动和关闭需要一些时间来执行,因此我们可能会松散许多帧。 是否有任何重置或其他方法可以立即从错误状态恢复而不会丢失太多帧。 是否存在我们必须监控的注册表以检查此错误状态并采取措施?

    此致,
    Aysha T

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

    Aysha,

    我将在星期一浏览并与您取得。

    最佳,

    Chris

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

    您好,Aysha,

    您如何计算这些错误,即您正在读取错误帧还是正在读取内部寄存器?

    这些错误是随机出现在8.6万 数据包中,还是一旦发生一个错误,它就会不断地出错?

    当您说错误状态时,是设备进入正常模式以外的其他模式,还是您在谈论设备在出现一个坏帧后如何开始连续出现错误?

    如果您尝试跟踪实际CAN消息错误,则有MCAN寄存器,您可以访问CAN控制器看到的详细错误类型。

    中断寄存器h=1050在数据相位或仲裁相位中有协议错误。 您可以使用 这些位来确定  您的设备是否检测到CAN帧中的错误。

    我建议您等待错误并读取中断位。 让我知道抛出什么标志,以便我们可以找出CAN设备看到的错误类型。

    最佳,

    Chris