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.

[参考译文] Linux/AM5728:SPI 偶尔暂停传输中间

Guru**** 2588145 points
Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/587285/linux-am5728-spi-occasionally-pausing-mid-transfer

器件型号:AM5728

工具/软件:Linux

您好!

我们正在努力在   运行 Linux (版本4.4.-12)的定制 AM5728板和仅从属器件之间实现 SPI 通信。 AM5728配置为以9.6MHz 运行的主器件。 当从器件具有要发送的数据时 、它会将 GPIO 设置为高电平。 在 Linux 上运行的程序会监控 GPIO 信号、而在变为高电平时、将执行128字节传输。 在测试过程中、我们看到了128字节传输暂停中间传输。 暂停时间从微秒到毫秒不等、并随机发生。

所附图像显示了 SPI 上两个128字节的突发(显示了 CSn 和 SCLK)。 128字节的突发每~4.2ms 发生一次、每次只需~250us。 在第二次数据突发期间、在数据卸载中途有3ms 的暂停。  系统上没有其他用户程序在运行、这 种情况经常发生、尽管并非总是3ms。

什么会导致传输暂停?

具有较高优先级的进程是否可以中断 SPI 传输?

如果可能、另一个进程会中断 SPI、是否有方法可以通过提升用户程序的优先级或禁用后台进程来禁用所有其他后台中断?

我们已经尝试为 SPI 程序分配关联值、以测试在 CPU0或 CPU1上运行是否更改了行为、但在任何一个内核上、我们仍然会偶尔看到传输暂停。 使用 cat /proc/interrupts、我们检查了其他哪些进程可能会中断它、但我们不确定如何更改它、以便它们不再中断、或者我们是否应该中断。 下面是 cat /proc/interrupts 输出的屏幕截图。

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

    尊敬的 Juan:

    [引用 user="Juan Gonzalez65"]    运行 Linux 的定制 AM5728板(版本4.4.12)[/quot]

    您是否使用 AM572x TI PSDK 03.00.00?

    [引用用户="Juan Gonzalez65"] AM5728 配置为以9.6MHz 运行的主设备[/quot]

    您的意思是 AM572x SPI 时钟引脚上具有9.6MHz 频率吗?

    [引用 USER="Juan Gonzalez65">当从器件有数据要发送时 、它会将 GPIO 设置为高电平。 在 Linux 上运行的程序会监控 GPIO 信号、而在变为高电平时、将执行128字节传输。 [/报价]

    您正在使用 GPIO 引脚向 AM572x 器件发送信号以开始传输、但在开始实际传输之前、是否使用 AM572x SPI CS 引脚选择 SPI 从器件?

    [引述 USER="Juan Gonzalez65">在测试过程中、我们看到了128字节传输暂停中间传输。 暂停时间从微秒到毫秒不等、并随机发生。[/引述]

    您在这个128字节传输中有暂停、还是在两个128字节传输之间有暂停?

    发生暂停时、您是否看到引脚 SPI_CS 无效? 如果是、您可以尝试使用 MCSPI_CHxCONF[20]强制位来处理此问题。 可以使用 spim.MCSPI_CHxCONF[20]强制位在字之间使 spim_cs[i]保持活动状态。

    请参阅 AM572x TRM 第24.4.3.5.2节"强制 spim_cs[i]模式、24.4.3.5.3 Turbo 模式"




    此致、
    帕维尔

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

    感谢你的答复。

    我们使用的是 TI PSDK RT 版本3.02.00.05。

    是的、AM572x SPI 时钟引脚上具有9.6MHz 频率。

    是的、在 SPI 传输之前、我们首先使用 CS 来选择从器件。 这将是我原始帖子中第一个图像中的黄色轨迹线(低电平有效)。

    在128byte 传输之间和128byte 传输本身内观察到暂停。 原始帖子中的第一个图像显示了128byte 传输中的暂停。 蓝色线迹为 SPI CLK、您可以看到它只是停止(CS 仍然处于活动状态)、并在~3ms 后继续。 暂停时间并不总是~3ms、观察到的值从微秒到毫秒不等。

    正如您在原始帖子中的图像中看到的、CS 在暂停期间仍处于活动状态、实际上在字节之间保持活动状态。 当我们使用 SPI 时、Linux 运行的其他操作似乎会导致暂停、因为即使我们只运行 SPI 传输软件、其他操作也会出现这种情况。 我们以前运行过 BareMetal SPI 驱动程序、并且在从 Linux 中管理 McSPI 时仅看到此暂停问题。

    我们如何最好地确定和避免发生中断? 我随附了/proc/interrupts 的屏幕截图、以防有所帮助。

    是否有办法确保我们的软件在最高优先级运行、以便任何东西都不会中断它?


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

    胡安

    [引用 USER="Juan Gonzalez65"]是的,AM572x SPI 时钟引脚上的频率为9.6MHz。[/引用]

    您是否可以尝试将其提高到最大48MHz (如果您的从设备支持此速度)? 在这种情况下、您可能会获得更好的性能。

    [引用 user="Juan Gonzalez65">您可以在原始帖子中看到、CS 在暂停期间仍处于活动状态、实际上在字节之间保持活动状态。 当我们使用 SPI 时、Linux 运行的其他操作似乎会导致暂停、因为即使我们仅运行 SPI 传输软件、也可以看到这一点。[/QUERPILE]

    是否还可以使用"top"命令检查您没有运行任何其他进程?

    [引用 user="Juan Gonzalez65">我们如何才能最好地确定和避免发生中断? 我随附了/proc/interrupts 的屏幕截图、以防有所帮助。

    是否有办法确保我们的软件以最高优先级运行、以便任何东西都不会中断它?

    您可以尝试使用"nice (好)"命令。 另请参阅以下 e2e 线程是否将提供帮助:

    此致、
    帕维尔