我们发现 、TCAN4550通过 SPI 的传输效率很低、这会消耗大量 CPU 负载。 如果有固件可以同时传输和接收 CAN 数据包、则可以使 SPI 更高效、尤其是使用 DMA。 它就像双工通信。
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通过 SPI 的传输效率很低、这会消耗大量 CPU 负载。 如果有固件可以同时传输和接收 CAN 数据包、则可以使 SPI 更高效、尤其是使用 DMA。 它就像双工通信。
您好、腓尼基、
您当前使用的是哪种类型的处理器和固件?
由于 TCAN4550上只有一条 SPI 总线、因此无法对同时读取和写入寄存器或存储器 RAM (MRAM)进行全双工访问。 但是、该器件能够在单个 SPI 事务中向连续的存储器地址单元写入和读取多个数据字、并且长度字段设置为字的数量。 这使得一个完整的 CAN 消息能够通过一个 SPI 事务被放置或者从 MRAM 中检索、此事务只需发送一个 SPI 字、此 SPI 字包含用于消息的缓冲器元件的起始地址。
对于裸机 ANSI C 代码、我们有 TCAN4550演示软件。
对于 Linux、驱动程序已上传到内核中、内核通常是内核中 MCAN 驱动程序的包装程序。 这不是最高效的驱动程序、目前正在开发更新的版本、该版本将提高效率并提高 CAN 消息吞吐量。 预计将在几个月内完成。
此致、
Jonathan
感谢你的答复。 但我无法打开 TCAN4550演示软件的链接、可能无法访问该链接。 我正在尝试在一个 SPI 事务中传输数据的方法、但我不知道 TX 队列何时为空。 我想在 TX 队列为空时发送几个 CAN 数据包。 即使 TCAN4550只是启动、MCAN 中断的 TFE 也始终为0。
如何知道 TX 队列何时为空?
您好、腓尼基、
您可以通过向下滚动到设计和开发部分、在 TCAN4550-Q1产品文件夹中找到演示软件的原始链接。 您可能需要首先回答一些安全问题、因此请尝试从该页面上的链接下载。 这是链接。 https://www.ti.com/product/TCAN4550-Q1

关于传输完成的问题、我认为我们需要解决的关于消息传输方式的一些困惑。
该器件可配置为使用专用的 TX 缓冲器、其中 MCU 控制 MRAM 中放置消息的 TX 缓冲器元件、并通过向 TXBAR 寄存器中的相应位写"1"来启动传输。
该器件可配置为使用 TX FIFO、在该 FIFO 中、消息存储在 FIFO 中、并按照消息加载到 FIFO 中的顺序进行传输。 每次发送后、FIFO 的 Get Index 都会周期性递增、直到 FIFO 为空。 MCU 可以检查 Put 索引以确定将下一条消息加载到 FIFO 的位置。 该器件还将计算 Get 和 Put 索引之间的差值、以确定可用(空闲) TX FIFO 元素的数量。
该器件可配置为使用 TX 队列来发送消息、按照 CAN 仲裁协议以最低的消息 ID (最高优先级)开头。 必须将新消息写入 Put 索引引用的 TX 缓冲区、并且添加请求会将 Put 索引周期性地递增到下一个空闲的 TX 缓冲区、直到 TFQF 位指示 TX 队列已满。 但是、消息可能不会按照加载到 TX 缓冲区的顺序进行传输、因此可以读取 TX 缓冲区请求挂起(TXBRP)寄存器来确定哪些缓冲区包含等待传输的消息、哪些缓冲区可用或空闲。 然后、MCU 可以向空闲缓冲区写入新消息、并向 TXBAR 寄存器发出添加请求、以将新消息添加到队列中。
或者、该器件可配置为使用专用 TX 缓冲器和 TX FIFO 的组合。
我的困惑是、您提到您正在使用 TX 队列、但随后您正在读取使用 TX 队列模式时不适用的 TX FIFO 空(TFE)位。 如果使用 TX FIFO 配置、并且 TX 缓冲器配置(TXBC)寄存器0x10C0的 TX FIFO/队列模式(TFQM)位设置为"0"以进行 TX FIFO 操作、则 TFE 位将指示 FIFO 的状态。 如果您使用的是队列、则 TFE 位不适用。
此外、如果使用 TX FIFO、可以查看 TX FIFO/队列状态(TXFQS)寄存器的 TX FIFO 空闲电平(TFFL)位域、以确定 FIFO 中有多少空元素、并将其用作传输状态的指示。
也可以读取 TX 缓冲区发送发生(TXBTO)寄存器来查看所有 TX 缓冲区元素的传输状态。 当一个传输发生时、一个'1'将被写入缓冲器元件。
还可以读取 TX 缓冲区请求挂起(TXBRP)寄存器、以查看哪些缓冲区元素有等待发送的消息、并使用非零寄存器指示仍有多少消息等待发送。
您还可以配置 TX 事件 FIFO、该 FIFO 将创建一个日志、记录消息的传输情况以及消息的传输顺序、这对于某些使用 TX 队列的应用程序可能很有用、因为 TX 队列中的消息是根据消息 ID (优先级)进行传输的。 如果此信息对应用程序有价值、则还会向信息添加时间戳。
[引用 userid="540323" URL"~/support/interface-group/interface/f/interface-forum/1163769/tcan4550-if-there-a-firmware-transmitting-and-recieving-can-packet-by-spi-simultaneously/4378744 #4378744"]我如何知道 TX 队列何时为空?这只能通过 MCU 读取状态寄存器、TX 事件 FIFO 等来完成。正如我刚才指示的那样、我已经确定哪些消息已经被发送、哪些消息仍然被发送。
为了降低 CPU 负载、我建议使用 TX FIFO 配置、允许 MCU 监控可连接到硬件中断引脚的 TFE 位、以指示 TX FIFO 何时为空。 所有非 TX FIFO 配置都要求 MCU 轮询状态寄存器以了解 TX 状态。
我还想指出的是、TCAN4550-Q1使用了 Bosch 开发的 M_CAN FD 控制器 IP。 博世发布的《M_CAN 用户手册》包含有关 CAN FD 控制器配置的更多详细信息、本文档应用作 TCAN4550-Q1数据表的补充文档。 您可以通过此链接 https://www.bosch-semiconductors.com/media/ip_modules/pdf_2/m_can/mcan_users_manual_v330.pdf 下载
此致、
Jonathan
您好!
我很高兴听到正在努力提高 Linux 中的 tcan4x5x 驱动程序的性能。 当记录来自多个高总线负载 CAN 总线的流量时、我主要关注 CPU 负载。 由于 CPU 负载、我开始在500k CAN 总线上以大约50%的总线负载丢弃帧。 系统是一个 iMX8MP。 是否有任何驱动程序可供我测试、或对当前驱动程序进行一些微调? 我使用的是 Linux 5.15.60。
谢谢、
Mattias