起因
最近做了个树莓派相关的项目,需要用的spidev这个库。但怎么都调不出来数据,spidev的库描述的十分简洁。前前后后花了四个晚上调试,依旧是毫无进展,四处查找资料。嗯……不得不说,现在的博客都大同小异,无非就是把spidev这一页的资料拉过来再描述一遍,还有好一点的,也都是非常通用的一个例子。
函数简介
-
open(bus, device)
连接到指定的spi设备,可打开的设备/dev/spidev<bus>.<device>
在树莓派上使能spi之后,会在/dev目录下看到/dev/spi0.0和/dev/spi0.1
如下图
-
readbytes(n)
从SPI设备中读取n个字节 -
writebytes(list of values)
向SPI设备中写入数据 -
writebytes2(list of values)
功能和writebytes是相似的,如果values过长,超过/sys/module/spidev/parameters/bufsiz
定义的字节,原始的values则会被分割为多块,并且分多次发送。并且这里的values也能接受byte array,不一定要要转化为list也可使用。在进行图像传输的时候这里会方便很多。 -
xfer(list of values[, speed_hz, delay_usec, bits_per_word])
执行一次spi传输,并且在此期间,两个block的clk之间cs管脚会被释放并且重新激活。中间的delay以us为单位。
这是什么意思呢,用逻辑分析仪抓一下就知道了,这里执行了两次传输,中间cs被释放拉高。当金星传输的时候,cs再次被拉低。
-
xfer2(list of values[, speed_hz, delay_usec, bits_per_word])
执行一次SPI传输,但是片选始终被拉低在两次传输之间。
-
xfer3(list of values[, speed_hz, delay_usec, bits_per_word])
功能和xfer2相似,但是在list的长度大于/sys/module/spidev/parameters/bufsiz
时会被分割成许多块,然后多次发送。 -
close()
断开和spi设备的连接
spi属性
- bits_per_word
- cshigh
- loop
- no_cs
- lsb_first
- max_speed_hz
- mode
spi的四种工作模式
Mode 0 CPOL=0, CPHA=0 —>对应到这里 0b00
Mode 1 CPOL=0, CPHA=1 —>对应到这里 0b01
Mode 2 CPOL=1, CPHA=0 —>对应到这里 0b10
Mode 3 CPOL=1, CPHA=1 —>对应到这里 0b11 - threewire
三线的SPI