搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
知新_RL
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
github公钥私钥的生成以及配置_github根据公钥生成私钥
2
02--02 进程间通信方式— 消息队列,以及代码实现_不同的的消息队列用同样的代码
3
考研复试408—计算机组成原理篇_408组成原理 按字编址默认是多少位
4
VannaAI 介绍及使用 - 第二篇_vannaai绘图
5
实战:第一章:防止其他人通过用户的url访问用户私人数据_防止url越权
6
Stable Diffusion模型训练 — 前菜_steble diffusion模型训练
7
SIFT四部曲之——高斯滤波_高斯滤波再做差
8
5分钟上手亚马逊云科技AWS核心云开发/云架构知识 - 维护EC2服务器
9
Mysql表结构差异比较_mysql表结构对比
10
个人搭建gitblit代码托管平台
当前位置:
article
> 正文
spi协议及工作原理分析
作者:知新_RL | 2024-08-07 20:33:16
赞
踩
spi协议
说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html
一、概述.
SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许 MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信.
SPI 主要应用在 EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器(DSP) 以及数字信号解码器之间. 它在芯片中只占用四根管脚 (Pin) 用来控制以及数据传输, 节约了芯片的 pin 数目, 同时为 PCB 在布局上节省了空间. 正是出于这种简单易用的特性, 现在越来越多的芯片上都集成了 SPI技术.
二、 特点
1. 采用主-从模式(Master-Slave) 的控制方式
SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作.
2. 采用同步方式(Synchronous)传输数据
Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的.
3. 数据交换(Data Exchanges)
SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)". 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了.
一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上.
在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃, 导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的.
三、 工作机制
1. 概述
上图只是对 SPI 设备间通信的一个简单的描述, 下面就来解释一下图中所示的几个组件(Module):
SSPBUF, Synchronous Serial Port Buffer, 泛指 SPI 设备里面的内部缓冲区, 一般在物理上是以 FIFO 的形式, 保存传输过程中的临时数据;
SSPSR, Synchronous Serial Port Register, 泛指 SPI 设备里面的移位寄存器(Shift Regitser), 它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;
Controller, 泛指 SPI 设备里面的控制寄存器, 可以通过配置它们来设置 SPI 总线的传输模式.
通常情况下, 我们只需要对上图所描述的四个管脚(pin) 进行编程即可控制整个 SPI 设备之间的数据通信:
SCK, Serial Clock, 主要的作用是 Master 设备往 Slave 设备传输时钟信号, 控制数据交换的时机以及速率;
SS/CS, Slave Select/Chip Select, 用于 Master 设备片选 Slave 设备, 使被选中的 Slave 设备能够被 Master 设备所访问;
SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被称为 Tx-Channel, 作为数据的出口, 主要用于 SPI 设备发送数据;
SDI/MISO, Serial Data Input/Master In Slave Out, 在 Master 上面也被称为 Rx-Channel, 作为数据的入口, 主要用于SPI 设备接收数据;
SPI 设备在进行通信的过程中, Master 设备和 Slave 设备之间会产生一个数据链路回环(Data Loop), 就像上图所画的那样, 通过 SDO 和 SDI 管脚, SSPSR 控制数据移入移出 SSPBUF, Controller 确定 SPI 总线的通信模式, SCK 传输时钟信号.
2. Timing.
上图通过 Master 设备与 Slave 设备之间交换1 Byte 数据来说明 SPI 协议的工作机制.
首先, 在这里解释一下两个概念:
CPOL: 时钟极性, 表示 SPI 在空闲时, 时钟信号是高电平还是低电平. 若 CPOL 被设为 1, 那么该设备在空闲时 SCK 管脚下的时钟信号为高电平. 当 CPOL 被设为 0 时则正好相反.
CPHA: 时钟相位, 表示 SPI 设备是在 SCK 管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样. 若 CPHA 被设置为 1, 则 SPI 设备在时钟信号变为下降沿时触发数据采样, 在上升沿时发送数据. 当 CPHA 被设为 0 时也正好相反.
上图里的 "Mode 1, 1" 说明了本例所使用的 SPI 数据传输模式被设置成 CPOL = 1, CPHA = 1. 这样, 在一个 Clock 周期内, 每个单独的 SPI 设备都能以全双工(Full-Duplex) 的方式, 同时发送和接收 1 bit 数据, 即相当于交换了 1 bit 大小的数据. 如果 SPI 总线的 Channel-Width 被设置成 Byte, 表示 SPI 总线上每次数据传输的最小单位为 Byte, 那么挂载在该 SPI 总线的设备每次数据传输的过程至少需要 8 个 Clock 周期(忽略设备的物理延迟). 因此, SPI 总线的频率越快, Clock 周期越短, 则 SPI 设备间数据交换的速率就越快.
3. SSPSR.
SSPSR 是 SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI 时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以及 Channel-Width 所决定.
Bus-Width 的作用是指定地址总线到 Master 设备之间数据传输的单位.
例如, 我们想要往 Master 设备里面的 SSPBUF 写入 16 Byte 大小的数据: 首先, 给 Master 设备的配置寄存器设置 Bus-Width 为 Byte; 然后往 Master 设备的 Tx-Data 移位寄存器在地址总线的入口写入数据, 每次写入 1 Byte 大小的数据(使用 writeb 函数); 写完 1 Byte 数据之后, Master 设备里面的 Tx-Data 移位寄存器会自动把从地址总线传来的1 Byte 数据移入 SSPBUF 里; 上述动作一共需要重复执行 16 次.
Channel-Width 的作用是指定 Master 设备与 Slave 设备之间数据传输的单位. 与 Bus-Width 相似, Master 设备内部的移位寄存器会依据 Channel-Width 自动地把数据从 Master-SSPBUF 里通过 Master-SDO 管脚搬运到 Slave 设备里的 Slave-SDI 引脚, Slave-SSPSR 再把每次接收的数据移入 Slave-SSPBUF里.
通常情况下, Bus-Width 总是会大于或等于 Channel-Width, 这样能保证不会出现因 Master 与 Slave 之间数据交换的频率比地址总线与 Master 之间的数据交换频率要快, 导致 SSPBUF 里面存放的数据为无效数据这样的情况.
4. SSPBUF.
我们知道, 在每个时钟周期内, Master 与 Slave 之间交换的数据其实都是 SPI 内部移位寄存器从 SSPBUF 里面拷贝的. 我们可以通过往 SSPBUF 对应的寄存器 (Tx-Data / Rx-Data register) 里读写数据, 间接地操控 SPI 设备内部的 SSPBUF.
例如, 在发送数据之前, 我们应该先往 Master 的 Tx-Data 寄存器写入将要发送出去的数据, 这些数据会被 Master-SSPSR 移位寄存器根据 Bus-Width 自动移入 Master-SSPBUF 里, 然后这些数据又会被 Master-SSPSR 根据 Channel-Width 从 Master-SSPBUF 中移出, 通过 Master-SDO 管脚传给 Slave-SDI 管脚, Slave-SSPSR 则把从 Slave-SDI 接收到的数据移入 Slave-SSPBUF 里. 与此同时, Slave-SSPBUF 里面的数据根据每次接收数据的大小(Channel-Width), 通过 Slave-SDO 发往 Master-SDI, Master-SSPSR 再把从 Master-SDI 接收的数据移入 Master-SSPBUF.在单次数据传输完成之后, 用户程序可以通过从 Master 设备的 Rx-Data 寄存器读取 Master 设备数据交换得到的数据.
5. Controller.
Master 设备里面的 Controller 主要通过时钟信号(Clock Signal)以及片选信号(Slave Select Signal)来控制 Slave 设备. Slave 设备会一直等待, 直到接收到 Master 设备发过来的片选信号, 然后根据时钟信号来工作.
Master 设备的片选操作必须由程序所实现. 例如: 由程序把 SS/CS 管脚的时钟信号拉低电平, 完成 SPI 设备数据通信的前期工作; 当程序想让 SPI 设备结束数据通信时, 再把 SS/CS 管脚上的时钟信号拉高电平.
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/知新_RL/article/detail/944408
推荐阅读
article
微软
蓝屏
事件
引发
的
网络安全
与
系统
稳定性
深度思考及实践探索...
-----
微软
蓝屏
事件
引发
的
网络安全
与
系统
稳定性
深度思考及实践探索 ======...
赞
踩
article
在
Apple
Silicon
Mac
上部署
StableDiffusion
的分步指南,释放 A...
本文提供了一步一步的指南,教你如何在
Apple
Silicon
Mac
上部署和
优化
StableDiffusion
模型,利...
赞
踩
article
人工智能
与
气候变化
:解决
全球
挑战
...
1.背景介绍
气候变化
是
全球
性的问题,它对人类生活、经济发展和生态平衡产生了严重影响。
气候变化
的主要原因是人类活动导致的大...
赞
踩
article
IDEA
上传
项目
到
gitee
(码云)...
码云地址 https://
gitee
.com/1.新建仓库2.填写仓库信息3.
IDEA
上创建GIT仓库4.选择当前
项目
当...
赞
踩
article
【
Android
】
HTTPS
“
中间人
攻击
”分析与防御_
android
校验ssl
证书
防止
中间人
攻击
...
一、
HTTPS
的作用1、 认证服务端与服务器,确保相互之间的信任关系。2、 加密数据,防止泄露。3、 验证数据完整性,防...
赞
踩
article
基于
飞桨
框架的
傅里叶
变换
基础
及领域
应用
...
本文章由
飞桨
PFCC社区成员卢畅贡献。卢畅,
飞桨
PFCC 成员,
飞桨
开源之星,
飞桨
开发者专家(PPDE),长期参加
飞桨
...
赞
踩
article
linux
的
多任务
编程-
线程
池
,
Linux
的
多任务
编程-
线程
池
(转)...
任务队列控制
的
线程
模型主要是通过任务队列上
的
信号来控制
线程
池
中
的
线程
调度.
线程
池
的
实现本例程共由5个文件构成:tpool...
赞
踩
article
Android
(已解决)
Gradle
编译失败
Unsupported
class
file
ma...
确认选中了当前项目(即不同项目可以使用不同的 JDK 版本),根据实际情况,在
Gradle
JDK 中设置一个 jdk...
赞
踩
article
Pycharm
在
下载
安装第三方库时速度慢或超时问题 / 切换国内
镜像
地址_
pycharm
下载
库太慢...
修改安装源,将默认源https://pypi.python.org/simple修改为清华源 https://pypi....
赞
踩
article
【AI
大
模型
应用开发】精读
ToT
:论文到
源码
,看透
ToT
思维
树的实现
流程
_
大
模型
tot
...
本文学习了一下
ToT
(Tree of Thoughts,
思维
树)的论文以及源代码,从
源码
角度详细分析了整个
流程
:一个
大
循...
赞
踩
article
【
数据结构
与算法(C语言)】
循环
队列
图解_
队列
遍历
过程的
流程图
...
循环
队列
动图详解_
队列
遍历
过程的
流程图
队列
遍历
过程的
流程图
...
赞
踩
article
android
关机
流程_
android
系统
所有的
重启
关机
流程分析...
本文深入探讨了Android
系统
的
重启
和
关机
流程,包括从C语言中的reboot函数调用,通过ADB命令实现不同模式的
重启
...
赞
踩
article
GitHub
账户
注册
...
GitHub
是一个优秀的面向开源及私有软件项目的托管平台,值得我们使用,但因为其不同于我们常见的很多平台,所以刚开始使用...
赞
踩
article
Python
——
报错
:
ImportError
: No
module
named
***...
Python
——
报错
:
ImportError
: No
module
named
***_no
module
named
n...
赞
踩
article
Linux
-
C++
实现简单
线程
池
_
linux
c++
下
线程
池
如何调用
function
...
Linux
下,用
C++
实现简单
线程
池
。
线程
安全的单例模式_
linux
c++
下
线程
池
如何调用
function
linux
c+...
赞
踩
article
SPI
原理_spi
通信
原理...
目录什么是
SPI
SPI
主从模式
SPI
信号线
SPI
设备选择
SPI
数据传输
SPI
传输数据量
SPI
数据传输顺序
SPI
数据CRC...
赞
踩
article
ThreadPoolExecutor
源码分析_
kwaiflow
...
线程池源码分析、
ThreadPoolExecutor
_
kwaiflow
kwaiflow
...
赞
踩
article
Python
如何下载
视频
_
python
下载
视频
...
总结来说,
Python
提供了多种方法来下载
视频
,你可以选择使用第三方库或仅依赖
Python
标准库来实现。需要注意的是,直...
赞
踩
article
Android
的
dumpsys
命令_
dumpsys
batterystats
...
转自 https://www.jianshu.com/p/6bd4813b3c60我们都知道
Android
是基于Linu...
赞
踩
article
人工智能
在环境:
气候变化
与
资源
保护
...
1.背景介绍
气候变化
和
资源
保护
是当今世界最迫切的问题之一。随着人类对环境的影响越来越大,
气候变化
和
资源
不足已经成为了一个...
赞
踩
相关标签
活动文章
macos
stable diffusion
人工智能
paddlepaddle
linux的多任务编程-线程池
android
python
ipython
scrapy
django
pycharm
笔记
经验分享
AIGC
思维树
大模型
c语言
开发语言
android 关机 流程
服务器
c++
linux