@SiberiaBear
2016-04-07T23:54:55.000000Z
字数 2069
阅读 8491
raspberryPi
这是一篇翻译文章,翻译自https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md
树莓派上带有1个SPI,有两个片选引脚。
SPI主机驱动在Raspian系统上默认是关闭的,如果需要打开,可以在/etc/modprobe.d/raspi-blacklist.conf
中将spi-bcm2708
列入白名单,或者使用raspi-config
中打开,重启或通过下列命令手动加载驱动:
$ sudo modprobe spi-bcm2708
SPI总线在P1口的映射是:
F | GPIO | GPIO | F |
---|---|---|---|
MOSI | P1-19 | ||
MISO | P1-21 | ||
SCLK | P1-23 | P1-24 | CE0 |
GND | P1-25 | P1-26 | CE1 |
wiringPi包含了一个库,通过这个库可以方便的调用树莓派片载的SPI接口,直接操作硬件寄存器。
这个是树莓派的C库,提供了一套操作BCM2835芯片上的GPIO和其他IO功能的途径,直接操作硬件寄存器。
在Linux文档中有个SPI的测试代码,可以用来测试树莓派的SPI,通过spidev
来操作SPI总线。
在shell下操作:
# Write binary 1, 2 and 3
echo -ne "\x01\x02\x03" > /dev/spidev0.0
BCM2835有3个SPI控制器,但仅仅SPI0控制器在端口可以使用,BCM2835 ARM Peripherals的第十章介绍了这个控制器。
信号端名称缩写:
信号 | 解释 |
---|---|
SCLK | 串行时钟 |
CE | 片选 |
MOSI | 主机输出从机输入 |
MISO | 主机输入从机输出 |
MOMI | 主机输出主机输入 |
MIMO | 主机输入主机输出 |
在标准的SPI主机模式下,支持3线模式。
在双向SPI主机模式,同样的支持4线模式,但排除使用MIMO代替MISO和MOSI。
LOSSI标准允许与一些设备通信命令也可以传输数据,如LCD。LOSSI命令和参数是8位长度,但是一个额外的数据位用于预测某个字节是命令还是参数。这个额外的数据位在参数时为高电平,在命令时为低电平。最后输出的是9位数据。LOSSI通常在MIPI DBI type C兼容的LCD 控制器中使用。
注:
在SPI中,一些命令可以触发自动读取,所以这个模式不能直接用于传输9位数据的通用SPI中。
CDIV配置决定了CLK寄存器的时钟速率:
SCLK = Core Clock / CDIV
If CDIV is set to 0, the divisor is 65536. The divisor must be a power of 2. Odd numbers rounded down. The maximum SPI clock rate is of the APB clock.
其中must be a power of 2
写错了,应该是must be a multiple of 2
。
当设置为DMA模式时,设置和保留时序设计到自动启动和切断CS线,
- CS 线应该在MSB模式下传输第一个字节前保留至少3个时钟周期。
- CS 线应该当传输完最后一个时钟脉冲后保留不少于1个时钟周期。
默认的linux驱动是spi-bcm2708.
驱动支持如下速率:
cdiv speed
2 125.0 MHz
4 62.5 MHz
8 31.2 MHz
16 15.6 MHz
32 7.8 MHz
64 3.9 MHz
128 1953 kHz
256 976 kHz
512 488 kHz
1024 244 kHz
2048 122 kHz
4096 61 kHz
8192 30.5 kHz
16384 15.2 kHz
32768 7629 Hz
当设置为24MHz是,实际上速率是15.6MHz。
SPI_CPOL - Clock polarity
SPI_CPHA - Clock phase
SPI_CS_HIGH - Chip Select active high
SPI_NO_CS - 1 device per bus, no Chip Select
双方向模式不被支持。
只支持中断。
bcm2708_spi bcm2708_spi.0: master is unqueued, this is deprecated
这个是spi-bcm2708的一个分支,可以允许DMA支持SPI从机驱动。
这个程序可以测试SPI收发功能,将MOSI和MISO线直接相连接,没办法测试时钟和片选信号。
在这里:wget https://raw.github.com/torvalds/linux/master/Documentation/spi/spidev_test.c 下载程序。