【驱动】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定义了 ... 
随机推荐
- WPF 纯XAML实现NumericUpDown 控件
			本文由 飞羽流星(Flithor/毛茸茸松鼠先生/Squirrel.Downy)原创,欢迎分享转载,但禁止以原创二次发布原文地址:https://www.cnblogs.com/Flithor/arc ... 
- [Ynoi2002] Goedel Machine
			题目描述 由于你不会设计哥德尔机,所以你决定先做一道数据结构题: 给定一个长度为 \(n\) 的序列 \(a_1\cdots a_n\).你需要回答 \(m\) 个询问,第 \(i\) 个询问给定一个 ... 
- [USACO2022OPEN S] COW Operations S
			题目描述 Bessie 找到了一个长度不超过 \(2 \cdot 10^5\) 且仅包含字符 'C','O' 和 'W' 的字符串 \(s\).她想知道是否可以使用以下操作将该字符串变为单个字母 'C ... 
- springBoot——读取数据
			在yml文件中读取数据,用$符号就可以 类似于这样的 如果要读取yml里面全部的数据,就用自动装配来写 而如果要用实体类来读取里面的数据 package com.example.springboot_ ... 
- MybatisPlus实现高效的多对多查询
			1.前置 事先声明一下代码中蕴含了大量的Stream和Lambda表达式操作,还不清楚的小伙伴可以去参考一下Java8新特性Stream流,而却我是用的是MybatisPlus这方面不清楚的也可以参考 ... 
- 江西财经大学第一届程序设计竞赛 I 题 小P和小Q
			题目链接:https://www.nowcoder.com/acm/contest/115/I 这题目要注意的是!!!pow函数前强制类型转换一定要float !!!一定要是float,double不 ... 
- 在灾难推文分析场景上比较用 LoRA 微调 Roberta、Llama 2 和 Mistral 的过程及表现
			引言 自然语言处理 (NLP) 领域的进展日新月异,你方唱罢我登场.因此,在实际场景中,针对特定的任务,我们经常需要对不同的语言模型进行比较,以寻找最适合的模型.本文主要比较 3 个模型: RoBER ... 
- U盘加密技术有哪些先进的保护措施?
			华企盾DSC数据防泄密系统的U盘加密技术采用了一系列先进的保护措施,以确保高水平的数据安全.系统采用强大的加密算法,如AES256(高级加密标准),确保对U盘中的数据进行不可逆的强加密,防范了未经授权 ... 
- 标注工具合集(点云&图片)
			有什么问题欢迎留言交流,发现好用的会持续更新-- 图片类 1. labelimg:https://github.com/tzutalin/labelImg --- 只能拉框 2. labelme:ht ... 
- java常用正则表达式工具
			public class RegexUtils { /** * 是否是无效手机格式 * @param phone 要校验的手机号 * @return true:符合,false:不符合 */ publ ... 
