SPI协议

news/2024/9/20 15:49:17

1、简介

​SPI协议是一种高速全双工同步串行通信协议,由一个主设备和一个或多个从设备组成。

​四线协议:MISO(Master Input Slave Output)/SDI(Serial Data Input)、MOSI(Master Output Slave Input)/SDO(Serial Data Output)、SCLK(Synchronous Clock)、CS(Chip Select)

1、MISO,主设备数据输入,从设备数据输出;

2、MOSI,主设备数据输出,从设备数据输入;

3、SCLK,同步时钟信号,由主设备产生;

4、CS,从设备使能(片选)信号,由主设备控制,低电平为选中。当总线上有多个从设备的时候,主设备如果需要和某个从设备通信,就将该设备对应的片选引脚拉低使能;

相比于I2C协议,SPI更加快速,但是由于没有相应的流控和应答机制,所以数据的可靠性上有一定的缺陷。

2、SPI总线传输模式

​ 主设备根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),时钟脉冲组成时钟信号(Clock Signal),时钟信号通过时钟极性(CPOL,Clock Polarity)和时钟相位(CPHA,Clock Phase)控制两个SPI设备何时交换数据以及何时对接收的数据进行采样。

  • CPOL(Clock Polarity,时钟的极性): 规约 SPI 总线在空闲时, SCK时钟信号是高电平1还是低电平0;
  • CPHA(Clock Phase,时钟的相位): 规约 SPI 设备是在SCK时钟信号上升沿还是下降沿触发数据采样;

​ SPI 总线传输一共有 4 种模式:

  1. 模式 0:CPOL= 0,CPHA=0。SCK 串行时钟线空闲是为低电平,数据在 SCK 时钟的上升沿被采样, 数据在 SCK 时钟的下降沿切换;

  2. 模式 1:CPOL= 0,CPHA=1。SCK 串行时钟线空闲是为低电平,数据在 SCK 时钟的下降沿被采样, 数据在 SCK 时钟的上升沿切换;

  3. 模式 2:CPOL= 1,CPHA=0。SCK 串行时钟线空闲是为高电平,数据在 SCK 时钟的下降沿被采样, 数据在 SCK 时钟的上升沿切换;

  4. 模式 3:CPOL= 1,CPHA=1。SCK 串行时钟线空闲是为高电平,数据在 SCK 时钟的上升沿被采样, 数据在 SCK 时钟的下降沿切换;

3、SPI总线数据交换

​ 一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访 问 (Access). 所以, Master 设备必须首先通过拉低 SS/CS 管脚对 Slave 设备进行片选, 把想要访问的Slave 设备选上。

​ SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)". 事实上SPI 设备在通信时两边各有 1 个移位寄存器,这样在发送一个 bit 的同时将会收到对方 1 个 bit 的数据,当发送完 8bit 数据后,也将收到对方的 8bit 数据,这也就意味着完成了 1 个 byte 的数据交换。

SPI 数据传输过程实际上就是主从设备两个移位寄存器的数据交换过程,所以 SPI 的读功能实际上可以由 SPI 的写功能实现,即随便写一个字节的无效数据(Dummy Data)即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/62574.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

C#使用HttpWebRequest读取网站内容遭遇503错误

本人多年编程小白,天生编程白痴体质。大家莫见笑。 自己用C#写了一段代码,使用HttpWebRequest,通过SOHU的API接口获取指定股票的交易信息。 该段代码一直运行正常。最近开始报错。 详细信息如下: System.Net.WebException HResult=0x80131509 Message=远程服务器返回错误: (…

算法随笔——wqs二分

学习链接 学习链接 应用条件选择恰好 \(x\) 个物品,求最优值 设 \(x\) 对应最优值 \(f_x\) ,\((x,f_x)\) 在图像上呈现为凸包。 无数量限制问题简单可做问题转化 有 \(n\) 个物品,恰好选 \(m\) 个,计算最优值。 做法例题 模版题:P2619

modbus设备数据 转 profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 设置网关采集MODBUS从站数据 2 5 用PROFINET IO协议转发数据 8 6 案例总结 10 1 案例说明设置网关采集Modbus设备数据 把采集的数据转成profinet IO协议转发给其他系统。2 VFBOX网关工作原理 VFBOX网关是协议转换网关,…

WPF开发 direct3d11 调试报错

环境:VS2022 WPF Win11 过程:准备调试d3d11着色器转换nv12->rgb的过程 报错信息:DXGI_ERROR_SDK_COMPONENT_MISSING 应用程序请求的操作依赖于已缺失或不匹配的 SDK 组件。 解决方案::需要在自己电脑中进行设置 【设置】-【系统】-【可选功能】-【查看功能】-【图形工具…

Cloudera安装指南:打造你的大数据基础环境

Cloudera manage系统环境准备、基础环境安装、集群部署以及应用组件安装等全方位的技术运维内容。无论您是初学者还是资深工程师,都能在这里找到适合自己的学习资料和实战经验。我们致力于为您提供最新、最全面的Cloudera大数据技术运维知识,帮助您轻松应对各种技术挑战。Clo…

uni-app上架ios语言设置

客户反馈了一个问题,日文的应用上架后在商店中,却显示了其他语言,解决方案如下 1.添加要设置的语言2.最重要的一步,在 app-plus 中添加下述代码 name 是app名称"app-plus" : {"locales" : {"ja" : {"name" : "xxx","…

【算法】topk之字节题

1. 合并两个有序列表 🔗 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 = [], l2 = [] 输出:[] 示例 3: 输入:l1 = [], l2 = [0] …

flink 启动Job加载外部jar都有哪些方法?

flink 启动Job加载外部jar都有哪些方法 在 Apache Flink 版本中,启动 Job 时加载外部 Jar 包有几种不同的方法。这些方法允许用户引入自定义的 UDF(用户定义函数)或其他依赖项。以下是几种常见的方法: 1.使用 flink run 命令直接启动 你可以通过命令行工具 flink run 来指定…