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

    文章

    11373

    浏览量

    211300
  • SPI总线
    +关注

    关注

    4

    文章

    104

    浏览量

    27736
  • 设备驱动
    +关注

    关注

    0

    文章

    68

    浏览量

    10984

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

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

收藏 人收藏

    相关推荐

    对于一款新的BSP如何添加SPI驱动

    介绍SPI总线由开发,是一种,由四个IO口组成:CS、SCLK、MISO、MOSI;通常用于CPU和外设之间进行通信,常见的SPI总线设备
    的头像 发表于 02-26 19:00 112次阅读
    对于一款新的BSP如何添加<b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>

    SPI通信总线概述和Verilog实现

    SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线
    的头像 发表于 02-07 14:28 802次阅读
    <b class='flag-5'>SPI</b>通信<b class='flag-5'>总线</b>概述和Verilog实现

    迅为RK3568开发板驱动指南Linux中通用SPI设备驱动

    迅为RK3568开发板驱动指南Linux中通用SPI设备驱动
    的头像 发表于 01-23 11:02 2023次阅读
    迅为RK3568开发板<b class='flag-5'>驱动</b>指南<b class='flag-5'>Linux</b>中通用<b class='flag-5'>SPI</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>

    飞凌嵌入式ElfBoard ELF 1板卡-初识设备树之设备树组成和结构

    的一项技能。设备树的起源设备树(Device Tree)是一种描述硬件资源的数据结构,它由uboot传递给Linux内核,被内核解析,内核根据设备
    发表于 01-07 09:16

    AFE4403 SPI总线挂载了两个设备,有一个SPI设备通讯不上是怎么回事?

    你好,我们现在SPI总线挂载了两个设备,一个是AFE4403,另一个是另一个SPI设备,我发现4403的
    发表于 11-13 07:01

    【S32K146 RT-thread】之 SPI驱动适配

    概述RT-Thread对SPI总线驱动,抽象出了spibus的设备驱动,我们基于S32K146的硬件学习spibus
    的头像 发表于 11-01 08:11 780次阅读
    【S32K146 RT-thread】之 <b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>适配

    深度解析linux时钟子系统

    linux内核中实现了一个CLK子系统,用于对上层提供各模块(例如需要时钟信号的外设,USB等)的时钟驱动接口,对下层提供具体SOC的时钟操作细节。
    的头像 发表于 09-29 16:46 769次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>解析</b><b class='flag-5'>linux</b>时钟子系统

    自动售货机MDB总线周边设备地址中文解析(三)

    自动售货机MDB协议中文解析(三)MDB总线周边设备地址
    发表于 09-09 10:43 0次下载

    SPI总线的定义和特点

    SPI总线(Serial Peripheral Interface),全称为串行外围设备接口,是由Motorola公司提出并定义的一种同步、串行、高速的通信总线
    的头像 发表于 09-03 14:05 1507次阅读

    linux系统的设备驱动一般分几类

    Linux系统的设备驱动是操作系统与硬件设备之间的桥梁,负责实现操作系统与硬件设备之间的通信和控制。Li
    的头像 发表于 08-30 15:13 648次阅读

    Linux设备驱动程序分类有哪些

    Linux设备驱动程序是操作系统与硬件设备之间的桥梁,负责实现硬件设备与操作系统之间的通信和控制。Lin
    的头像 发表于 08-30 15:11 817次阅读

    linux驱动程序如何加载进内核

    Linux系统中,驱动程序是内核与硬件设备之间的桥梁。它们允许内核与硬件设备进行通信,从而实现对硬件设备的控制和管理。
    的头像 发表于 08-30 15:02 699次阅读

    Linux 驱动开发与应用开发,你知道多少?

    一、Linux驱动开发与应用开发的区别开发层次不同:Linux驱动开发主要是针对硬件设备进行编程,处于操作系统内核层,直接与硬件交互,为上层
    的头像 发表于 08-30 12:16 1070次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>驱动</b>开发与应用开发,你知道多少?

    深度神经网络(DNN)架构解析与优化策略

    堆叠多个隐藏层,逐步提取和转化输入数据的特征,最终实现复杂的预测和分类任务。本文将对DNN的架构进行详细解析,并探讨其优化策略,以期为相关研究和应用提供参考。
    的头像 发表于 07-09 11:00 2657次阅读

    ESP32S3 Wroom SPI总线上挂载多个设备怎么驱动

    SPI总线上挂载多个设备怎么驱动 有没有demo可以提供?
    发表于 06-11 07:23