gpt4 book ai didi

c - 如何从 C 中的串行(SPI)连接读取数据?

转载 作者:太空宇宙 更新时间:2023-11-04 00:21:39 24 4
gpt4 key购买 nike

我正在尝试编写一个将安装在 Linux MCU (Raspberry Pi) 上的程序,该程序将读取从另一个 MCU(我将自己构建的本地开发的东西)传来的串行数据。

我已经研究了如何做到这一点,并认为我有“大局”,但仍然遗漏了一些东西。其一,我需要启用内核模块并允许我自己访问设备:

sudo modprobe spi_bcm2708
sudo chown `id -u`.`id -g` /dev/spidev0.*

从那里我可以使用 this famous C file测试 SPI 连接。

所以现在连接已经存在,但我仍然需要从中读取串行数据。根据this SO question的回答,我只需要:

...open the relevant port for reading, and use read() to get the data.

但是,该答案中的代码片段似乎是通过设备驱动程序而非 SPI 打开端口。

我的理解是我可以使用 SPI 从连接的 MCU 设备读取数据,并且我不需要为该设备编写自己的设备驱动程序。这是真的?如果是这样,我将如何从 SPI 连接读取数据,该代码与上面链接的问题答案中的代码有何不同?

如果我的理解不正确,并且我确实“通读”了设备驱动程序,那么为什么我首先需要驱动程序?这不正是 SPI 希望规避的吗?提前致谢。

最佳答案

I am trying to write a program that will be installed on a Linux MCU (Raspberry Pi) that will read serial data coming to it from yet another MCU (something homegrown that I will build myself).

[MCU 不是正确使用的术语。 Raspberry Pi 使用 SoC(片上系统)。微 Controller 将是比 SoC 更便宜、更简单的设备。如果要使用 TLA,则使用 SBC,单板计算机。]

[您误用了术语“串行端口”和“串行数据”。今天,由于 PC 的普及,“串行端口”已经专指 EIA/RS-232 异步串行连接。接口(interface)接口(interface)。 USB。 I2C、TWI、SATA 等等不应被称为“串行”连接,除非您解释它们是如何工作的。]

在 Linux 中,SPI 设备驱动程序通常作为“平台驱动程序”而不是字符驱动程序来实现。因此,这样的驱动程序不会有文件操作,或者fops , 执行open(), read(), write()close()。这样的操作是对于目标设备,平台设备连接到系统。因此,平台设备不像目标设备那样在 /dev 中有设备节点。SPI 与 USB 和 PCI 属于同一类别;它们都是总线,通常作为平台驱动程序实现。

My understanding was that I could use SPI to read data from the connected MCU device, and that I would not need to write my own device driver for that device. Is this true?

答案取决于您使用的内核是否有一个 SPI 字符设备暴露给您的用户程序使用。但是,如果 SPI 驱动程序是平台驱动程序,则必须为您的自定义 SBC 实现设备驱动程序。此目标设备将需要 /dev 中的节点、分配的主要和次要编号以及与这些编号关联的驱动程序。该驱动程序将利用 SPI 驱动程序提供的平台操作或使用 Linux SPI API 来执行传输。 SPI 及其驱动程序只是在该处理器和目标设备之间传输数据的管道。与 SATA 和 PCI 一样,用户很少知道这些将外围设备连接到计算机的(内部)总线。

linux/drivers/spi/spi_bcm2708.c 是一个平台驱动程序。它没有fops 来支持/执行open()read()write()close() 操作。它将自己注册为 SPI 主机,因此其他(目标)驱动程序可以将 SPI API 用于其服务。

在我看来,您最好在 RPI 和您的自定义 SBC 之间实现 EIA/RS-232 链接。如果使用非规范(原始)传输,那么如果/当您转换/升级到 SPI 连接时,您编写的代码中可能有 99% 都是可重用的。没有流量控制的 3 线串行连接类似于 SPI 连接,但没有强加的主/从层次结构、更简单的 HW 接口(interface)和更长的电缆长度。

请注意,无论使用何种电缆,您都可能无法通过长 SPI 距离实现快速传输速率。 SPI 的 10 秒 Mbps 速率通常是在具有接地层和短走线的多层板上实现的。

关于c - 如何从 C 中的串行(SPI)连接读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13807471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com