SPI总线和外设驱动(一)
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总线和外设驱动(一)相关推荐
- stm32h7高速通信_【STM32H7教程】第75章 STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)...
第75章 STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V) 本章节为大家讲解标准SPI接线方式驱动模数转换器DAC8501,制作了中断和DMA两种 ...
- 【STM32F429开发板用户手册】第33章 STM32F429的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第33章 STM32F429的SPI总线应用之驱动DA ...
- 【STM32F429开发板用户手册】第34章 STM32F429的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第34章 STM32F429的SPI总线应用之驱动DA ...
- 【STM32H7教程】第74章 STM32H7的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第74章 STM32H7的SPI总线应用之驱动DA ...
- Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能: 1 ...
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...
- Linux SPI总线和设备驱动架构之一:系统概述
SPI是"Serial Peripheral Interface" 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器.传感器.存储设备,SPI设备分为主设备和从设备两种,用 ...
- Linux SPI总线和设备驱动架构
http://blog.csdn.net/droidphone/article/details/24353293
最新文章
- 需求旺盛:市场提供大量机器学习与物联网相关岗位
- 解决mysql插入数据时出现Incorrect string value: '\xF0\x9F...' 的异常
- c语言p,用C语言实现P、V操作
- c语言程序设计 黄建灯,C语言程序设计教学改革
- Android: 解决动画完成后位置恢复到初始位置的问题
- 轧机用弹性阻尼体反力计算_「轴承知识」轧机轴承故障频繁怎么办?必要的检查维护不可少...
- Perl语言入门学习笔记1
- 洛谷P3853 路标设置
- 使用谷歌API将任意语言翻译成英文
- 苹果Mac远程控制软件:Screens
- 【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡
- 搭建node版本下载服务器(node版本高速镜像)
- 栈内存 堆内存 (数据类型间的存储区别)
- 趣图:大佬如何解决bug的
- 23中北大学计算机/软件考研必知
- Python 决策树的建树、剪枝与优化
- 皇后问题,8皇后、n皇后、2n皇后
- Filter Solutions 10.0+破解
- 算法与数学之美:最全数学各个分支简介
- 高通骁龙845的android手机有哪些,2018年骁龙845手机有哪些?骁龙845手机怎么样?...
热门文章
- 德勤、阿里为数据智能时代造势,是风口还是韭菜?
- PowerShell 设置 wsl2 linux 端口映射
- 请写出sfr和sbit的语句格式_根据给水阀门井图集07MS101-2第25页阀门井,进行清单组价,截图上传并上传计价软件版本附件...
- c语言#include windows.h,c语言之ls目录的简单实现和window版本dirent.h
- Poppin 技术点
- 【盛派周三分享-2019.2.20】开放分享内容,本期主题:《SCF、DDD及相关架构思想讨论》...
- 数据结构之杨辉三角实现
- 笔记:caption标签中的文字为什么会是竖着的。
- Tomcat tomcat-users xml 配置用户
- Flask 表单操作库 flask_WTF flask_WTForms