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

嵌入式ARM 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设备。

嵌入式ARM 技术专区

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

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

关注电子发烧友微信

有趣有料的资讯及技术干货

下载发烧友APP

打造属于您的人脉电子圈

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

浅谈Linux touch命令实例

touch命令可以用来修改文件的访问/修改时间戳,使用touch命令创建一个空白文件,需要的语法是“....

的头像 人间烟火123 发表于 02-13 14:08 次阅读 0条评论
浅谈Linux touch命令实例

linux发行版排行 2018大盘点

2018年最受欢迎的 Linux 发行版本将会是什么呢?近日2018 最佳 Linux 发行版排行榜....

的头像 人间烟火123 发表于 02-13 13:52 次阅读 0条评论
linux发行版排行 2018大盘点

进入Linux命令行的简单方法 ​为什么要这样做?

需要访问 GRUB 启动菜单时,需要选择 Linux 发行版条目,按下 e 编辑引导参数。如何进入进....

的头像 人间烟火123 发表于 02-13 13:14 次阅读 0条评论
进入Linux命令行的简单方法 ​为什么要这样做?

linux之父是谁_linux之父简介

林纳斯·托瓦兹,linux之父是一位著名的电脑程序员、黑客。Linux内核的发明人及该计划的合作者。....

的头像 lhl545545 发表于 02-10 10:10 次阅读 0条评论
linux之父是谁_linux之父简介

使用 Shell 脚本掩盖 Linux 服务器上的操作痕迹的步骤解析

使用 Shell 脚本在 Linux 服务器上能够控制、毁坏或者获取任何东西,通过一些巧妙的攻击方法....

的头像 马哥Linux运维 发表于 02-09 15:23 次阅读 0条评论
使用 Shell 脚本掩盖 Linux 服务器上的操作痕迹的步骤解析

VI 编辑器的命令、模式和选项介绍

VI 编辑器是一个基于命令行的、功能强大的文本编辑器,最早为 Unix 系统开发,后来也被移植到许多....

的头像 Linux爱好者 发表于 02-09 15:11 次阅读 0条评论
VI 编辑器的命令、模式和选项介绍

解析修改CentOS7网卡名字的步骤

CentOS7网卡名字不再是之前版本的eth0,eth1这样的名字了,而是enoxxx,比较长,不太....

的头像 阿铭linux 发表于 02-09 09:09 次阅读 0条评论
解析修改CentOS7网卡名字的步骤

简单介绍MySQL延迟主从复制

MySQL 5.6 已经支持延迟复制, 可设置备节点的延迟时间, 延迟复制是有意义的,例如防止主节点....

的头像 阿铭linux 发表于 02-09 09:05 次阅读 0条评论
简单介绍MySQL延迟主从复制

介绍两种方法来避免正在执行中的任务中断

有时我们也许会有这样的需求:要执行一个命令或者脚本,但是需要几个小时甚至几天。这就要考虑一个问题,就....

的头像 阿铭linux 发表于 02-09 08:56 次阅读 0条评论
介绍两种方法来避免正在执行中的任务中断

执行rsync的任务的2种方式解析

前面介绍的rsync 5种方式当中,第二、第三(1个冒号)就属于通过ssh的方式,这种方式其实就是让....

的头像 阿铭linux 发表于 02-09 08:48 次阅读 0条评论
执行rsync的任务的2种方式解析

分享解决No input file specified问题的方法

解决No input file specified问题的方法是, 修改php.ini中的cgi....

的头像 阿铭linux 发表于 02-09 08:41 次阅读 0条评论
分享解决No input file specified问题的方法

分享nginx 502的解决方法

还好,我印象中多年前遇到过一次类似的问题,不过是linux代理linux,症状和该问题基本类似,当时....

的头像 阿铭linux 发表于 02-09 08:37 次阅读 0条评论
分享nginx 502的解决方法

介绍一个不太常见的概念:嵌入文档

今天介绍一个不太常见的概念 -- 嵌入文档,英文名叫做Here Documents。也就是你在she....

的头像 阿铭linux 发表于 02-09 08:33 次阅读 0条评论
介绍一个不太常见的概念:嵌入文档

基于SLUB的DEBUG功能,如何帮忙检测内存越界和访问已经释放的内存

SLAB内存分配器-SLUB的DEBUG功能,如何帮忙检测内存越界(out-of-bounds)和访....

的头像 Linuxer 发表于 02-08 14:11 次阅读 0条评论
基于SLUB的DEBUG功能,如何帮忙检测内存越界和访问已经释放的内存

介绍 Nginx的基本概念,性能,SSL 安装

我们会告诉你 Nginx 如何工作及其背后的理念,还有如何优化以加快应用的性能,如何安装启动和保持运....

的头像 Linux爱好者 发表于 02-08 09:12 次阅读 0条评论
介绍 Nginx的基本概念,性能,SSL 安装

如何在windows和linux平台使用RT-Thread QEMU BSP,并运行RT-ThreadGUI示例

本文的目的 和背景嵌入式软件开发离不开开发板,在没有物理开发板的情况下,可以使用QEMU等类似的虚....

的头像 RTThread物联网操作系统 发表于 02-08 08:50 次阅读 0条评论
如何在windows和linux平台使用RT-Thread QEMU BSP,并运行RT-ThreadGUI示例

学习使用 8 种 Linux 原生命令或第三方实用程序来生成随机密码

在这篇文章中,我们将引导你通过几种不同的方式在 Linux 终端中生成随机密码。其中几种利用原生 L....

的头像 Linux爱好者 发表于 02-08 08:26 次阅读 0条评论
学习使用 8 种 Linux 原生命令或第三方实用程序来生成随机密码

学习ARM + Linux之前要讲解用ADS或RealViewMDK去调试ARM开发板的原因

掌握 ARM 体系结构。ARM 是一种计算机,掌握其体系结构也就是掌握ARM的工作原理。在大学里一般....

的头像 21ic电子网 发表于 02-07 13:36 次阅读 0条评论
学习ARM + Linux之前要讲解用ADS或RealViewMDK去调试ARM开发板的原因

基于嵌入式Linux内核的特殊矩阵键盘设计完整驱动控制模块方案

为了适应嵌入式设备外设的多样性,本文以特殊矩阵键盘为例,设计了一套完整的驱动 控制模块 。硬件电路设....

发表于 02-07 09:44 次阅读 0条评论
基于嵌入式Linux内核的特殊矩阵键盘设计完整驱动控制模块方案

通过操作命令来统计 Linux 中文件和文件夹/目录的数量

在本教程中,我们将向您展示如何使用多个命令,并使用 ls、egrep、wc 和 find 命令执行一....

的头像 Linux爱好者 发表于 02-07 08:24 次阅读 0条评论
 通过操作命令来统计 Linux 中文件和文件夹/目录的数量