SPI(Serial Peripheral Interface)串行外设接口,是一种高速、全双工的通信总线,只占用芯片的四个引脚,分别为数据输入(SDI)、数据输出(SDO)、时钟信号(SCLK)、片选信号(CS),目前越来越多的芯片集成了这种方式。通常情况下,一个SPI主控器能外接多个从设备,然后通过CS片选信号选择从设备,通过SDI、SDO进行数据的传输。

1、硬件连接

SPI主控制器与从设备的连接示意图如下:

SPI主控器与从设备连接示意图

2、SPI驱动架构分析

SPI驱动框架可以分为SPI核心层SPI控制器驱动层SPI设备驱动层

2.1、SPI核心层

SPI核心层主要负责注册SPI总线和提供通用API接口,与平台无关。核心层代码在源码目录的<drivers/spi/spi.c>,主要定义了总线类型和主控制器设备类,总线类型的代码如下:

上述程序定义了SPI总线类型,通过bus_register()函数,将SPI总线注册进总线,成功注册后在sys/bus下即可找到spi节点。

控制器设备类代码如下:

上述程序主要定义了SPI总线主控制器的设备类,通过调用class_register()函数注册设备类,成功注册后,在/sys/class目录下即可找到spi_master文件节点。

2.2、SPI控制器驱动层

spi_master结构体对应着主控制器驱动,在<include/linux/spi/spi.h>文件中定义,如下:

注:bus_num通常从0开始计数,比如控制器有3路SPI,则bus_num设置为2

在<drivers/spi/spi.c>中定义了三个函数用于分配、注册和注销spi_master

为spi_master分配空间

注册spi_master

注销spi_master

3、SPI设备驱动层

在<include/linux/spi/spi.h>中定义了描述spi设备信息的结构体spi_device,如下:

向总线注册设备时还需要spi_board_info结构体,它的字段定义时大部分与spi_device相同,定义在<include/linux/spi/spi.h>中,如下:

定义好spi_board_info后,就可以向SPI总线注册设备了。注册设备的API在<drivers/spi/spi.c>中被定义,如果SPI控制器已经被加载,调用:

如果在板子的初始化代码中,调用以下API注册函数:

spi_driver结构体在<include/linux/spi/spi.h>中定义,代码如下:

定义好spi_driver后,在<drivers/spi/spi.c>通过spi_register_driver()可以完成驱动注册,spi_register_driver如下:

178~184行是给spi_driver结构体赋值,185行注册驱动,187行将spi_register_driver导入内核符号表,以供其他模块使用。

SPI数据传输最核心的结构体是spi_transfer,在<include/linux/spi/spi.h>中定义,如下:

SPI传输数据的另一个核心数据结构是spi_message,代码定义在<include/linux/spi/spi.h>,每次SPI传输数据中,都可能包含几个数据包,这时就应该通过spi_message结构体拼接起来。如下:

在<include/linux/spi/spi.h>中定义了一些spi相关接口函数,对于SPI设备驱动编程而言,通常只关心spi_write()和spi_read()两个函数即可。

spi_write()完成同步数据发送

spi_read()完成同步数据接收

SPI总线和外设驱动(一)相关推荐

  1. stm32h7高速通信_【STM32H7教程】第75章 STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)...

    第75章       STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V) 本章节为大家讲解标准SPI接线方式驱动模数转换器DAC8501,制作了中断和DMA两种 ...

  2. 【STM32F429开发板用户手册】第33章 STM32F429的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第33章       STM32F429的SPI总线应用之驱动DA ...

  3. 【STM32F429开发板用户手册】第34章 STM32F429的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第34章       STM32F429的SPI总线应用之驱动DA ...

  4. 【STM32H7教程】第74章 STM32H7的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第74章       STM32H7的SPI总线应用之驱动DA ...

  5. Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化

    我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...

  6. Linux SPI总线和设备驱动架构之三:SPI控制器驱动

    通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能: 1 ...

  7. Linux SPI总线和设备驱动架构之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...

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

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

  9. Linux SPI总线和设备驱动架构

    http://blog.csdn.net/droidphone/article/details/24353293

最新文章

  1. 需求旺盛:市场提供大量机器学习与物联网相关岗位
  2. 解决mysql插入数据时出现Incorrect string value: '\xF0\x9F...' 的异常
  3. c语言p,用C语言实现P、V操作
  4. c语言程序设计 黄建灯,C语言程序设计教学改革
  5. Android: 解决动画完成后位置恢复到初始位置的问题
  6. 轧机用弹性阻尼体反力计算_「轴承知识」轧机轴承故障频繁怎么办?必要的检查维护不可少...
  7. Perl语言入门学习笔记1
  8. 洛谷P3853 路标设置
  9. 使用谷歌API将任意语言翻译成英文
  10. 苹果Mac远程控制软件:Screens
  11. 【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡
  12. 搭建node版本下载服务器(node版本高速镜像)
  13. 栈内存 堆内存 (数据类型间的存储区别)
  14. 趣图:大佬如何解决bug的
  15. 23中北大学计算机/软件考研必知
  16. Python 决策树的建树、剪枝与优化
  17. 皇后问题,8皇后、n皇后、2n皇后
  18. Filter Solutions 10.0+破解
  19. 算法与数学之美:最全数学各个分支简介
  20. 高通骁龙845的android手机有哪些,2018年骁龙845手机有哪些?骁龙845手机怎么样?...

热门文章

  1. 德勤、阿里为数据智能时代造势,是风口还是韭菜?
  2. PowerShell 设置 wsl2 linux 端口映射
  3. 请写出sfr和sbit的语句格式_根据给水阀门井图集07MS101-2第25页阀门井,进行清单组价,截图上传并上传计价软件版本附件...
  4. c语言#include windows.h,c语言之ls目录的简单实现和window版本dirent.h
  5. Poppin 技术点
  6. 【盛派周三分享-2019.2.20】开放分享内容,本期主题:《SCF、DDD及相关架构思想讨论》...
  7. 数据结构之杨辉三角实现
  8. 笔记:caption标签中的文字为什么会是竖着的。
  9. Tomcat tomcat-users xml 配置用户
  10. Flask 表单操作库 flask_WTF flask_WTForms