嵌入式Linux的两种SPI驱动方式

        和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等网关芯片的驱动参考都是基于用户态的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值