【问题标题】:What is the difference interrupt based and poll based SPI transaction基于中断和基于轮询的 SPI 事务有什么区别
【发布时间】:2014-06-28 19:20:51
【问题描述】:

我对 SPI 通信协议有一些疑问。在我的架构上,处理器和 CPLD 设备之间存在 SPI 通信链路。我想写入其中一个 CPLD 寄存器。

我正计划编写 CPLd LKM,它会使用 spi_sync 之类的调用将 CPLD 寄存器的地址和值传递给 spi linux 内核。

那么我是否需要将处理器视为主设备,CPLD 设备作为从设备?

另外,想知道基于中断和基于轮询的 SPI 事务是什么意思,以及为什么建议在启动时使用基于轮询的事务?

【问题讨论】:

    标签: linux-kernel linux-device-driver spi


    【解决方案1】:

    那么我是否需要将处理器视为主设备,将 CPLD 设备视为从设备?

    连接到 CPU 的 SPI 控制器可能是 SPI 主控器(尽管有带有 SPI 控制器的 SoC 可以在主控模式或从属模式下运行)。
    CPLD 设备的 SPI 控制器可能是 SPI 从机(尽管有 CPLD 设计,例如 Xilinx,可以作为 SPI 主机)。

    注意事项:
    有时 SPI 控制器与其设备的耦合如此紧密,以至于它被视为“SPI 设备”,例如 SPI 串行闪存芯片(即从属设备)。

    另外,想知道基于中断和基于轮询的 SPI 事务是什么意思

    您在询问如何向 SPI 驱动程序指示传输完成。这是 SPI 控制器与其处理器之间的交互。
    在多处理操作系统(例如 Linux)中,驱动程序可以在启动 I/O(读或写)操作后挂起线程。 SPI 完成中断将触发 SPI ISR 的执行,然后唤醒挂起的线程并允许驱动程序完成 I/O 操作。
    如果完成时未生成中断,则可以选择轮询方法。在某个时间间隔,将读取 SPI 状态寄存器并检查 I/O 是否完成。如果未完成,则驱动程序将不得不继续等待。如果状态指示传输完成,则驱动程序将完成操作。

    某些 SPI 从设备可能会请求或要求 SPI 主设备执行读取操作。
    通常,ad hoc 机制用于特定于 SPI 从设备。
    设备可能有一个输出信号(通常称为 SPI_IRQ),可用于触发主机上的 GPIO 中断。我不知道有任何轮询方案来取代这种中断机制。

    为什么建议在启动时使用基于轮询的事务?

    大多数(或所有?)引导程序不具备多处理能力。它们的大小通常受到限制,因此通常是单线程的。
    当启动阻塞 I/O 操作时,多处理(或多线程)操作系统可以调度另一个进程或线程执行,并允许中断指示 I/O 操作完成。
    但是,在等待中断时,引导程序可能无事可做。
    所以不用设置中断,只需在等待循环中检查状态即可。

    顺便说一句,“多处理”意味着多个进程。它与多处理器或多核 CPU 无关。

    【讨论】:

    • 感谢@sawdust,当您说“连接到 CPU 的 SPI 控制器”和 CPLD 上的 SPI 控制器时。这是否意味着每个设备都有单独的控制器?
    • 是的,SPI 总线的每个节点都会有一个 SPI 控制器。 (只有一个节点可以是 SPI 主控器。)在典型的 SoC 中,SPI 控制器将是一种不同的外围设备,就像 UART 或 USB 控制器一样。但在 SPI 串行闪存等封装芯片中,我们通常不会费心区分目标设备的内部组件。如果您将 CPLD 视为具有 SPI 接口(CLK、CS、MOSI 和 MISO)的“模块盒”,CPLD 可能属于该类别。
    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多