MCU常见通信总线串讲(四)—— SPI总线协议

2023-11-08 23:45

本文主要是介绍MCU常见通信总线串讲(四)—— SPI总线协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🙌秋名山码民的主页
😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
获取源码,添加WX

目录

  • 前言
  • 一、SPI总线协议基本概念
  • 二、SPI协议层
  • 三、I2C和SPI的区别
  • 四、SPI的定义
  • 最后


前言

首先明确一个概念,关于MCU中通信总线和通信协议,通信总线是一种用于连接各种外设和模块的物理接口,它可以传输数据和控制信息。通信协议则是指在通信总线上传输数据时所遵循的规则和约定,以确保不同设备之间能够正确地交换信息,我们也可以把他叫做通信总线协议。

系列文章,主要讲解以下几个总线协议,读者可以按需选择:

  1. UART和USART
  2. RS232、RS485总线
  3. IIC总线
  4. SPI总线
  5. CAN总线
  6. USB总线

一、SPI总线协议基本概念

SPI是一种高速全双工的通信总线。
在这里插入图片描述
如上图所示,SPI有三根总线,和一根片选线组成,3条总线分别为SCK、MOSI、MISO,片选线为SS

  1. SS(Slave Select):从设备选择信号线,常称为片选信号线
  2. SCK(Serial Clock):时钟信号线,用于通信数据同步
  3. MOSI(Master Output,Slave Input):主设备输出/从设备输入引脚
  4. MISO(Master Input,Slave Output):主设备输入/从设备输出引脚

二、SPI协议层

在这里插入图片描述
NSS、SCK、MOSI信号都由主机控制产生,而MISO的信号由从机产生,主机通过该信号线读取从机的数据。MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期,MOSI和MISO传输一位数据。

  1. NSS信号线由高变低,是SPI通信的起始信号,NSS信号线由低变高是SPI通信的停止信号
  2. 数据有效性:观察图中的②③④⑤标号处,MOSI及MISO的数据在SCK的上升沿期间变化输出,在SCK的下降沿时被采样。即在SCK的下降沿时刻,MOSI及MISO的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其他时刻,数据无效,MOSI及MISO为下一次表示数据做准备。
  3. CPOL/CPHA及通信模式:
    在这里插入图片描述

三、I2C和SPI的区别

I2C(Inter-Integrated Circuit)和SPI(Serial Peripheral Interface)都是两种常见的串行通信协议,它们在硬件接口、数据传输方式和应用场景上有一些明显的区别。

  1. 硬件接口:

    • I2C需要两根线,即时钟线(SCL)和数据线(SDA)。它使用开漏输出来实现总线的双向数据通信。
    • SPI通信需要至少四根线,包括时钟线(SCLK)、数据输入线(MISO)、数据输出线(MOSI)和片选线(SS)。
  2. 数据传输方式:

    • I2C使用一个主从架构,允许多个设备连接到同一总线上。数据是以帧的形式进行传输,每个帧包括一个起始位、7或8位数据位、一个可选的ACK位和一个停止位。
    • SPI通常采用一对主从设备的方式,其中一个设备作为主控制器,其他设备作为从设备。它通过全双工通信进行数据传输,可以实现高速数据传输。
  3. 应用场景:

    • I2C通常用于连接低速外设,如传感器、EEPROM和实时时钟等,因为它比较简单并且支持多主机连接。
    • SPI通常用于连接高速外设,如存储器芯片、显示器、AD/DA转换器等,因为它可以提供更高的数据传输速率和灵活性。

四、SPI的定义

初始化结构体及函数定义在库文件stm32f10x_spi.h及stm32f10x_spi.c中,

typedef struct
{uint16_t SPI_Direction;           /*设置SPI的单双向模式 */uint16_t SPI_Mode;                /*设置SPI的主/从机端模式 */uint16_t SPI_Data Size;           /*设置SPI的数据帧长度,可选8位或16位 */uint16_t SPI_CPOL;                /*设置时钟极性CPOL,可选高或低电平*/uint16_t SPI_CPHA;                /*设置时钟相位,可选奇或偶数边沿采样 */uint16_t SPI_NSS;                 /*设置NSS引脚由SPI硬件控制还是软件控制*/uint16_t SPI_Baud Rate Prescaler; /*设置时钟分频因子,fpclk/分频数=f SCK */uint16_t SPI_First Bit;           /*设置MSB/LSB先行 */uint16_t SPI_CRCPolynomial;       /*设置CRC校验的表达式 */
} SPI_Init Type Def;

最后

如果本文对你有所帮助,还请三连支持一下博主!
请添加图片描述

这篇关于MCU常见通信总线串讲(四)—— SPI总线协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

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

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

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I