和I2C一样,SPI除了支持内核驱动方式也可以通过用户态来驱动。
1、内核级驱动方式
待补充
2、用户态驱动方式
spi和i2c一样,除了可以通过spi总线方式驱动也可以通过gpio模拟方式驱动,因手头板子spi总线的io被占用,因此这里记录gpio模拟的方式
内核配置开启用户态驱动以及gpio模拟的支持
设备树添加spi节点
spigpio{
compatible = "spi-gpio";//必须该设定,用于内核平台总线驱动能probe到
#address-cells = <0x1>;
#size-cells = <0x0>;
sck-gpios = <&pio PB 4 0>;//实际io设定
miso-gpios = <&pio PB 5 0>;
mosi-gpios = <&pio PB 6 0>;
cs-gpios = <&pio PB 7 0>;
num-chipselects = <1>;
/* clients */
spidev0:spi@0{
compatible = "spidev";//用于生成用户态的设备节点
reg = <0>;
spi-max-frequency = <12000000>;
};
};
};
内核目录已经有自带一个spi测试程序,
Tina-Linux/lichee/linux-5.4/tools/spi
交叉编译该目录下的spitest程序并拷贝到板子上
ubuntu@ubuntu:~/mq_r/Tina-Linux/lichee/linux-5.4/tools/spi$ arm-openwrt-linux-gcc spidev_test.c -o spitest
arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
ubuntu@ubuntu:~/mq_r/Tina-Linux/lichee/linux-5.4/tools/spi$ ls
Build Makefile spidev_fdx.c spidev_fdx.o spidev_test.c spidev_test.o
include spidev_fdx spidev_fdx-in.o spidev_test spidev_test-in.o spitest
更新设备树到板子上后查看下是否有生成spi设备节点
root@TinaLinux:/# ls /dev
bus i2c-2 mmcblk0p6 sunxi-reg
by-name input mmcblk0p7 sunxi-wlan
cedar_dev ion null tty
console kmsg ptmx ttyS0
cpu_dma_latency mmcblk0 pts ubi_ctrl
disp mmcblk0p1 random udmabuf
fb0 mmcblk0p2 rfkill urandom
full mmcblk0p3 shm usb-ffs
g2d mmcblk0p4 snd zero
gpiochip0 mmcblk0p5 spidev2.0
把mosi和miso短接进行回环自发自收测试
root@TinaLinux:/# ./spitest -D /dev/spidev2.0 -v
spi mode: 0x4
bits per word: 8
max speed: 500000 Hz (500 KHz)
TX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.........................|
RX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.........................|
root@TinaLinux:/#
不短接的测试
root@TinaLinux:/# ./spitest -D /dev/spidev2.0 -v
spi mode: 0x4
bits per word: 8
max speed: 500000 Hz (500 KHz)
TX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.........................|
RX | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................................|
root@TinaLinux:/#
用户态驱动很方便芯片或者方案厂商用来提供自己spi芯片方案的驱动实现供用户参考,如semtech的lorawan 网关芯片sx1302等网关芯片的驱动参考都是基于用户态的。