STM32的SPI通信介绍

SPI简介

  • SPI:串行外设接口,与IIC一样都是通用数据总线。
  • 四根通信线:SCK,MOSI(DO),MISO(DI),SS。
  • 同步(共用一根时钟线),全双工(数据发送和接收单独占一条线)
  • 支持挂载多设备,一主多从,每个从机占用一根ss线

SPI与IIC对比: 

        与IIC不同,IIC可以实现多主机,半双工。IIC可以在消耗最低硬件资源的情况下实现最多的功能,性价比很高,缺点是通信线高电平的驱动能力较弱,低电平上升到高电平时需要花费很多时间,标准模式只有100KHz左右的速度,快速模式也只有400KHz。

        SPI传输更快,设计简单粗暴,较为简单,硬件开销较大,通信线较多,简单快速。

硬件电路:

  • 所有SPI设备的SCKMOSIMISO分别连在一起
  • 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  • 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

        得益于推挽输出的强驱动能力,使得高低电平变化很快,因此它的传输速度很快,注意:当从机的SS引脚为高电平,也就是从机未被选中的时候它的MISO引脚必须为高阻态,在SS为低电平时,才允许变为推挽输出。

SPI移位示意图:

        SPI运行原理:波特率发生器的作用就是产生时钟信号,经过一个上升沿和一个下降沿的时候,主机和从机就会交换一个数据,如图当产生上升沿时候,SPI主机和从机的移位寄存器都往左移,主机移出来一位1,从机移位出来一位0,这个移出来的数据放在各自线上的寄存器中,当产生下降沿时,主机与从机读取对方线上的数据,此时SPI主机的移位寄存器的最低位接收到了从机发出的0,同理SPI从机的移位寄存器接收到了1。这就是主机和从机交换一个字节的原理,就能同时实现数据的收发。

        主机和从机都是基于字节交换来完成数据收发的,每次收发数据就执行一次字节交换的时序,当需要发送不需要接收数据的时候怎么办呢?这时候还是调用字节交换的时序,只是不去读取从机接收的数据是什么。同理只需要接收不需要发送的时候,一般会让主机发送0x00或0xFF这种数据来把从机的数据置换过来。

SPI时序

  • 通信开始:SS从高电平切换为低电平
  • 通信保持:SS一直保持低电平
  • 通信终止:SS从低电平切换为高电平

        SPI有两个可以配置的位,分别为:CPOL,CPHA,每一位可以配置为1或0,总共组合起来一共有四种模式。

  • CPOL:时钟极性
  • CPHA:时钟相位

模式0(最常用)

  • CPIOL= 0,表示空闲状态时,SCK为低电平
  • CPHA = 0,表示SCK第一个边沿移入数据,第二个边沿移出数据

        模式0如图:由于时钟第一个边沿就要移入数据,那么应该提前有数据在数据线上,因此,在SS刚产生跳变时,MOSI和MISO就移出了一次数据,在时钟产生上升沿时,移入B7,紧接着时钟继续产生跳变,开始移出数据,就这样依次进行到最后一次时钟产生跳变时,MISO和MOSI还会再多移出一次数据,这样在下一次时钟产生上升沿的时候,才能继续移入数据,这样就能重复一个字节数据的收发了。

模式1:

  • CPIOL= 0,表示空闲状态时,SCK为低电平
  • CPHA = 1,表示SCK第一个边沿移出数据,第二个边沿移入数据

        如图模式1的时序图,MISO开始时为中间态,表示未选中从机时MISO为高阻态,当选中后也就是SS产生下降沿变为低电平时,开始传输数据,当SCK产生上升沿时,MOSI和MISO同时移出数据,当时钟产生下降沿时,又同时移入数据,这样就完成了一次数据交换,之后数据依次移出,移入,最后一个下降沿数据B0传输完成。然后将MOSI置到一个默认的高电平或者低电平,也可以不用去操作,从机将MISO置为高阻态。

模式2:

如图:

        模式2就是模式0的时钟相位取反,其余都相同。

模式3:

        同理,模式3与模式1也是时钟相位取反,其余相同。

SPI时序图:

发送一个字节的时序图

下图为发送一个0x06指令的时序图:

        通常使用指令码给从机,在从机中对应有指令集,这样可以指导从机进行相应的操作。具体指令参考从机的数据手册,有的指令只需要指令码,有的则是指令码+数据。

        如图这个波形为主机发送0x06指令,使用模式0,SS产生下降沿,MOSI和MISO开始变换数据,MOSI最高位是0,这里保持低电平不变,MISO这里从机没有数据发送给主机,引脚电平不用变换,MISO采用上拉输入,这里一直是高电平。在第一个时钟沿时,从机采样输入MOSI线,得到数据0,主机采样MISO线,得到数据1。到第6根绿线时,也就是第六个时钟沿,主机数据变化,这一位是1,那么改变MOSI信号为高电平。第二个时钟沿,也就是第二条绿线,这时候主机进行输出,由于第二位是0,那么波形也不用变化。

        有些芯片在不需要回传数据时,会保持MISO为高阻态,例如,W25Q64芯片在不需要回传数据时,MISO一直保持高阻态。

        总结来说就是下降沿变换数据,上升沿采样数据。

指定地址写的指令时序图

        如图实现了向指定设备发送写指令(0x02),再在指定地址下,写入数据。这个地址为24位,就需要三个字节进行传输,就要发三次8位的数据。如图,第一个字节时序实现了发送0x02指令,第二、三、四个字节时序分别发送了指令的23-16位,15-8位,7-0位的数据,最后一个字节时序发送了数据0x55。整个指令时序实现了在0x123456地址下写入0x55这个数据。

        如果发送一个字节后不终止,继续发送字节的话就会存储到下一个地址中,在SPI通信中,也会有地址指针,每读写一个字节,地址指针自动加1。

指定地址读的指令时序图

        如图实现了读从机的指定地址,第一个字节时序为读指令,第2、3、4个字节时序为地址,第五个字节时序就是随便发送一个数据来把从机的数据置换过来,一般这个数据为0xFF。 同理在这里也有地址指针,继续置换数据也会得到从机后一个地址的数据。

注意:由于MISO是由硬件自动控制,那么它会紧贴时钟的下降沿,MISO数据的最高位实际上是在上一个字节,最后一个下降沿提前发生的,因为是SPI模式0,所以数据变化都提前半个周期。

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

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

相关文章

阿里云服务器多少钱一个月?低至5元1个月

阿里云服务器一个月多少钱?最便宜5元1个月。阿里云轻量应用服务器2核2G3M配置61元一年,折合5元一个月,2核4G服务器30元3个月,2核2G3M带宽服务器99元12个月,轻量应用服务器2核4G4M带宽165元12个月,4核16G服务…

搜维尔科技:【应急演练】【工业仿真】救援模拟演练可视化仿真项目实施

安全救援综合演练系统是一套面向公共安全事故、预案管理、应急救援模拟演练的虚拟仿真解决方案,它为警察、消防以及专门的应急救援保障部门提供一个综合的应急救援培训和仿真演练平台。平台主要通过设计不同的事故模型和特定的灾难场景,定制不同的应急救…

上班几周了,

过年回来后,时间变得飞快,很多事情都是马上要去干,而且又是很着急的事,呵呵,真的要干趴了 然后——经历了第一次年后的周末连续加班出版本保量产,经历了加班到凌晨3点调试问题,经历我们在疯狂的…

深入理解React的setState机制

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

修复ubuntu引导

一、制作ubuntu启动U盘 进入启动盘后,点击Try ubuntu,进入U盘的ubuntu系统。 二、配置和添加源 sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update三、运行 Boot Repair重新制作引导 sudo boot-repair注意&#x…

冒泡排序(六大排序)

冒泡排序 冒泡排序的特性总结: 1. 冒泡排序是一种非常容易理解的排序 2. 时间复杂度:O(N^2) 3. 空间复杂度:O(1) 4. 稳定性:稳定 动图分析: 代码实现: Swap(int*p1,int*p2) {int tmp *p1;*p1*p2…

基于 Linux 的更新版 MaxPatrol VM 可扫描 Windows

👾 MaxPatrol VM 2.1 是俄罗斯唯一一款可以安装在 Linux 上并以审计和五重测试模式扫描 Windows 主机(甚至是旧版本)的漏洞管理产品。 让我们告诉你更新后的 MaxPatrol VM 还有哪些有用的功能: 1. 由于采用了新的数据存储模式&a…

基于SSM的高校推免报名(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的高校推免报名(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…

37、Linux中Xsync数据同步备份工具

37、Linux中Xsync数据同步备份工具 一、介绍二、配置集群hostname三、修改xsync文件四、赋权五、安装Rsync六、验证一七、配置免密登录1、生成rsa密钥2、copy机器自身公钥到目标机器3、.ssh/文件目录赋权 八、验证二 ⚠️ 注:本文全程在普通用户下操作,…

【数字图像处理matlab系列】数组索引

【数字图像处理matlab系列】数组索引 【先赞后看养成习惯】【求点赞+关注+收藏】 MATLAB 支持大量功能强大的索引方案,这些索引方案不仅简化了数组操作,而且提高了程序的运行效率。 1. 向量索引 维数为1xN的数组称为行向量。行向量中元素的存取是使用一维索引进行的。因此…

遇到了问题,Firepower 2140配置带外IP时报错 commit-buffer failed

onsite we have a cisco firepower 2140 device which run ASA as we try to modify the 2140 OOB mgmt ip by CLI, we got an error why ? 经过查询发现,需要进入ASA里面打上以下这条命令,并重启ASA 1 修改模式并重启 ciscoasa# configure termina…

3.27C++

完成下面类 //拷贝构造 //析构函数 //判空函数 //size函数 //c_str函数 //at函数 char &at(int pos); #include <iostream> #include <cstring> using namespace std; class myString { private:char *str; //记录c风格的字符串int size; …

BRICK POP展示了有趣的链上游戏玩法与奖励

新游戏BRICK POP将Sui区块链技术与低Gas费用&#xff0c;以及我们在Web3游戏开发方面的专业知识无缝结合。通过充分利用Sui和我们自己的INNO平台的优势&#xff0c;BRICK POP为玩家提供了一个融合了前沿技术和引人入胜游戏的沉浸式游戏体验。BRICK POP游戏设计为实时交易和高用…

2024-03-27 作业

作业要求&#xff1a; 整理课上代码整理思维导图完成下面类 作业1&#xff1a; 完成了 作业2&#xff1a; 作业3&#xff1a; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造myString():si…

Matlab基础入门

基础操作&#xff1a; matlab命令行操作&#xff1a; matlab可以使用命令行执行程序&#xff0c;例如下图运行后在右边工作区会产生响应的变量&#xff0c;如不写分号&#xff0c;则会直接运行。 clear命令&#xff1a;clear用于清除变量。clc命令&#xff1a;clc用于清屏。 m…

2024年目前阿里云服务器一个月收费价格表多少钱?

阿里云服务器一个月多少钱&#xff1f;最便宜5元1个月。阿里云轻量应用服务器2核2G3M配置61元一年&#xff0c;折合5元一个月&#xff0c;2核4G服务器30元3个月&#xff0c;2核2G3M带宽服务器99元12个月&#xff0c;轻量应用服务器2核4G4M带宽165元12个月&#xff0c;4核16G服务…

【软考---系统架构设计师】特殊的操作系统介绍

目录 一、嵌入式系统&#xff08;EOS&#xff09; &#xff08;1&#xff09;嵌入式系统的特点 &#xff08;2&#xff09;硬件抽象层 &#xff08;3&#xff09;嵌入式系统的开发设计 二、实时操作系统&#xff08;RTOS&#xff09; &#xff08;1&#xff09;实时性能…

程序员如何兼职赚小钱?

程序员由于有技术和手艺其实兼职赚钱的路子还是挺多的&#xff0c;只要你有足够的时间。 1. 做外包 这是比较传统的方式&#xff0c;甲方在一些众包平台上发布开发任务&#xff0c;你可以抢这个任务&#xff0c;但是价格都比较便宜。 任务比较多的平台: 猪八戒、一品威客、开…

Lazada、shopee自养号测评环境搭建需要准备哪些?

在如今电商竞争日益激烈的环境下&#xff0c;卖家们深知流量对店铺转化率的至关重要性。依赖平台内部的流量已不再足够&#xff0c;越来越多的卖家开始探索其他方式来提升销售业绩和品牌知名度。其中&#xff0c;自养号测评成为了一种备受关注的策略&#xff0c;通过搭建独立运…

高效解决Visual Studio无法识别到自定义头文件

文章目录 问题解决方案 问题 说明你没有好好配置项目属性 解决方案 把头文件都集中存放到一个文件夹里 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&#xff0c;点赞关注收藏&#xff0c;你的每一个赞每一份关注每一次收藏都将是我前进路…