一文教你彻底学会SPI协议

news2024/11/17 12:45:13

一文教你彻底学会IIC协议

  • 一.概况SPI
  • 二.SPI连接
    • 2.1 一主一从
    • 2.2 一主多从
  • 三.SPI通信过程
    • 3.1 CPOL(极性)和CPHA(相位)
    • 3.2 SPI时序图
    • 3.1 SPI起始信号
    • 3.2 SPI停止信号
    • 3.3 数据的有效性
  • 四.代码实例

一.概况SPI

SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、 LCD 等设备与 MCU 间,要求通讯速率较高的场合。这里可以对比我写的另外一篇博客一文教你彻底学会IIC协议
1.信号线:SPI具有SCK,MOSI,MISO ,CS线 (区别于IIC只有CLK,SDA).。
2.寻址方式: SPI是通过CS片选信号来选择从机(IIC是通过寻址找到从设备)
3.通信速率:SPI速率较快(可达fPCLK/2),一般用于高速设备之间通信(区别于IIC)

PI区别于IIC,SPI有时钟线,MOSI(主输出从输入线),MISO(zh)
在这里插入图片描述

二.SPI连接

2.1 一主一从

在“一主一从”的SPI互连方式下,只有一个SPI主设备和一个SPI从设备进行通信。这种情况下,只需要分别将主设备的SCK、MOSI、MISO和从设备的SCK、MOSI、MISO直接相连,并将主设备的SS置高电平,从设备的SS接地(即置低电平,片选有效,选中该从设备)即可。

在这里插入图片描述

2.2 一主多从

在“一主多从”的SPI互连方式下,一个SPI主设备可以和多个SPI从设备相互通信。这种情况下,所有的SPI设备(包括主设备和从设备)共享时钟线和数据线,即SCK、MOSI、MISO 3根线,并在主设备端使用多个GPIO引脚来选择不同的SPI从设备。
在这里插入图片描述

三.SPI通信过程

讲通信过程之前,先讲一下极性和相位。后面才能理解后序采样过程。

3.1 CPOL(极性)和CPHA(相位)

CPHA(时钟相位)位被清“0”,数据在SCK时钟的奇数(第1、3、5…个)跳变沿采样.
CPHA(时钟相位)位被置“1”,数据在SCK时钟的偶数(第2、4、6…个)跳变沿采样.
CPOL位为“0”时就是SCK在空闲时为0, CPOL位为“1”时就是SCK空闲时为1。
所以说,CPOL决定了第一个沿是上升沿还是下降沿。如果SCK空闲是为0,那第一个沿为上升沿。如果SCK空闲时为1,那第一个沿为下降沿。
那么总的来说,CPHA和CPOL决定了是上升沿采样还是下降沿采样。
所以总共有4种组合,决定了SPI有4种模式,总的表格如下:
在这里插入图片描述

3.2 SPI时序图

这是一个主机的通讯时序,我们以SPI模式0为例。 NSS、 SCK、 MOSI 信号都由主机控制产生,而 MISO 的信
号由从机产生,主机通过该信号线读取从机的数据。 MOSI 与 MISO 的信号只在 NSS 为低
电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。
SPI的时钟信号具有相位和极性

3.1 SPI起始信号

NSS 信号线由高变低,是 SPI 通讯的起始信号。 NSS 是每个从机各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。

3.2 SPI停止信号

NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

3.3 数据的有效性

SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。 MOSI 及MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时, MSB 先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定, MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出,在SCK 的下降沿时被采样。即在 SCK 的下降沿时刻, MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效, MOSI及 MISO 为下一次表示数据做准备。SPI 每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。

四.代码实例

这里以和Flash通信为例,下面是一个初始化代码

void SPI_FLASH_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
	
	/* 使能SPI时钟 */
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );
	
	/* 使能SPI引脚相关的时钟 
	1.片选引脚 2.SCK时钟引脚 3.MISO引脚 4.MOSI引脚 */
 	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOA|
																	     RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOA, ENABLE );
	
  /* 配置SPI的 CS引脚,普通IO即可 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
  /* 配置SPI的 SCK引脚*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* 配置SPI的 MISO引脚*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* 配置SPI的 MOSI引脚*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* 停止信号 FLASH: CS引脚高电平*/
  GPIO_SetBits(GPIOA,GPIO_Pin_4);

  /* SPI 模式配置 */
  // FLASH芯片 支持SPI模式0及模式3,据此设置CPOL CPHA
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//全双工模式
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  //主机
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;  //极性高
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;  //偶边沿
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   //软件控制
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;  //速率4分频
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //高位先行
  SPI_InitStructure.SPI_CRCPolynomial = 7;           //数据校验 --一般不需要
  SPI_Init(FLASH_SPIx , &SPI_InitStructure);      //初始化结构体

  /* 使能 SPI  */
  SPI_Cmd(SPI1 , ENABLE);
	
}

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

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

相关文章

腾讯云服务器开Minecraft配置怎么选择?

腾讯云服务器Minecraft我的世界服务器配置怎么选择?10人以内玩2核4G就够用了,腾讯云开我的世界服务器选择轻量应用服务器就够了,轻量CPU采用至强白金处理器,大型整合包一般1.12版本的,轻量2核4G配置都差不多的&#xf…

智慧加油站卸油作业行为分析算法 opencv

智慧加油站卸油作业行为分析系统通过opencvpython网络模型技术,智慧加油站卸油作业行为分析算法实现对卸油作业过程的实时监测。当现场出现卸油作业时人员离岗,打电话人员抽烟等违规行为,灭火器未正确摆放,明火和烟雾等异常状态&a…

VMware 逃逸基础知识

虚拟化相关概念 VMM:即 VM Monitor ,也被称为 Hypervisor(虚拟机监控程序)。VMM 是 guest os 的管理器,管理虚拟机运行。例如 Windows 的 Hyper-V ,linux 的 KVM 以及裸机上安装的 Xen 和 VMware ESXi 都属…

《MySQL是怎么运行的》阅读笔记

mysql运行的整体架构简介 Mysql是由两部分构成,一部分是服务器程序,一部分是客户端程序。 服务器程序又包括两部分: 第一部分server层包括连接器、查询缓存、分析器、优化器、执行器等。涵盖 MySQL 的大多数核心服务功能,以及所有…

【Android复习笔记】Glide核心原理

Glide 核心流程 Glide中RequestManager会管理两个队列,一个请求队列,一个等待队列,当生命周期onStop停止时,把运行队列中的任务添加到等待队列中,当生命周期onResume恢复时,又从等待队列中添加到运行队列执行。 关于 Glide.with(this).load(url).into(iv); 主要搞清楚三…

Doris初认识

Doris初认识 文章目录 Doris初认识1. Doris 概述2. 核心特性3. 使用场景4. 架构 1. Doris 概述 Apache Doris 是由百度大数据部研发(之前叫百度 Palo,2018 年贡献到 Apache 社区后,更名为 Doris ),在百度内部&#xff…

Schneider Electric EcoStruxure Control Expert 15.3 Crack

Schneider Electric EcoStruxure Control Expert 15.3专为使用施耐德电气的Modicon PLC(可编程逻辑控制器)的控制和自动化工程师量身定制。它提供了一系列功能和工具,以方便自动化应用程序的开发、部署和维护。 施耐德电气EcoStruxure控制专家…

优化命令测试

命令内容: nload、free 目录 一、nload 1.删除yum仓库本地源 local.repo 2.nload命令的环境依赖文件只有在epel商城才有 所以需要安装epel 3.压力测试 二、free 1.free功能 2.free参数​编辑 4.实验:使用压力测试工具dd 查看内存使用的变化 总…

KUKA机器人出现“如果文件以写入方式打开,则不允许选择或执行程序”的解决办法

KUKA机器人出现“如果文件以写入方式打开,则不允许选择或执行程序”的解决办法 情景再现: 在操作KUKA机器人时可能会遇到这样的情况:如下图所示,即操作人员登录了管理员权限后,打开了config配置文件, 正常情况下,应该像下图所示点击左侧的来关闭config配置文件,但是…

Java012——引用数据类型String的简单学习

回顾Java数据类型 本次要学习的是Java引用数据类型String 一、对String类简单说明 说明:String是Java中的一个类 二、String类的作用 作用:主要用来创建和操作字符串。 三、使用String类 3.1、创建字符串 注意: 1、字符串使用双引号&qu…

【SQL应知应会】分析函数的点点滴滴(二)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数:…

Linux中新建用户使用sudo问题

文章目录 sudo问题 sudo问题 sudo:权限提示指令,当使用sudo这条指令时,会将普通用户的权限提升为root权限 但是在命令行新建用户,这个用户使用sudo指令对一条指令提权是用不了的 这个用户没有在sudoers file这个文件中&#xff…

读发布!设计与部署稳定的分布式系统(第2版)笔记05_层叠

1. 水平扩展 1.1. 增加服务器来增加容量 1.1.1. 这些服务器集群被称为“农场” 1.2. 负载均衡的服务器集群 1.2.1. 不易遭遇单点系统失效 1.2.2. 高负载比低负载更易导致竞态条件的并发缺陷 1.3. 如果双节点集群出现失效,那么幸存服务器的工作负载将增加一倍 …

SpringBoot集成企业微信自建应用消息

目录 参考文档概述发送限制成员收不到应用推送消息的原因创建应用五、发送消息1、文本 text2、卡片文本3、图文news4、markdown 参考文档 官方文档 企业微信群机器人应用 概述 消息群发,是企业微信提供的用于企业向成员推送企业通知的工具,支持管理端…

AN13743-移植-无eSE

PN553/PN557 to PN7160 migration guidelines 1目的 本文件提供了从PN553/PN557 NFC控制器迁移到PN7160 NFC控制器的指南。它旨在从硬件和软件的角度描述PN7160 NFC控制器与PN553/PN557 NFC控制器的主要区别和新功能。软件部分逐步介绍如何适应Android开源项目 为PN553/PN55…

React学习笔记(二)组件详解

一、组件的概念: 当你开始学习 React 的时候,你会了解到 React 组件是 React 应用程序的基本构建块。组件是一个隔离的、可重复使用的代码块,由 HTML 元素、其他组件或自定义的 UI 元素组成,组件也就是react的核心思想&#xff0c…

Visual Studio Code 插件安装

目录 1、在线安装 1.1 单个插件的安装 1.2 根据配置文件一次性安装多个插件 1.3 同步配置的方式 1.3.1 第一种方式使用VSCode自带的同步功能。 1.3.2 第二种方式,首先需要先安装插件 Settings Sync 2、离线安装 2.1 去官方下载离线安装包进行安装 2.2 直接…

DolphinScheduler任务调度工具

任务调度:系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程 分布式调度: 分布性:每个部分可以独立部署,服务之间通过网络通信伸缩性:每个部分可以集群部署,动态伸缩扩容高可用 jd…

IntelliJ IDEA 2022.3.1 (Community Edition)代码注释风格设置

Setting -> Editor -> Code Style -> Java -> Comment Code

Unity 之 最新Ads原生广告接入流程详解和工具类分享

Unity 之 Ads接入流程详解 一,注册 Unity Ads 广告 SDK二,下载 Unity Ads 广告 SDK三,配置 Unity Ads 广告 SDK3.1 广告位展示流程3.2 代码初始化 四,集成 Unity Ads 广告 SDK4.1 相关介绍4.2 代码分享 五,测试 Unity …