ARM40-A5应用——spidev
2019.3.2
版权声明:本文为博主原创文章,允许转载。
SPI是"Serial Peripheral Interface" 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器、传感器、存储设备等。SPI设备分为主设备和从设备两种,在大多数情况下,CPU或SOC一侧通常都是工作在主设备模式,目前的Linux内核版本中,只实现了主模式的驱动框架。
SPI总线用于通信和控制的四根线分别是:
CS 片选信号
SCK 时钟信号
MISO 主设备数据输入、从设备数据输出
MOSI 主设备数据输出、从设备数据输入
spidev是内核中一个通用的设备驱动,本文介绍在ARM40-A5上如何产生/dev/spidev设备节点,通过此节点可以操作挂载在该SPI总线上的设备。
一、生成 /dev/spidev
1.1、使用shell命令生成 /dev/spidev
(1) 加载spidev.ko驱动
insmod spidev.ko
发现生成了以下目录:
ls /sys/class/spi_master/spi0/vm0spidev/
ls /sys/class/spi_master/spi1/vm1spidev/
ls /sys/bus/spi/devices/vm0spidev/
ls /sys/bus/spi/devices/vm1spidev/
此时/dev/目录中还没有spidev设备:
root@ARM40:/# ls /dev/*spi* #查看/dev/下的spidev设备
ls: /dev/*spi*: No such file or directory
生成/dev/spidev设备:
echo 0 > /sys/bus/spi/devices/vm0spidev/new_device #生成/dev/spidev0.0
echo 1 > /sys/bus/spi/devices/vm0spidev/new_device #生成/dev/spidev0.1
echo 2 > /sys/bus/spi/devices/vm0spidev/new_device #生成/dev/spidev0.2
echo 3 > /sys/bus/spi/devices/vm0spidev/new_device #生成/dev/spidev0.3
可以看到:
root@ARM40:/# ls /dev/*spi* #查看/dev/下的spidev设备
/dev/spidev0.0 /dev/spidev0.1 /dev/spidev0.2 /dev/spidev0.3
生成spi1上的spidev命令如下:
echo 0 > /sys/bus/spi/devices/vm1spidev/new_device #生成/dev/spidev1.0
echo 1 > /sys/bus/spi/devices/vm1spidev/new_device #生成/dev/spidev1.1
echo 2 > /sys/bus/spi/devices/vm1spidev/new_device #生成/dev/spidev1.2
echo 3 > /sys/bus/spi/devices/vm1spidev/new_device #生成/dev/spidev1.3
① SPI0对应的引脚为PD10(MISO)、PD11(MOSI)、PD12(SCK)、PD13(CS0)、PD14(CS1)、PD15(CS2)、PD16(CS3);
② SPI1对应的引脚为PC22(MISO)、PC23(MOSI)、PC24(SCK)、PC25(CS0)、PC26(CS1)、PC27(CS2)、PC28(CS3);
③ spidev?.0使用的引脚为SCK、MISO、MOSI、CS0;
④ spidev?.1使用的引脚为SCK、MISO、MOSI、CS1;
⑤ spidev?.2使用的引脚为SCK、MISO、MOSI、CS2;
⑥ spidev?.3使用的引脚为SCK、MISO、MOSI、CS3;
若要撤销/dev/spidev设备,重启系统即可。
1.2、上电即生成 /dev/spidev
若希望系统上电后,自动生成 /dev/spidev,配置如下:
(1) /etc/init.d/S02spidev 文件
touch /etc/init.d/S02spidev
chmod 755 /etc/init.d/S02spidev
其内容为:
#!/bin/sh
set -e
echo "Starting spidev..."
modprobe spidev.ko
#echo 0 > /sys/bus/spi/devices/vm0spidev/new_device #get /dev/spidev0.0
#echo 1 > /sys/bus/spi/devices/vm0spidev/new_device #get /dev/spidev0.1
#echo 2 > /sys/bus/spi/devices/vm0spidev/new_device #get /dev/spidev0.2
#echo 3 > /sys/bus/spi/devices/vm0spidev/new_device #get /dev/spidev0.3
#echo 0 > /sys/bus/spi/devices/vm0spidev/new_device #get /dev/spidev0.0
#echo 1 > /sys/bus/spi/devices/vm0spidev/new_device #get /dev/spidev0.1
#echo 2 > /sys/bus/spi/devices/vm0spidev/new_device #get /dev/spidev0.2
#echo 3 > /sys/bus/spi/devices/vm0spidev/new_device #get /dev/spidev0.3
(2) /lib/modules/3.18.0/spidev.ko
将内核模块 spidev.ko 拷贝到 /lib/modules/3.18.0/ 目录。
(3) /lib/modules/3.18.0/modules.dep
touch /lib/modules/3.18.0/modules.dep
增加内容:
spidev.ko:
二、操作/dev/spidev
参考《ARM40-A5应用程序——SPI应用程序(AD7689)》中的程序,运行如下:
root@ARM40:/home/test# ./test_ad7689_4ch #跑应用程序测试
mode=0x0,speed=10000000,bits=0x16
in0 get = 0
in1 get = 92 #相应的io有电压输入
in2 get = 0
in3 get = 0
参考文章:
ARM40-A5应用程序——SPI应用程序(AD7689)
https://blog.csdn.net/vonchn/article/details/77989229
【Linux公开课】用户态SPI编程
http://www.wtoutiao.com/p/l5079K.html
Using SPI with Linux
https://armbedded.taskit.de/node/318
SPI总线测试和分析
安捷伦SPI总线测试解决方案
荟聚计划:共商 共建 共享 Grant