1

周末我在玩我的树莓派。我使用了Freenove 的教程来实现一些简单的电路,这些电路由树莓上的 GPIO 引脚控制。

Freenove 教程使用了一个已弃用的名为 WiringPi 的库。除了它已被弃用的事实之外,我的理解是 WiringPi 添加了额外的抽象和简化,以允许用户专注于他们的电路,而不是编写样板代码来集成低级 (C) 库。

现在我想更好地了解用户空间应用程序如何与硬件 GPIO 引脚接口,并且我不担心编写样板代码。所以我开始使用libgpiod,它有一个 C API,可用于读取和设置 GPIO 引脚并且效果很好。

我不清楚的一件事是如何将 40pin 连接器(编号从 1 到 40)上的物理硬件 GPIO 引脚映射到我使用gpioinfo命令时 gpiod 报告的 54 个内部行号之一。

在我的带有 Raspbian 10 的 Raspberry 3b+ 上,该gpioinfo命令打印以下内容,所有行名显示为unnamed. 列表像这样继续,但我将其截断为 10 行。

gpiochip0 - 54 lines:
    line   0:      unnamed       unused  output  active-high 
    line   1:      unnamed       unused  output  active-high 
    line   2:      unnamed       unused  output  active-high 
    line   3:      unnamed       unused  output  active-high 
    line   4:      unnamed       unused  output  active-high 
    line   5:      unnamed       unused  output  active-high 
    line   6:      unnamed       unused  output  active-high 
    line   7:      unnamed       unused  output  active-high 
    line   8:      unnamed       unused  output  active-high 
    line   9:      unnamed       unused   input  active-high 
    line  10:      unnamed       unused   input  active-high 
    [...]

我发现了一个关于缺少 GPIO 行名称的问题,它讨论了这个问题,但我不明白答案或它为什么被关闭。

我应该如何根据引脚名称查找芯片的行号,例如GPIO17?我通过反复试验发现GPIO17映射到线17,但例如CE0映射到线8SCL1映射到线3,这是我通过反复试验了解到的gpioset

我不确定将这个映射硬编码到我的应用程序中是否是一个好主意,或者我是否应该以某种方式以编程方式发现这些值以使程序更具可移植性?

我尝试使用gpiod_ctxless_find_line

gpiod_ctxless_find_line ("SCL1", configuration->chipname, configuration->chipname_length, &offset);

但即使返回0(OK) 的值,结果偏移量66796也不是正确的值。我认为它不会返回任何东西,因为gpioinfo这些行没有名称。

如果我使用 编写 C 程序libgpiod,我可以(应该?)在运行时发现这些映射,还是可以简单地对它们进行硬编码?是否有可能在未来的 Raspberry 上SCL1不会位于物理引脚 5 或映射到第 3 行?

4

1 回答 1

1

在我写这个问题的时候,我发现官方的Raspberry GPIO文档有这些图片,它们显示了映射,然后我意识到第二张图片中的黄色GPIO数字对应于libgpiod行号。GPIOxx所以和 行号之间存在一对一的映射:

在此处输入图像描述

在此处输入图像描述

我想我的学习过程中有两个令人困惑的部分。首先是 WiringPi 使用与 Raspberry 不同的 GPIO 术语。例如,WiringPi 有两个GPIO块,编号GPIO0 (wiringPi)为 所以实际上是在树莓上。GPIO7 (wiringPi)SDA1GPIO21 (wiringPi)GPIO29 (wiringPi)GPIO29 (wiringPi)GPIO21 (raspberry)

第二部分是我的分线板只显示了一些 GPIO 的语义名称,而不是实际的 GPIO 编号(例如,而不是GPIO 2 (SDA)它只显示SDA)。

使用pinout命令可以看到树莓派的官方映射,将 GPIO 映射到物理引脚。gpio readall列中的命令中存在相同的信息BMC,但名称列显示的是wiringPi GPIO名称,而不是上图中的Raspberry pi GPIO名称。

于 2021-04-07T11:59:39.407 回答