我正在尝试编写一个程序,该程序将安装在 Linux MCU(Raspberry Pi)上,该程序将读取从另一个 MCU(我将自己构建的自制程序)发送到它的串行数据。
[MCU不是正确使用的术语。 Raspberry Pi 使用 SoC(片上系统)。微控制器比 SoC 更便宜、更简单。如果你想使用TLA,那么就使用SBC,单板计算机。]
[您误用了术语“串行端口”和“串行数据”。如今,由于 PC 的普及,“串行端口”已专门指 EIA/RS-232 异步串行连接。 SPI。 USB。 I2C、TWI、SATA等等不应将其称为“串行”连接,除非您正在解释它们的工作原理。]
在 Linux 中,SPI 设备驱动程序通常作为“平台驱动程序”而不是字符驱动程序。因此这样的驱动程序不会有文件操作,或者fops, 去表演open(), read(), write() or close()。此类操作针对的是平台设备连接到系统的目标设备。因此,平台设备中没有设备节点/dev
就像目标设备一样。 SPI与USB、PCI属于同一类别;它们都是总线,通常作为平台驱动程序实现。
我的理解是,我可以使用 SPI 从连接的 MCU 设备读取数据,并且我不需要为该设备编写自己的设备驱动程序。这是真的?
答案取决于您使用的内核是否有公开的 SPI 字符设备供您的用户程序使用。但如果 SPI 驱动程序是平台驱动程序,则必须实现自定义 SBC 的设备驱动程序。该目标设备需要一个节点/dev
、分配的主要号码和次要号码以及与这些号码关联的驱动程序。该驱动程序将利用 SPI 驱动程序提供的平台操作或使用 Linux SPI API 来执行传输。 SPI 及其驱动程序只是用于在该处理器和目标设备之间传输数据的管道。与 SATA 和 PCI 一样,用户很少意识到这些将外围设备连接到计算机的(内部)总线。
linux/drivers/spi/spi_bcm2708.c
是一个平台驱动程序。它没有fops支持/执行open(), read(), write() or close()运营。它将自己注册为 SPI 主设备,因此其他(目标)驱动程序可以使用 SPI API 为其服务。
在我看来,您最好在 RPI 和您的自定义 SBC 之间实现 EIA/RS-232 链接。如果使用非规范(原始)传输,那么当您转换/升级到 SPI 连接时,您编写的代码可能有 99% 都可以重用。无流量控制的 3 线串行连接类似于 SPI 连接,但没有强加主/从层次结构、更简单的硬件接口以及更长的电缆长度。
请注意,无论使用何种电缆,您都可能无法在长 SPI 距离下实现快速传输速率。 SPI 的 10 Mbps 速率通常在具有接地层和短走线的多层板上实现。