首页 > 其他分享 >STM32学习(SPI通信)

STM32学习(SPI通信)

时间:2024-06-17 17:04:10浏览次数:25  
标签:MISO SS 主机 通信 STM32 SPI 从机 寄存器

本文章根据江科大的视频制作,供学习参考

1.SPI通信

1.1 SPI简介

SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
四根通信线:SCK/SCLK/CLK/CK(Serial Clock)(串行时钟线)、MOSI/DO(Master Output Slave Input)(主机输出从机输入)、MISO/DI(Master Input Slave Output)(主机输入从机输出)、SS/NSS/CS(Slave Select)(从机选择)
同步,全双工(数据接收和数据发送单独各占一根线)
支持总线挂载多设备(一主多从)(多一条通讯线,专门用来指定我要跟哪个从机进行通信)

        I2C,无论是硬件电路,还是软件时序,设计都相对比较复杂,硬件上,我们要配置位开漏外加上拉的模式 ,软件上,我们有许多功能与要求,比如,一根通信线兼顾数据收发,应答位收发,寻址机制的设计等等,最终通过这么多设计,就使得I2C通信的性价比非常高。I2C可以再消耗最低硬件资源的情况下,实现最多的功能,在硬件上,无论挂载多少个设备,都置需要两根通信线,在软件上,数据双向通信、应答位,都可以是实现。I2C的缺点:由于I2C开漏外加上拉电阻的电路结构,使得通信线高电平的驱动能力比较弱,这就会导致,通信线由低电平变到高电平的时候,这个上升沿耗时比较长,这会限制I2C的最大通信速度。

        SPI传输速率快,SPI协议并没有严格规定最大传输速度,这个最大传输速度取决于芯片厂商的设计需求,如:W25Q64芯片手册里写的SPI时钟频率,最大可达80MHz。其次,SPI设计比较简单粗暴,实现的功能没有I2C多。最后,SPI的硬件开销比较大,通信线的个数比较多,并且通信过程中,经常会有资源浪费的现象。

1.2 硬件电路

        左边这里是SPI主机,主导整个SPI总线,主机一般都是控制器来作,比如STM32,下面就是从机,左边的主机实际引出了6根通信线,因为由3个从机,所以SS线需要3根,再加上SCK、MOSI、MISO,就是6根通信线,当SPI所有通信线都是单端信号,它们的高低电平都是相对GND的电压差,所以,单端供电,所有设备还需要共地,这里GND的线没花出来但是必须要接,如果从机没有独立供电的话,主机还需要再额外引出电源正极VCC,给从机供电,这两根电源线VCC和GND,也要注意接好。首先,SCK时钟线,时钟线完全由主机掌控,所以对于主机来说,时钟线为输出,对于所有从机来说,时钟线都为输入,这样主机的同步时钟,就能送到各个从机了。下一个,MOSI,主机输出从机输入,这里左边是主机,所以就对应MO,主机输出,下面三个都是从机,所以就对应SI,从机输入,数据传输方向是主机通过MOSI输出,所有从机通过MOSI输入。下一个,MISO,主机输入从机输出,左边是主机对应MI,下面是从机对应SO,数据传输方向是,三个从机通过MISO输出,主机通过MISO输入。

        主机想指定谁,就把对应的SS输出线置低电平,主机初始化后所有从机都输出高电平。这样就是谁也不指定。SPI由一个冲突点,就是图上的MISO引脚,再这个引脚上,可以看到主机一个是输入,但是三个从机全是输出,如果三个从机都始终是推挽输出,势必会导致冲突,所以在SPI协议里,有一条规定,就是当从机的SS引脚为高电平,也就是未被选中时,它的MISO引脚,必须切换为高阻态,高阻态相当于引脚断开,不输出任何电平,这样就可以防止,一条线有多个输出,而导致的电平冲突的问题,在SS为低电平时,MISO才允许变为推挽输出,这就是SPI对这个可能的冲突做出的规定。

1.3 硬件电路

        左边时主机有一个8位移位寄存器,右边是从机也有一个8位移位寄存器,因为SPI一般是高位先行,所以每来一个时钟,移位寄存器都会想左进行移位,从机中的移位寄存器也是同理,然后呢,移位寄存器的时钟源,是由主机提供的·,这里叫做波特率发生器,它产生的时钟驱动主机的移位寄存器进行移位,同时,这个时钟也通过SCK引脚进行输出,接到从机的移位寄存器里,之后,上面移位寄存器的接法是,主机移位寄存器左边移出去的数据,通过MOSI引脚输入到移位寄存器的右边,从机移位寄存器左边移出去的数据通过MISO引脚,输入到主机移位寄存器的右边。

1.4 SPI时序

        SS从高电平变为低电平,代表选择某个从机,通信开始。SS从低电平变为高电平,终止选择从机,通信结束。

        SS产生下降沿后,MISO退出高阻态,在SCK上升沿时,MOS和MISO同时移出最高位数据,在下降沿时便开始采样,这里主机移出的最高位字节进入从机移位寄存器的最低位,从机移出的最高位进入主机寄存器的最低位,这样,一个之中脉冲残生完毕,一个数据位传输完毕。重复此过程,传输多个字节。SS上升沿后,MOSI还可以变化一次,将MOSI置一个默认的高低平或低电平,也可以不用管,然后MISO,从机必须置回高阻态。

        SS下降沿时,就要立刻触发移位输出,所以这里MOSI和MISO的输出,时对齐SS的下降沿的,或者说,这里把SS的下降沿,也当作时钟的一部分,那SS下降触发了输出,SCK上升沿,就可以采样输入数据了,然后SCK上升沿移入数据,SCK下降沿移除数据。

        CPOL(时钟极性)

        CPHA(时钟相位)

        模式2和模式3,就是SCK的极性取反

        

        在SPI中,通常采用的时指令码加读写数据的模型。SPI起始后,第一个发送从机的数据叫做指令码,在从机中,对应的会定义一个指令集,当我们需要发送什么指令时,就可以在起始后第一个字节发送指令集里的数据,这样就能指导从机完成相应的功能,不同的指令,可以有不同的数据个数,有的指令,只需要一个字节的指令码就可以完成,而有的指令,后面就需要再跟要读写的数据。

标签:MISO,SS,主机,通信,STM32,SPI,从机,寄存器
From: https://blog.csdn.net/2401_83265518/article/details/139627628

相关文章

  • 跨交换机VLAN的主机之间通信,竟可以用Cisco Packet Tracer模拟实现,
    需求说明:某企业网络因业务扩展,计算机终端的数量增至60台,单个24口交换机已不能满足所有计算机接入终端的网络接入需求,企业负责人要求将多个交换机进行互连,来满足企业计算机接入网络。其中技术部和市场部有计算机通过不同的交换机接入网络,为保证网络的正常稳定运行,网络技术人员......
  • Linux上java-jar Spingboot项目
    百度的,后面再补一个Linux文档操作手册,是不是很大胆?准备工作1、首先得有两个软件Xftp(用来上传文件到)和XShell(连接服务器执行命令)2、Linux上有JDK(怎么安装可以转到Linux安装JDK流程)3、项目的JAR包项目jar包导jar<build><plugins><plugin><groupId......
  • QSpinBox、QDoubleSpinBox 的使用,进制转换
    实现目的使用QSpinBox、QDoubleSpinBox实现数量*单价,float结果显示使用QSpinBox、QDoubleSpinBox实现进制的转换拟实现界面布局垂直布局、groupBox中为栅格布局控件进制设置属性displayIntegerBase16代表16进制#include"spinboxexample.h"#include"ui_......
  • 申瓯通信 在线录音管理系统 download 任意文件读取漏洞复现
    0x01产品简介申瓯通信在线录音管理系统是一款功能强大的录音管理解决方案,旨在满足公司、集团单位在区域分布下对录音数据的集中管理需求。该系统基于SOC1900、SOC1600等系列录音盒开发,是一个多线路、多设备、多区域的录音统一管理平台。该系统将各个分点的录音盒的录音统一集......
  • 创建Docker容器与外部机通信(端口映射的方式)
    一、检查端口是否被占用1.1 查看正在使用中的TCP和UDP端口:ss-tulnLISTEN:表示端口正在监听连接,意味着这些端口已经被系统服务使用。比如,如果你看到"tcp000.0.0.0:80800.0.0.0:*LISTEN",这意味着8080端口被一个服务监听,并等待连接。 判断端口是否被占用:如果你想......
  • SpinalHDL 学习笔记
    SpinalHDL是一种基于Scala的硬件构筑语言(ConstructingHardwareInScalaEmbeddedLanguage),通过比Verilog/VHDL更好层次的行为级描述,拥有更加高层次视角以及抽象编码能力,作为一种Verilog/VHDL代码的生成器,在Verilog/VHDL绝对统治芯片设计语言的情况下,宛如一泓清泉带来不一样......
  • [vue3]组件通信
    自定义属性父组件中给子组件绑定属性,传递数据给子组件,子组件通过props选项接收数据props传递的数据,在模版中可以直接使用{{message}},在逻辑中使用props.messagedefinePropsdefineProps是编译器宏函数,就是一个编译阶段的标识,实际编译器解析时,遇到后会进......
  • 使用Modbus转Profinet网关无需编写Modbus轮询程序,实现PLC和电表通信
    一、无需编写Modbus轮询程序实现PLC与电表通信的方法在工业自动化领域,PLC(可编程逻辑控制器)与电表之间的通信是非常常见的需求。传统上,为了让PLC与电表进行通信,通常需要编写Modbus轮询程序来实现数据的读取和控制。然而,近年来出现了一种新的方法,即通过使用Modbus转Profinet网关,可......
  • 基于STM32和人工智能的智能家居监控系统
    目录引言环境准备智能家居监控系统基础代码实现:实现智能家居监控系统4.1数据采集模块4.2数据处理与分析4.3控制系统4.4用户界面与数据可视化应用场景:智能家居环境监控与管理问题解决方案与优化收尾与总结1.引言随着智能家居技术的发展,智能家居监控系统在提升家居安......
  • 浅谈网络通信(3)
    文章目录一、TCP[!]1.1、TCP协议报文格式1.2、TCP十大机制1.2.1、确认应答机制1.2.2、超时重传机制1.2.3、连接管理机制1.2.3.1、三次握手[其流程至关重要,面试必考]1.2.3.2.1、那为啥要建立连接??建立连接的意义是啥??1.2.3.2、四次挥手1.2.4、滑动窗口机制1.2.5、流量控制......