Linux SPI总线和设备驱动架构之一:系统概述

2023-11-10

origin: http://blog.csdn.net/droidphone/article/details/23367051

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

  • CS    片选信号
  • SCK  时钟信号
  • MISO  主设备的数据输入、从设备的数据输出脚
  • MOSI  主设备的数据输出、从设备的数据输入脚
因为在大多数情况下,CPU或SOC一侧通常都是工作在主设备模式,所以,目前的Linux内核版本中,只实现了主模式的驱动框架。

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

硬件结构

通常,负责发出时钟信号的设备我们称之为主设备,另一方则作为从设备,下图是一个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设备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux SPI总线和设备驱动架构之一:系统概述 的相关文章

  • 【Java】ThreadLocal详细解析

    ThreadLocal全面解析 前置知识 具有一定的javase和javaweb基础 熟悉synchronized关键字 熟悉HashMap 熟悉 JDBC技术 学习目标 了解ThreadLocal的介绍 掌握ThreadLocal的运用场
  • collapse mode 严重_被GANs虐千百遍后,我总结出来的10条训练经验

    一年前 我决定开始探索生成式对抗网络 GANs 自从我对深度学习产生兴趣以来 我就一直对它们很着迷 主要是因为深度学习能做到很多不可置信的事情 当我想到人工智能的时候 GAN是我脑海中最先出现的一个词 GANs生成的人脸 StyleGAN
  • 计算机系统的组成及编程示例

    计算机系统是由硬件和软件两部分组成的 硬件是指计算机的物理组件 如中央处理器 CPU 内存 硬盘 输入输出设备等 而软件则是指运行在计算机上的程序和数据 在计算机系统中 编程是一项重要的活动 它通过编写代码来实现特定的功能 编程语言是用来编
  • Mask_RCNN 配置并训练自己的数据集

    文章目录 1 配置Mask RCNN 并运行demo 1 1环境 1 2下载github 1 3安装依赖库 1 4安装Mask RCNN 1 5下载coco已训练好模型 1 6安装 pycocotools 1 7使用 Jupyter 运行
  • https://oshwhub.com/explore?page=6

    开源广场 嘉立创EDA开源硬件平台 硬件工程师的电路家园 oshwhub com
  • eclipse导入项目会有红叉叉

    eclipse导入项目会有红叉叉 我这边以导入的是SpringMVC项目为例 下面有很多图片 eclipse导入项目后 jsp页面都是红叉叉 注意 有一些情况有红叉叉的情况 是因为字符集 要把eclipse默认字符集设为UTF 8 第一步
  • 网络安全攻防对抗之白加黑技术

    目录 一 什么是白加黑技术 二 怎么防范白加黑技术 一 什么是白加黑技术 白加黑 手法是一种利用DLL劫持技术的攻击方式 它通过在应用程序的导出目录中创建一个DLL文件 并通过LoadLibrary函数 或者找一个已有的DLL注入恶意代码
  • 多元时间序列

    多元时间序列 BiLSTM双向长短期记忆神经网络多变量时间序列预测 Matlab完整程序 目录 多元时间序列 BiLSTM双向长短期记忆神经网络多变量时间序列预测 Matlab完整程序 预测结果 评价指标 基本介绍 程序设计 参考资料 预测

随机推荐

  • [YAPI]导出API文档

    1 进入某个分组主页 切换到 项目列表 菜单下 点击进入其中一个项目 2 切换到 数据管理 菜单下 执行导出功能
  • 肾模?你还不会sqlalchemy!【SQLite】

    Part1什么是 sqlalchemy sqlalchemy 是 Python 的一个优秀的开源 ORM 框架 为开发者提供了方便快捷的 API 能够提高开发效率 让开发者专心于业务代码开发 而非浪费时间在数据库的维护上 今天我们就来一起了
  • 基于java的医院住院管理系统

    为了更好的满足医护人员用户的需求 本医院住院管理系统包括如下功能模块 出入院管理 病人管理 病房管理 系统用户管理模块 每个模块都有其独自的功能 以达到更好的服务于用户 系统采用BS结构 用当前最流行的java技术开发 系统架构采用MVC模
  • vue2+elementui表单手机号码、邮箱、经纬度、百分比验证

    1 手机号码验证 验证方式写在一个公共js文件中 在对应组件中引入即可 方法一 需传参 n为是否必填参数 export const isPhone n gt return required n message 不能为空 trigger bl
  • 封装、继承、多态

    目录 访问限定符 封装 继承 super关键字 super和this的比较 继承在内存中的情况 重写override 重写和重载的比较 多态 JAVA中的动态绑定机制 JAVA面向对象程序三大特性 封装 继承 多态 在类和对象阶段 主要研究
  • iTerm2配置(rz/sz命令)

    1 安装iTerm2 到iTerm2官网下载安装 2 安装HomeBrew 参考博客 https brew idayer com guide start 作者写的非常细 但我照着执行下来有2个注意事项 1 别急忙执行安装命令 先得去镜像助手
  • UNC博士计算机申请,科学网-申请美国博士研究生的自我陈述(Personal Statement)该怎么写?-周耀旗的博文...

    申请美国大学的博士研究生除了考试成绩 简历之外 常常还要写一篇长短要求不一的 自我陈述 Personal Statement 或者 目的陈述 Statement of purpose 我在美国大学做老师的时候 曾经多次参与招生委员会的工作
  • 方差,协方差、标准差,与其意义

    有国才有家 支持国产 生活中点滴做起 买手机就买华为 这是我们国家IT界的脊梁 协方差的意义和计算公式 协方差的意义和计算公式 学过概率统计的孩子都知道 统计里最基本的概念就是样本的均值 方差 或者再加个标准差 首先我们给你一个含有n个样本
  • 关于手机Camera的硬件电路知识

    前阶段 小白教同事测了些Camere的基本功耗 正愁不知道写什么的小白 突然想到了素材 于是乎便趁着周末雷雨天宅家之际 写一篇关于手机Camere的硬件文章 手机Camera 一 工作原理 关于Camera 景物通过镜头生成光学图像投射到图
  • MNIST手写体识别训练过程数据流图

    1 数据流图 2 对应的 Python 代码 import torch import torchvision import torchvision transforms as transforms import torch nn as nn
  • 嵌入式数据库知识概括

    嵌入式数据库知识概况 嵌入式数据库 Derby SQLite H2 总结 嵌入式数据库 嵌入式数据库 Embedded Database 简介 从软件角度来说 数据库分类为两种 第一种 数据库服务器 Database Server 第二种
  • Unity控制在面板上显示变量

    unity之定制Inspector Ngui 刚接触Unity时知道脚本的共有变量会在Inspector中显示出来 但是有一些确不行 前些日子添加按钮的音效 我用的是Ngui按钮也基本是UIButton 但是给button一个个挂UIPla
  • Maven配置环境变量

    在上文java在Windows配置Path环境变量 中我们找到了环境变量所在位置我们直接打开环境变量 第一步 在环境变量页面点击新建 第二步 配置MAVEN HOME 在变量名中输入 MAVEN HOME 在变量值中输入jdk安装位置 D
  • C语言qsort函数详解

    目录 一 qsort函数的使用 二 qsort函数的模拟 一 qsort函数的使用 快排函数qsort是C的库函数 它可以对输入的任何类型的数组排序 通过该函数的函数声明我们可以看出它的使用方法 举个栗子 include
  • 还不会部署高可用的kubernetes集群?企业DevOps实践之使用kubeadm方式安装高可用k8s集群v1.23.7...

    关注 WeiyiGeek 公众号 设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 原文地址 还不会部署高可用的kubernetes集群 企业DevOps实践之使用kubeadm方式安装高可用k8s集群v1 23 7 本
  • Qt学习笔记1:创建一个QT的空项目

    初始QT 在创建QT项目时系统提供了几个不同的模板 点选模板 系统会自动为用户创建好一个基础框架方便开发 这里 我们试着不适用系统提供的基础框架 自己创建一个空的QT项目 创建工程 1 进入QT界面 选择新建工程 在跳出的选项中选择其他项目
  • Linux·i2c驱动示例

    I2C 是很常用的一个串行通信接口 常用于连接各种外设 传感器等器件 一 Linux I2C 驱动框架 Linux 内核将 I2C 驱动分为两部分 I2C 总线驱动 I2C 总线驱动就是 SOC 的 I2C 控制器驱动 也叫做 I2C 适配
  • 原型和原型链

    1 原型 原型 prototype 一个对象 概念 每一个函数上 都有一个prototype 原型对象 使用场景 一般使用在构造函数上 如果给构造函数的原型prototype添加方法 构造函数构造出来的对象就能共享原型上所有的方法 var
  • 写一篇关于OpenAi基金的介绍

    OpenAI基金是由业界领先的技术领导者组成的非营利性机构 旨在推进人工智能的发展 以此来改善人类的生活 OpenAI的目标是建立开放 可靠的智能机器 能够推动人类的发展 改善生活质量和解决全球性问题 OpenAI通过支持研究和发展人工智能
  • Linux SPI总线和设备驱动架构之一:系统概述

    origin http blog csdn net droidphone article details 23367051 SPI是 Serial Peripheral Interface 的缩写 是一种四线制的同步串行通信接口 用来连接微