0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深度解析Linux SPI总线和设备驱动架构

Q4MP_gh_c472c21 来源:互联网 作者:佚名 2018-02-07 08:16 次阅读

SPI是"Serial Peripheral Interface" 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器传感器、存储设备,SPI设备分为主设备和从设备两种,用于通信和控制的四根线分别是:

·CS 片选信号

·SCK 时钟信号

·MISO 主设备的数据输入、从设备的数据输出脚

·MOSI 主设备的数据输出、从设备的数据输入脚

硬件结构

通常,负责发出时钟信号的设备我们称之为主设备,另一方则作为从设备,下图是一个SPI系统的硬件连接示例:

深度解析Linux SPI总线和设备驱动架构

图1.1 SPI硬件结构图

如上图所示,主设备对应SOC芯片中的SPI控制器,通常,一个SOC中可能存在多个SPI控制器,像上面的例子所示,SOC芯片中有3个SPI控制器。每个控制器下可以连接多个SPI从设备,每个从设备有各自独立的CS引脚。每个从设备共享另外3个信号引脚:SCK、MISO、MOSI。任何时刻,只有一个CS引脚处于有效状态,与该有效CS引脚连接的设备此时可以与主设备(SPI控制器)通信,其它的从设备处于等待状态,并且它们的3个引脚必须处于高阻状态。

工作时序

按照时钟信号和数据信号之间的相位关系,SPI有4种工作时序模式:

我们用CPOL表示时钟信号的初始电平的状态,CPOL为0表示时钟信号初始状态为低电平,为1表示时钟信号的初始电平是高电平。另外,我们用CPHA来表示在那个时钟沿采样数据,CPHA为0表示在首个时钟变化沿采样数据,而CPHA为1则表示要在第二个时钟变化沿来采样数据。内核用CPOL和CPHA的组合来表示当前SPI需要的工作模式:

·CPOL=0,CPHA=1 模式0

·CPOL=0,CPHA=1 模式1

·CPOL=1,CPHA=0 模式2

·CPOL=1,CPHA=1 模式3

软件架构

在内核的SPI驱动的软件架构中,进行了合理的分层和抽象,如下图所示:

图2.1 SPI驱动的软件架构

SPI控制器驱动程序

SPI控制器不用关心设备的具体功能,它只负责把上层协议驱动准备好的数据按SPI总线的时序要求发送给SPI设备,同时把从设备收到的数据返回给上层的协议驱动,因此,内核把SPI控制器的驱动程序独立出来。SPI控制器驱动负责控制具体的控制器硬件,诸如DMA和中断操作等等,因为多个上层的协议驱动可能会通过控制器请求数据传输操作,所以,SPI控制器驱动同时也要负责对这些请求进行队列管理,保证先进先出的原则。

SPI通用接口封装层

为了简化SPI驱动程序的编程工作,同时也为了降低协议驱动程序和控制器驱动程序的耦合程度,内核把控制器驱动和协议驱动的一些通用操作封装成标准的接口,加上一些通用的逻辑处理操作,组成了SPI通用接口封装层。这样的好处是,对于控制器驱动程序,只要实现标准的接口回调API,并把它注册到通用接口层即可,无需直接和协议层驱动程序进行交互。而对于协议层驱动来说,只需通过通用接口层提供的API即可完成设备和驱动的注册,并通过通用接口层的API完成数据的传输,无需关注SPI控制器驱动的实现细节。

SPI协议驱动程序

上面我们提到,控制器驱动程序并不清楚和关注设备的具体功能,SPI设备的具体功能是由SPI协议驱动程序完成的,SPI协议驱动程序了解设备的功能和通信数据的协议格式。向下,协议驱动通过通用接口层和控制器交换数据,向上,协议驱动通常会根据设备具体的功能和内核的其它子系统进行交互,例如,和MTD层交互以便把SPI接口的存储设备实现为某个文件系统,和TTY子系统交互把SPI设备实现为一个TTY设备,和网络子系统交互以便把一个SPI设备实现为一个网络设备,等等。当然,如果是一个专有的SPI设备,我们也可以按设备的协议要求,实现自己的专有协议驱动。

SPI通用设备驱动程序

有时候,考虑到连接在SPI控制器上的设备的可变性,在内核没有配备相应的协议驱动程序,对于这种情况,内核为我们准备了通用的SPI设备驱动程序,该通用设备驱动程序向用户空间提供了控制SPI控制的控制接口,具体的协议控制和数据传输工作交由用户空间根据具体的设备来完成,在这种方式中,只能采用同步的方式和SPI设备进行通信,所以通常用于一些数据量较少的简单SPI设备。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10981

    浏览量

    206689
  • SPI总线
    +关注

    关注

    4

    文章

    100

    浏览量

    27442
  • 设备驱动
    +关注

    关注

    0

    文章

    64

    浏览量

    10802

原文标题:Linux SPI总线和设备驱动架构你都懂了吗?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文总结linux的platform驱动

    linux设备驱动中,有许多没有特定总线的外设驱动,在实际开发中,又需要使用到总线
    的头像 发表于 10-16 16:45 392次阅读
    一文总结<b class='flag-5'>linux</b>的platform<b class='flag-5'>驱动</b>

    C语言深度解析

    C语言深度解析,本资料来源于网络,对C语言的学习有很大的帮助,有着较为深刻的解析,可能会对读者有一定的帮助。
    发表于 09-28 07:00

    SPI总线学习笔记

    也很明显。例如,SPI需要四根线,而IIC只需要两根线;SPI为一主多从的总线架构,从而不会发生抢占总线的情况,所以在I/O电路上,可使用P
    发表于 09-20 15:17 493次阅读
    <b class='flag-5'>SPI</b><b class='flag-5'>总线</b>学习笔记

    Linux驱动移植 Linux系统架构优点

    系统移植 linux 驱动移植 移植是说同样的一个 linux 操作系统,我们可以跑到不同的硬件上面,我们把操作系统移植到不同的硬件上面,这个过程叫做移植。设备
    的头像 发表于 07-27 17:06 548次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>驱动</b>移植 <b class='flag-5'>Linux</b>系统<b class='flag-5'>架构</b>优点

    SPI子系统:SPI设备驱动

    SPI 设备驱动设备】声明在设备树中 注意:设备的声明,slave device node
    的头像 发表于 07-25 11:05 578次阅读
    <b class='flag-5'>SPI</b>子系统:<b class='flag-5'>SPI</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>

    SPI子系统driver软件流程

    软件流程 看懂该图,对SPI 驱动框架就有完整的了解了。 1、2、3 按顺执行,首先有 spi 总线的注册,然后是 spi 控制器
    的头像 发表于 07-25 11:01 469次阅读
    <b class='flag-5'>SPI</b>子系统driver软件流程

    SPI控制器驱动层功能介绍

    和相应的设备进行正确的数据交换 向通用接口层提供接口,使得上层的协议驱动可以通过通用接口层访问控制器驱动 配合通用接口层,完成数据消息队列的排队和处理,直到消息队列变空为止 SPI
    的头像 发表于 07-25 10:58 801次阅读
    <b class='flag-5'>SPI</b>控制器<b class='flag-5'>驱动</b>层功能介绍

    SPI通用接口层介绍

    SPI 通用接口层 SPI 通用接口层把具体的 SPI 设备的协议驱动SPI 控制器
    的头像 发表于 07-25 10:52 467次阅读

    SPI驱动源文件目录在哪

    /drivers/ spi/spidev.c linux 提供的 SPI 通用设备驱动程序kernel- 4.14 /include/
    的头像 发表于 07-25 10:49 469次阅读
    <b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>源文件目录在哪

    Linux Regmap 驱动框架

    层,regmap 向驱动编写人员提供的 API 接口,驱动编写人员使用这些API 接口来操作具体的芯片设备,也是驱动编写人员重点要掌握的。 2、regmap 结构体
    的头像 发表于 07-06 17:29 725次阅读
    <b class='flag-5'>Linux</b> Regmap <b class='flag-5'>驱动</b>框架

    基于Linux使用spidev驱动OLED

    如果不想编写spi设备驱动,那么linux内核提供了一个通用的spidev设备驱动,提供统一的字
    发表于 06-16 10:36 2654次阅读
    基于<b class='flag-5'>Linux</b>使用spidev<b class='flag-5'>驱动</b>OLED

    Linux SPI设备驱动:四线SPI OLED驱动实战

    SPI设备芯片的种类非常广泛,包括用于模拟传感器和编解码器的数字/模拟转换器、内存芯片、USB 控制器或以太网适配器等外设,以及其他类型的芯片。
    发表于 06-16 10:33 541次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>SPI</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>:四线<b class='flag-5'>SPI</b> OLED<b class='flag-5'>驱动</b>实战

    求问用过SPI总线的大神,有没有做过SPI总线模拟SGPIO总线

    无意间看到SGPIO总线SPI总线有很多相似的地方,SGPIO是四根线,三根主设备线是必须线,从设备数据发送线可以不要,然后
    发表于 06-16 06:53

    SPI总线协议的基础知识

    SPI,是英语 Serial Peripheral Interface 的缩写顾名思义就是串行外围设备接口。SPI是一种高速的,全双工,同步的通信总线, 并且在芯片的管脚上只占用四根线
    发表于 06-07 15:40 4140次阅读
    <b class='flag-5'>SPI</b><b class='flag-5'>总线</b>协议的基础知识

    串行通信SPI总线的详解分析

      SPI(Serial Peripheral Interface)总线系统是一种同步串行外设接口,可以是MCU与各种外围设备以串行方式进行通信以交换信息,该接口一般使用4条线:串行时钟线(SCLK
    的头像 发表于 05-05 16:40 3054次阅读
    串行通信<b class='flag-5'>SPI</b><b class='flag-5'>总线</b>的详解分析