在 Raspberry PI B+ 上将十六进制值发送到 SPI

Send HEX values to SPI on a Raspberry PI B+

我有一个 LED 灯条,我想用 Raspberry PI 控制它。我已将它连接到 GPIO10 (MOSI) 和 GPIO11 (CLK)。 SPI模块加载在Raspbian.

我创建了一个文件并发送到 /dev/spidev-0.0,当我这样做时我可以控制 LED。

如果我发送的文件看起来像下面的文件,我会关闭 LED。

00000000   00 00 00 00  80 00 80 00  80 00 80 00  80 00 80 00  ................
00000010   80 00 80 00  80 00 80 00  80 00 80 00  80 00 80 00  ................
00000020   80 00 80 00  80 00 80 00  80 00 80 00  80 00 80 00  ................
00000030   80 00 80 00  80 00 80 00  80 00 80 00  80 00 80 00  ................
00000040   80 00 80 00  80 00 80 00  80 00 80 00  80 00 80 00  ................
00000050   80 00 80 00  80 00 80 00  80 00 80 00  80 00 80 00  ................
00000060   80 00 80 00  80 00 80 00  80 00                     ..........

如果我发送的文件看起来像下面的文件,我会打开 LED。

00000000   00 00 00 00  FF FF FF FF  FF FF FF FF  FF FF FF FF  ................
00000010   FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF  ................
00000020   FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF  ................
00000030   FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF  ................
00000040   FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF  ................
00000050   FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF  ................
00000060   FF FF FF FF  FF FF FF FF  FF FF                     ..........

我的问题是如何在 Python 中执行此操作?我想即时创建这个字符串并将它们发送到 SPI 接口。

构建这些字节串很简单:只需使用 \x 转义码。

这是一个简单的例子,我在 Python 2.6 上测试过,但在 Python 3 上应该也能正常工作。

hdr = b'\x00' * 4
blocksize = 51
leds = (
    #LED off
    hdr + b'\x80\x00' * blocksize,
    #LED on
    hdr + b'\xff\xff' * blocksize,
)

fname = '/dev/stdout'
with open(fname, 'wb') as f:
    f.write(leds[0])

该代码创建文件以关闭 LED;要打开它,只需执行 f.write(leds[1]).

字符串上的b前缀表示该字符串是字节串。 Python 2 不需要该前缀,因为 Python 2 字符串是字节字符串对象,但它应该在 Python 3 中使用,因为 Python 3 字符串是 Unicode字符串对象。

我的代码写入 /dev/stdout 以简化测试,因为我没有 Raspberry Pi,但您可以轻松地将文件名更改为 /dev/spidev-0.0.

这是其输出的十六进制转储:

00000000  00 00 00 00 80 00 80 00  80 00 80 00 80 00 80 00  |................|
00000010  80 00 80 00 80 00 80 00  80 00 80 00 80 00 80 00  |................|
00000020  80 00 80 00 80 00 80 00  80 00 80 00 80 00 80 00  |................|
00000030  80 00 80 00 80 00 80 00  80 00 80 00 80 00 80 00  |................|
00000040  80 00 80 00 80 00 80 00  80 00 80 00 80 00 80 00  |................|
00000050  80 00 80 00 80 00 80 00  80 00 80 00 80 00 80 00  |................|
00000060  80 00 80 00 80 00 80 00  80 00                    |..........|
0000006a