你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Linux设备开发SPI对应的脚都被用咋办?

[复制链接]
gaosmile 发布时间:2020-12-4 22:00
[导读] 干过单片机的盆友或许都拿IO口对着时序模拟过SPI主控制器,在做嵌入式Linux设备开发时,发现SPI对应的脚都被用了,或者被当成别的用途了,这时候咋办?你或许会说我翻IO口写个字符驱动不就完了么?当然你可以这么做,然而并没有必要。自己写也挺麻烦且未必稳。憋慌!且看本文分解~SPI什么鬼?

SPI(Serial Peripheral Interface) 是一种嵌入式系统中应用广泛的同步串行通信、主从架构式总线接口。80年代由摩托罗拉开发,已成为事实标准。

要理解啥是SPI,先上图,一图胜千言:

微信图片_20201204215536.png

常见的SPI接口有这样几个引脚:

  • SCLK: 串行时钟,总是主端负责输出(Master)。总是由主端控制该信号,从端为输入采样。
  • MOSI:主出从入(Master Output Slave Input)。总是由主端控制该信号,从端为输入采样。
  • MISO:主入从出(Master Input Slave Output)。总是由从端控制该信号,主端为输入采样。
  • :从选择信号(Slave Select)。总是由主端控制该信号,从端为输入采样。2 q4 C5 \: i7 \: W! x

常见的两种总线连接方式,

方式一:独立片选
2 y0 u* a) v' l" ^" k! }! W+ X

微信图片_20201204215539.png

. k. n% h. p# F+ w$ i

每个从设备都有独立的片选引脚,主机同一时间段内,与一个从设备进行通信,也即选中一个从设备,其他线并接共用; V$ p8 O6 M5 x, g7 o  A
方式二:菊花链: l& x4 f5 O3 ^) u' R

微信图片_20201204215543.png

SCK/CS共用,数据线入出环形链接,bit流在SCK时钟作用下击鼓传花,逐次移位传递。( D# O3 r& ?* q) m: O3 S

Linux下SPI框架

一图胜千言,看看我画的图吧:

微信图片_20201204215547.png
  • spi.c 实现了SPI core的公共抽象,SPI core负责抽象所有控制器具有的公共功能代码,并同时为spi protocol驱动程序提供接口,例如spi_message,spi_transfer,spi_async等。
  • SPI controller:SPI控制器层实现不同芯片SPI控制器的差异性实现,完成数据的bit级别的收发控制实现,并最终控制其对应的总线。
  • SPI devie:实现设备驱动,负责从控制器收发数据,并实现应用协议的解析等。
  • SPI外设控制:逻辑电路层,负责底层的IO电路级控制。
  • SPI从设备:挂载在具体的SPI总线上的芯片,比如传感器、FLASH存储设备等。
    2 E# `1 u4 q0 V0 U6 o# j7 \
GPIO SPI Master?

前面说自己拿GPIO对着SPI收发时序波形去实现SPI字符设备有点重新造砖的嫌疑,且造出的砖兼容性、稳定性往往都差强人意。辣么,Linux下不这么干,可以怎么干呢?

首先用下面命令打开内核配置界面,来瞅瞅:

make menuconfig
7 [) O  {+ v' J$ D

稍等那么一会儿,熟悉的界面就出来了:

微信图片_20201204215551.png

进入Device Drivers:

微信图片_20201204215555.png

进入到SPI support,按Y选择:

  • GPIO-based bitbanging SPI Master,这便是GPIO SPI主控制器的配置项
  • User mode SPI device driver support,这便是spidev设备驱动的配置项1 I; |+ Y/ @8 A' e5 X
微信图片_20201204215558.png

完事之后,一顿退出保存配置,记得保存配置,别配置了半天没存哈。
# T, G+ G. ^- l* A, I0 i: w

设备树配置

前面配置好了GPIO主控制器以及spidev设备驱动,然而如果直接编译,将内核部署到目标板上运行你发现啥也没有。那么还要做什么呢?你需要根据你的板子的情况配置哪些GPIO为SPI主控制对应的引脚!比如我用的ZYNQ,我这样配:

spi {
# b+ j! F  l9 Y compatible = "spi-gpio";8 ~# ?# Q3 e7 C: F
#address-cells = <0x1>;4 g# _$ c2 S9 [0 q5 \6 P7 J; @
ranges;! D2 ]- K% D: z1 Y, Y
9 i7 O1 V. r) N/ K
sck-gpios = <&gpio0 7 0>;+ Q5 R4 p9 \" M4 j6 O
miso-gpios = <&gpio0 11 0>;$ K: I+ A, t: _) z' P
mosi-gpios = <&gpio0 10 0>;
7 x/ p- ]2 W0 W9 Y& A5 q cs-gpios = <&gpio0 12 0>;
; F5 }! [* i# h$ c$ l8 n num-chipselects = <1>;$ m; a: P4 x/ ]. X
/* 从设备clients */
, c  Q, g) z* {. `+ \( y  k: t    device_0@0 {
( B  q5 t9 X! y" i" n0 f5 r  Y, P: c        compatible = "spidev";4 S9 a) p, }. \0 [# I! ~) J- m
        reg = <0>;3 \3 V7 f0 X: ^0 ]& F9 Y3 l& c3 q
        spi-max-frequency = <500000>;
; X1 n4 k" y, x. m+ _! d        #address-cells = <1>;  D% \' a6 X2 |
        #size-cells = <1>;: y" P% N  C" \, [+ [
        spi-rx-bus-width = <1>;2 q. G0 x% B% m2 A! b3 G
        spi-tx-bus-width = <1>;. n/ _+ D! M4 G: L& w& B
        bits-per-word = <8>;
- H5 c% Q/ E  Z3 [+ @    };) Q5 ~6 z. W) X  B* h1 c: N
}; 3 G3 h* C; M2 J' q: H) a* K: A

主控制器设备树:

  • compatible = "spi-gpio",这里兼容性表示使用GPIO的主控制器。编译时会自动编译spi-gpio.c
  • sck-gpios/miso-gpios/mosi-gpios/cs-gpios:为SPI对应的4个脚的配置,后面的则根据目标板进行设置。
  • num-chipselects:设置有几个片选
    - {4 b& P0 f) g' W- p, D3 _. m7 F# i# I

从设备设备树:

  • compatible = "spidev",这里设置spidev对应spidev.c的实现,当然你完全可以自己写个设备驱动,但是对于大部分应用而言没有必要,直接在用户空间实现应用协议不香么?
  • reg = <0>,括号里如果有多个从设备则依次增加
  • spi-max-frequency,设定spi频率,这里假定设置为500k
  • spi-rx-bus-width/spi-tx-bus-width,这里可选,如果是quad等设备则需要设置
  • bits-per-word:表示一个字节多少位
  • 另外spi-cpol/spi-cpha,则根据设备的SPI模式进行相应配置
  • spi-3wire:如果对应的设备是3线SPI设备,则可将该属性加上。7 S$ V8 f6 b- B
部署测试

设备树配置好后,编译加载到目标板上,此时在/dev下就会出现相应的设备 ,比如这样:

微信图片_20201204215602.png

我配了好几个spidev,所以出现这么几个设备。

至于怎么从用户空间测试这些驱动,就是基本的文件open/read/write操作了,这里就不赘述了。

总结一下

本文梳理了一下在SPI受限的情况下,Linux中GPIO用做SPI控制器的方法及实现,不用敲一行代码就妥了。把该驱的芯片就驱起来了。这里一个小的tips:

当面临要写驱动的时候,先查查是否已经有现成的实现,鼓捣鼓捣就能用岂不是妙!

Linux发展至今,为啥能如此广泛应用,从这里也可见一斑。你大部分想到的需求,都基本给你造好了。拿来就用,一用就对!他不香么?


: w# S+ j. |, u& d; C4 H( X2 W; {, U
收藏 评论0 发布时间:2020-12-4 22:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版