【驱动】SPI驱动分析(一)-SPI协议简介
1. 什么是SPI
SPI全拼Serial Peripheral interface(串行外围设备接口),是由Motorola(摩托罗拉)在MC68HCXX系列处理器上定义的,主要应用于EEPROM(带电可擦可编程只读存储器),FLASH,RTC(实时时钟),AD转换器,还有数字信号处理器和数字信号解码器。
SPI,是一种高速的,全双工,同步的通信总线,且只需要四根引脚线,与I2C一样都大大简化了PCB板子的布局空间,SPI依然是一种世界级的流行标准,大多数板子都内置了SPI的接口。
Motorola设计它的初衷也是为了节约排版空间。
2. SPI优与缺点
优点
- 支持全双工通信
- 通信简单
- 数据传输速率块
缺点
- 没有指定的读写方向控制
- 没有应答机制确认是否接收到数据
- 跟I2C总线协议比较在数据,可靠性上有一定的缺陷
3. SPI组成原理
SPI模块框架图

SPI结构
上图结构中的SCK、SS、MISO、MOSI是比较重要的几根线,其作用如下:
| 名称 | 作用 |
|---|---|
| SCK | 串行时钟信号,主设备产生 |
| SS | 片选线,主要用于发送片选CS信号,即选择从设备 |
| MISO | 主设备输入,从设备输出 |
| MOSI | 主设备输出,从设备输入 |
对于SS片选信号这里在多解释一下,在SPI中可能存在许多设备,但是只能有一个主设备,主设备通过SS线来控制选择哪个设备,默认情况下SS线是低电平状态,主设备通过选择连接在对应SS线下的设备,然后使其发送高电平,当连接在对应SS线上的设备收到高电平时就会做出响应,开始接收MISO或MOSI的数据,SS线会有多个,可以外接许多设备,SCK与MISO、MOSI只有一个,其它设备都接在上面。

其内部是有DR寄存器与位移寄存器,用来存数据与写数据
4. SPI通讯模式
SPI有四种通讯模式,分别是:
- Mode0
- Mode1
- Mode2
- Mode3
SPI官方没有给定名字,只给了模式0-3,其作用如下:
| 模式 | 作用 |
|---|---|
| Mode0 | SCLK输出数字信号0时处于空闲状态,SCLK输出数字信号为1时则代表有效状态 |
| Mode1 | SCLK输出数字信号0时处于空闲状态,SCLK输出数字信号为1时则代表有效状态,数据采样是在第2个边沿,数据发送在第1个边沿 |
| Mode2 | SCLK输出数字信号0时处于有效状态,SCLK输出数字信号1时处于空闲状态 |
| Mode3 | SCLK输出数字信号0时处于有效状态,SCLK输出数字信号1时处于空闲状态,数据采样是在第1个边沿,数据发送在第2个边沿 |
这些模式我们需要通过设置SCLK的”CPOL(时钟极性)和CPHA(时钟相位)”模式来完成,你可以把CPOL与CPHA理解为一个标志位,它们标志位不同会使SCLK的输出电平状态不同,也会改变数据输出的边沿
SPI工作模式与CPOL和CPHA的对应关系以及它俩的作用:
| 模式 | CPOL | CPHA |
|---|---|---|
| Mode0 | 0 | 0 |
| Mode1 | 0 | 1 |
| Mode2 | 1 | 0 |
| Mode3 | 1 | 1 |
边沿
这里说一下在SPI中什么是边沿,这里的第1个边沿与第2个边沿表示的是电平变化
边沿表示的是上升沿或下降沿
上升沿:即在一定周期时由低电平变化到高电平,然后此时在进行数据采样,即电平信号到数字信号转换
下降沿:即在一定周期时由高电平变化到低电平,然后此时在进行数据采样,即电平信号到数字信号转换
CPOL
用来决定SCL空闲时应该是怎样的电平状态,若为0,SCLK空闲时输出低电平,若为1空闲时输出高电平
CPHA
它用来表示该MOSI有效还是MISO有效,若它的值为0则代表第0个边沿数据采样,即MOSI上可以进行数据采样,若它为1时则MISO数据可以进行采样
同时它与CPOL是关联的:
若CPHA为0,CPOL为0时:
若CPOL为0,则第一个边沿有效,即SCLK空闲时是低电平,那么边沿就等于上升沿,同时MOSI输出信号,MISO可以采样了
若CPHA为0,CPOL为1时:
若CPOL为1,则第一个边沿有效,即SCLK空闲时是高电平,那么边沿就等于下降沿,同时MISO输出信号,MOSI可以采样了
MOSI与MISO线对主设备和从设备方向不同,MOSI线在主设备上是输出,从设备上是输入,所以它们是相反的,所以当MOSI输出信号时,对于从设备来说,它就可以读数据了所以主设备与从设备两根线MISO与MOSI两根线作用是不一样的,所以上面的状态对于不同的设备是相反的,也就是刚好实现了主设备写时,从设备读,主设备读时,从设备写,采样意思是设备可以去某个线上去读数据了
SPI是没有控制信号的,只能通过SCLK时钟的状态来告诉从设备现在的流方向,从设备需要实时检测当前的SCLK状态
工作时需要保证从设备与主设备一致的工作模式,其次许多从设备在出厂时就已经设定好了工作模式,是无法修改的,有些从设备是可以修改的。
5. 通讯过程
- 首先拉高对应设备的SS线,选择对应的从设备
- 通过SLCk产生时钟边沿变化,来告诉从设备读写
- 主设备里的控制逻辑通过位移寄存器从高到低的方式移动给MOSI总线上
- 从设备接收到之后也通过位移寄存器的方式按照顺序移到DR寄存器中
- 这里给大家看一下SCLK产生时钟周期时做了什么
- 如下图,当SCLK周期开始变成低电平时则代表数据有输出了,当变成高电平时则代表数据可以采样(读)了,即输出→输出完成,这是整个周期做的事情,下位机只需要等待周期变化完成之后根据当前模式去到指定的线上读或写数据就可以了

- SPI是双向的,主机发的时候一样可以收从机的数据,在一个周期里完成数据交换,但是只有一个DR寄存器,所以SPI的方法是位移,主机高到低,从机低到高的交换,当主机高位移出去,低位就空一个出来,而从机低位移出一位,高位就空出一位
*
*
在通讯之前需要保证双方时钟频率是一致的,一般情况下从设备是无法修改时钟频率的,只有主设备能够修改时钟频率,将主设备的时钟频率修改与从设备一致,默认情况下是不需要修改这些的,这个可以根据芯片手册中SPI上的使能时钟接的是谁,如果提供了GPIO口进行修改那么就支持可编程时钟,若没有则代表当前的MCU不支持编程SPI的时钟频率
原文链接:https://blog.csdn.net/bjbz_cxy/article/details/119925257
【驱动】SPI驱动分析(一)-SPI协议简介的更多相关文章
- spi驱动框架全面分析,从master驱动到设备驱动
内核版本:linux2.6.32.2 硬件资源:s3c2440 参考: 韦东山SPI视频教程 内容概括: 1.I2C 驱动框架回顾 2.SPI 框架简单介绍 3.maste ...
- linux驱动基础系列--Linux下Spi接口Wifi驱动分析
前言 本文纯粹的纸上谈兵,我并未在实际开发过程中遇到需要编写或调试这类驱动的时候,本文仅仅是根据源码分析后的记录!基于内核版本:2.6.35.6 .主要是想对spi接口的wifi驱动框架有一个整体的把 ...
- linux驱动基础系列--linux spi驱动框架分析
前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...
- linux驱动基础系列--linux spi驱动框架分析(续)
前言 这篇文章是对linux驱动基础系列--linux spi驱动框架分析的补充,主要是添加了最新的linux内核里设备树相关内容. spi设备树相关信息 如之前的文章里所述,控制器的device和s ...
- Linux驱动修炼之道-SPI驱动框架源码分析(上)【转】
转自:http://blog.csdn.net/lanmanck/article/details/6895318 SPI驱动架构,以前用过,不过没这个详细,跟各位一起分享: 来自:http://blo ...
- Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)
一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...
- SPI 驱动分析
断更博客两个月后我又回来了,眯着躺倒就能睡熟的小眼睛,在这儿敲键盘.这篇文章给你快乐,你有没有爱上我! SPI驱动由三部分组成,分别为drivers.core.device.通过bus总线连接.困了不 ...
- linux SPI驱动——spi协议(一)
一:SPI简介以及应用 SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在 ...
- 基于TQ2440的SPI驱动学习(OLED)
平台简介 开发板:TQ2440 (NandFlash:256M 内存:64M) u-boot版本:u-boot-2015.04 内核版本:Linux-3.14 作者:彭东林 邮箱:pengdongl ...
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...
随机推荐
- Go笔记(4)-流程控制
5.Go语言流程控制 程序流程的控制结构一般有三种,顺序结构,选择结构,循环结构 (1)选择结构 if语句 if流程控制与其他语言的if流程控制基本相同 package main import &qu ...
- [cnn]FashionMINST训练+保存模型+调用模型判断给定图片
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim impor ...
- SpringBoot测试用例的一些小技巧~
场景一:不想因为测试而对数据库产生脏数据 @Test public void testInsert() { User user = new User(); user.setUsername(" ...
- Java8函数式编程应用
我们经常提到,Java8是革命性的一个版本,原因就是正式引入了函数式编程,那Java的函数式编程在实际应用中到底有什么用呢?结合实际的应用,我整理出了函数式在Java的几个经典用途. 缓求值 惰性求值 ...
- Spring源码学习之Web数据绑定器WebDataBinder
WebDataBinder 1.描述 特殊的数据绑定器用于从web请求参数到JavaBean对象的数据绑定.专为web环境,但不依赖于Servlet API;作为更具体的DataBinder变体的基类 ...
- HTML之元素相对页面(视口)左上角的绝对坐标
目录 一. 绝对位置 二. 相对位置 一. 绝对位置 网页元素的绝对位置,指该元素的左上角相对于整张网页左上角的坐标.无论网页滚动条如何滚动,它都是不会变化的. // 获取元素的绝对位置坐标(相对于页 ...
- OpenEuler22.03安装PostgreSQL15.5并配置一主二从
环境准备 序号 IP 标识(hostname) CPU/内存配置 系统盘 数据盘 1 192.168.8.190 pg01 8C+16G 80G 500G 2 192.168.8.191 pg02 8 ...
- DES加密算法优缺点大揭秘:为何它逐渐被取代?
一.引言 DES(Data Encryption Standard)加密算法作为一种历史悠久的对称加密算法,自1972年由美国国家标准局(NBS)发布以来,广泛应用于各种数据安全场景.本文将从算法原理 ...
- 【玩转腾讯混元大模型】怎么说?我用混元AI大模型开发了个IDEA插件
前言 halo 我是杨不易呀,在混元大模型内测阶段就已经体验了一番当时打开页面的时候灵感模块让我大吃一惊这么多角色模型真的太屌了,随后我立马进行了代码处理水平和上下文的效果结果一般般但是到如今混元大模 ...
- Python——第五章:Traceback模块
traceback 模块提供了在程序中处理和分析异常时的工具,帮助开发人员更好地理解程序出现问题的原因. 使用 traceback.format_exc() 函数可以获取当前异常的堆栈信息.可以把错误 ...