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.hqwc.cn/news/572324.html

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

相关文章

已注册的商标别忘了续展,新注可能难下证!

近期普推知产老杨遇到好几个网友和看过多个案例,以前商标名称可以申请注册下来,但是换字体注册不下来了,有的是不想续展想直接换字体申请注册,但是也没有下来。 这些商标名称主要是存在禁止注册或缺显,比如“柳林”以前…

阿基米德和C++

阿基米德和C 今天在看书的时候发现一个有意思的小文章,说蒋介石的英文名字叫真该死,如果翻译回中文的话,变成了常凯生; 由此想到看计算机的书籍,必要时,一定要看看用英文原版,因为这个翻译的水平…

Apriori关联算法

Apriori---[əpriˈɔri] ---先天的,推测的 什么是关联规则? 尿布 -> 葡萄酒 就是一个关联规则。如果顾客买了尿布,那么在统计上,那么他会购买葡萄酒的概率比较大。(但是,这一条件反过来并不总是成立。…

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

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

微分几何:曲线基本理论

参数曲线基本理论 曲线的定义 假设有一个运动的质点,从0到T时刻,质点从A点运动到B点,质点运动的轨迹形成了一条曲线,我们可以将这条路径曲线看成是时间 t ∈ [ 0 , T ] t \in [0,T] t∈[0,T]到空间位置 R R R的映射。 映射的概念…

Redis入门到实战-第二十弹

Redis实战热身Time series篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的(采用BSD许可证),用作数据库、缓存、消息代…

UE4_旋转节点总结一

一、Roll、Pitch、Yaw Roll 围绕X轴旋转 飞机的翻滚角 Pitch 围绕Y轴旋转 飞机的俯仰角 Yaw 围绕Z轴旋转 飞机的航向角 二、Get Forward Vector理解 测试: 运行: 三、Get Actor Rotation理解 运行效果: 拆分旋转体测试一&a…

[AIGC] MySQL存储引擎详解

MySQL 是一种颇受欢迎的开源关系型数据库系统,它的强大功能、灵活性和开放性赢得了用户们的广泛赞誉。在 MySQL 中,有一项特别重要的技术就是存储引擎。在本文中,我们将详细介绍什么是存储引擎,以及MySQL中常见的一些存储引擎。 文…

11.数据库技术(上)

函数依赖、规范化这类难的知识点,考的少; 基本概念、sql语句、关系代数运算、关系代数运算与sql语句的转换,考的多; 主要议题: 1.三级模式/两级映像 三级模式:外模式、模式、内模式; 模式&a…

高阶SQL语句(二)

一 子查询 也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句 是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。 ①子语句可以与主语句所查询的表相同,也可以是不…

手把手教你安装JSONView插件

1.JSONView插件的作用是什么呢? 后端接口编写完成之后,页面上未设置格式,json数据非常的凌乱。如果我们安装了这个插件,数据在页面上的显示就十分规范了。 以下是安装以后的效果: 2.安装JSONView 1.从https://githu…

STM32F10X开发环境的搭建

一、keil软件安装 找到keil软件包,解压缩,找到keil5安装软件: 鼠标右键选择以管理员权限运行。点击next,直到安装结束。 安装完成后在桌面会出现keil5软件图标: 然后再安装相应的芯片支持包:我们用的是stm…