STM32 SPI通信协议1——协议基本原理及管脚定义

2024-01-12 23:28

本文主要是介绍STM32 SPI通信协议1——协议基本原理及管脚定义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  SPI介绍     

        SPI全称为Serial Peripheral interface,译为串行外围设备接口。SPI主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号编码器之间。

        SPI是一种高速,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。STM32也有SPI接口,SPI时钟最大可达18MHz支撑DMA,可以配置为SPI协议或者I2S(音频通信)协议。

SPI的内部简明图
  • MISO:

    • M(master)主机,S(slave)从机,I(input),O(output)由此可以看出,MISO就是从机Output,主机Input。
  • MOSI:

    • 由此类推,我们可以知道,MOSI就是主机Output,从机Input。
  • SCLK:

    • 因为SPI是同步通信,所以需要有个时钟线保证同步。
  • CS:

    • chip select片选信号线。

片选:动词,单片机学科词汇,可以理解成选片。举个例子,有很多芯片挂在同一总线上(像电脑里很多外设都是挂在总线上),但我们有时候需要对其中特定的某个芯片进行数据、地址或命令的独立传输,此时,我们需要有一个信号来告诉挂在总线上的芯片们,这些数据、地址是传给哪个芯片的。那这样的话,其他芯片就会对这些信号“漠不关心”,而目标芯片就知道这些数据是传给自己的从而做出反应。这个信号就叫做片选信号CS(chip select)或SS(slave select)。片选这个词即由此而来,指通过设置跳线,利用与门、或门、非门的组合来决定到底是哪几部分进入工作状态。 

 由上图可以看出一个主机可以连接多个从机,并且通过SS(这里的SS就是刚刚所说的CS)来确认,我们使用的是哪个从机。

 SPI模式

       根据SPI时钟极性(CPOL)时钟相位(CPHA)配置的不同,分为四种SPI模式。

       时钟极性(CPOL)

        时钟极性是指SPI通讯设备处于空闲状态时(也可以认为SPI通讯开始时,即CS线为低电平时),SCK信号线的电平信号。CPOL==0时,SCK在空闲状态时为低电平,CPOL==1时,则相反。

       时钟相位(CPHA)

        时钟相位是指数据的采样的时刻,当CPHA==0时,MOSI或MISO数据线上的型号将会在SCK时钟线的第一个跳变沿(奇数,上升或下降)沿被采样。当CPHA==1时,数据线在SCK的第二个跳变沿(偶数,上升或下降)沿采样。

        当CPHA==0时,MOSI或MISO数据线上的型号将会在SCK时钟线的第一个跳变沿(奇数,上升或下降)沿被采样。从上图可以看出,1,3,5,7为SCK的第一个跳变沿,看图就能分直观的看出为什么是“奇数,上升或下降”。即触发上升沿1,3,5,7。

同理:

        当CPHA==1时,数据线在SCK的第二个跳变沿(偶数,上升或下降)沿采样。2,4,6,8为SCK的第二个跳变沿,即为“偶数,上升或下降”。即触发下降沿2,4,6,8。

同理:

        当CPHA==0时触发下降沿1,3。

        当CPHA==1时触发上升沿2,4。 

        一般情况下我们使用32时会直接通过SPI配置SCK,MISO,MOSI,而不会去用SPI去配置NSS,因为常使用一主多从的模式(一个主机多个从机),为了更好的选择从机,会用GPIO去配置NSS,通过软件起到选择从机的作用。 

#include "bsp_spi.h"
void SPI1_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//PA4:CS片选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);//PA5:SCK时钟信号线GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);//PA6:MISOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);//PA7:MOSIGPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);
}

这篇关于STM32 SPI通信协议1——协议基本原理及管脚定义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/599493

相关文章

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines