STM32的SPI通信介绍

news2024/11/15 7:23:17

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.coloradmin.cn/o/1549253.html

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

相关文章

js算法记录

> 更多请前往 https://www.passerma.com/article/86 滑动窗口 1 给定一个矩阵,包含N*M个整数,和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数 function minSubmatrixWidth(mat…

Openstack创建和操作实例,实现与外部网络通信

一、熟悉OpenStack图形界面操作 1、了解Horizon项目 Horizon项目 各OpenStack服务的图形界面都是由Horizon提供的。Horizon提供基于Web的模块化用户界面。Horizon为云管理员提供一个整体的视图。Horizon为终端用户提供一个自主服务的门户。Horizon由云管理员进行管理与控制&a…

SpringBoot学习笔记一、SpringBoot应用初创建以及应用

一、创建SpringBoot的两种方式 1.Spring Initializr方式创建 (1)第一步在IDEA中选择 File-->NEW-->Project ,选择 Spring Initializr ,指定Maven坐标、包名、指定 JDK 版本 1.8 ,然后点击Next 。如下图&#x…

修改Jupyter Notebook的默认路径,以及在PowerShell中自定义其启动路径

修改Jupyter Notebook的默认路径,以及在PowerShell中自定义其启动路径 设置 Jupyter Notebook 配置文件,修改默认路径要在PowerShell中设置自定义的启动脚本,以确保Jupyter Notebook能够自动定位到当前路径设置后的效果 在使用Jupyter Notebo…

遇到了问题,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…

C语言例4-15:从键盘输入一个整数,求其绝对值并输出。

代码如下&#xff1a; //从键盘输入一个整数&#xff0c;求其绝对值并输出。 #include<stdio.h> int main(void) {int n;printf("输出一个整数&#xff1a; \n");scanf("%d",&n); //从键盘输入一个整数保存至变量nif(n<0) //…

Python爬虫之爬取网页图片

当我们想要下载网页的图片时&#xff0c;发现网页的图片太多了&#xff0c;无从下手&#xff0c;那我们写一个脚本来爬取呗。 这次的脚本是专门针对某个外国网站使用的&#xff0c;因此仅供参考思路。 在测试的过程中&#xff0c;我发现网站使用了发爬虫机制&#xff0c;具体就…

连接数据库(MySQL)的JDBC

目录 JDBC简介快速入门API详解DriverManager&#xff08;驱动管理类&#xff09;注册驱动&#xff1a;获取数据库连接(对象)&#xff1a; Connection&#xff08;数据库连接对象&#xff09;获取执行SQL的对象管理事务 Statement(执行SQL语句)执行DML、DDL语句执行DQL语句 Resu…

【LLM多模态】Cogvlm图生文模型结构和训练流程

note Cogvlm的亮点&#xff1a; 当前主流的浅层对齐方法不佳在于视觉和语言信息之间缺乏深度融合&#xff0c;而cogvlm在attention和FFN layers引入一个可训练的视觉专家模块&#xff0c;将图像特征与文本特征分别处理&#xff0c;并在每一层中使用新的QKV矩阵和MLP层。通过引…

LED基础知识分享(三)

大家好&#xff0c;我是砖一。 今天给大家分享一下&#xff0c;LED的基础知识&#xff0c;有照明行业&#xff0c;或者对LED感兴趣的朋友&#xff0c;可以学习一下&#xff0c;希望对你有用~ 一、热扩散 物质本身或当物质与物质接触时&#xff0c;能量的传递就被称为热传导&a…

STM32串口收发单字节数据原理及程序实现

线路连接&#xff1a; 显示屏的SCA接在B11&#xff0c;SCL接在B10&#xff0c;串口的RX连接A9&#xff0c;TX连接A10。 程序编写&#xff1a; 在上一个博客中实现了串口的发送代码&#xff0c;这里实现串口的接收代码&#xff0c;在上一个代码的基础上增加程序功能。 Seiral.…

idea使用git笔记

1.创建分支和切换分支 创建分支 切换分支 2.把新创建的分支提交到远程服务器上&#xff08;注&#xff1a;如果没有提交的&#xff0c;随便找个文件修改再提交&#xff09; (1)切换到要提交的分支&#xff0c;add (2)commit (3)push 3.在自己分支修改代码及提交到自己的远…

MySQL - 高阶语句(二)

目录 6. 子查询 操作&#xff1a; EXISTS 关键字 别名 as 7. 视图 理论&#xff1a; 操作&#xff1a; 视图的优缺点 8. NULL 值 9. union 联级 9.1 union &#xff08;合并后去重&#xff09; 9.2 union all (合并后不去重) 9.3 取非交集值 10. case 条件选择查…

阿里云服务器租用价格表-2024最新(附明细报价)

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网aliyunfuwuqi.com整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新…

TCP重传机制详解——02SACK

文章目录 TCP重传机制详解——02 SACKSACK是什么&#xff1f;为什么要有SACK&#xff1f;实际场景抓包具体显示信息流程 实战抓包讲解SACK关闭场景下&#xff0c;三次重复ACK后会快速重传SACK打开但是不携带SACK块信息场景下&#xff0c;三次重复ACK也不会快速重传SACK打开并且…

YOLOv9改进策略:IoU优化 | Wasserstein Distance Loss,助力小目标涨点

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;基于Wasserstein距离的小目标检测评估方法 Wasserstein Distance Loss | 亲测在多个数据集能够实现涨点&#xff0c;对小目标、遮挡物性能提升明显 &#x1f4a1;&#x1f4a1;&#x1f4a1;MS COCO和PASC…

性价比高一点的diy台式主机怎么搭配?

怎么搭配一台性价比高一点的台式机 建议&#xff1a; 选择合适的CPU和GPU。根据实际需求选择相对较新的CPU和GPU型号&#xff0c;以确保能够运行目标应用程序和游戏。 合理选择内存和存储。根据预算选择适当的内存和存储容量。8GB或16GB内存对于一般计算和游戏使用足够了&…

USART发送单字节数据原理及程序实现

硬件接线&#xff1a; 显示屏的SCA接在B11&#xff0c;SCL接在B10&#xff0c;串口的RX连接A9&#xff0c;TX连接A10。 新建Serial.c和Serial.h文件 在Serial.c文件中&#xff0c;实现初始化函数&#xff0c;等需要的函数&#xff0c;首先对串口进行初始化&#xff0c;只需要…

全国地质灾害点shp崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的&#xff0c;对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律&#xff0c;既受制于自然环境&#xff0c;又与人类活动有关&#xff0c;往往是人类与自然界相互作用的结果。…

easyx查找算法可视化--顺序查找/二分查找/分块查找

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 概述演示源码获取 概述 #顺序存储的顺序查找 √ #链式存…