SPI通信协议

2023-05-16

spi通信协议概念:

SPI是一种有线通信协议,用于两个设备之间的全双工数据传输(所谓的全双工,就是该协议可以同时进行收发数据

SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。

目录

(一)spi引脚详解:

(二)spi的四种模式详解

1:CPOL/CPOA

(三)STM32标准外设库SPI_InitTypeDef的定义 

(四)SPI 发送/接收


(一)spi引脚详解:

NSS<-->RES:从机复位引脚

MOSI:主机发送,从机接收数据引脚

MISO:主机接收,从机发送数据引脚

SCK: 时钟引脚

      对于spi通信协议来说,他的接收数据的时刻(数据采样时刻)就在时钟的跳变沿。上升沿和下降沿均可(这要看具体的spi参数配置)。

     当然它也需要设置通信的波特率。波特率的概念,可以先简单的理解为每秒钟发送几个字节的数据,一般来说波特率越高,每秒发送的字节数越多。

(二)spi的四种模式详解

1:CPOL/CPOA

首先了解一下什么是SCK空闲状态,其就是当SCLK在数发送8个bit比特数据之前和之后的状态,于此对应的,SCK在发送数据的时候,就是正常的工作的时候,有效active的时刻了。

CPOL = 0 :  当无数据发送(空闲状态下)SCK默认保持高电平

CPOL = 1:当无数据发送(空闲状态下)SCK默认保持高电平

CPHA = 0:  有数据接收时,在第一个跳变沿进行数据的接收(在奇数的跳变沿接收数据)

CPHA = 1:  有数据接收时,在第二个跳变沿进行数据的接收(在偶数的跳变沿接收数据)

所以根据这两个变量的两两组合,就形成了四种模式,分别为 模式0 ~ 模式3。我们在使用spi和外设模块进行通信的时候,一定要注意到该外置模块兼容哪种spi通信模式,然后在mcu进行代码编写时进行相应的调整。(SPI通信模式,是从设备决定主设备的,我们在观察时序图时,只需要看sck空闲时刻的电平与下一时刻的取样电平是上升沿还是下降沿即可判定)

(三)STM32标准外设库SPI_InitTypeDef的定义 

typedef struct
{
    uint16_t SPI_Direction; // 设置SPI 的通信方式,可以选择为半双工,全双工,以及串行发和串行收方式
   uint16_t SPI_Mode; // 设置SPI 的主从模式
   uint16_t SPI_DataSize; // 为8 位还是16 位帧格式选择项
   uint16_t SPI_CPOL; // 设置时钟极性
   uint16_t SPI_CPHA; // 设置时钟相位
   uint16_t SPI_NSS;   //设置NSS 信号由硬件(NSS管脚)还是软件控制
   uint16_t SPI_BaudRatePrescaler;  //设置SPI 波特率预分频值
   uint16_t SPI_FirstBit;    //设置数据传输顺序是MSB 位在前还是LSB 位在前
   uint16_t SPI_CRCPolynomial; //设置CRC 校验多项式,提高通信可靠性,大于1 即可
}SPI_InitTypeDef;

第一个参数SPI_Direction 是用来设置SPI的通信方式,可以选择为半双工,全双工,以及串行发和串行收方式,这里我们选择全双工模式SPI_Direction_2Lines_FullDuplex。

第二个参数SPI_Mode用来设置SPI的主从模式,这里我们设置为主机模式 SPI_Mode_Master,当然有需要你也可以选择为从机模式 SPI_Mode_Slave。

第三个参数SPI_DataSiz为8位还是16位帧格式选择项,这里我们是8位传输,选择SPI_DataSize_8b。

第四个参数SPI_CPOL用来设置时钟极性,我们设置串行同步时钟的空闲状态为高电平所以我们选择SPI_CPOL_High。

第五个参数SPI_CPHA 用来设置时钟相位,也就是选择在串行同步时钟的第几个跳变沿(上升或下降)数据被采样,可以为第一个或者第二个条边沿采集,这里我们选择第二个跳变沿,所以选择 SPI_CPHA_2Edge

第六个参数SPI_NSS设置NSS信号由硬件(NSS管脚)还是软件控制,这里我们通过软件控制NSS关键,而不是硬件自动控制,所以选择 SPI_NSS_Soft。

第七个参数 SPI_BaudRatePrescaler很关键,就是设置 SPI 波特率预分频值也就是决定 SPI 的时钟的参数,从不分频到256分频8个可选值,初始化的时候我们选择8分频值SPI_BaudRatePrescaler_8,传输速度为72M/8=9MHz。

第八个参数 SPI_FirstBit设置数据传输顺序是 MSB 位在前还是LSB位在前,这里我们选择SPI_FirstBit_MSB高位在前。

第九个参数 SPI_CRCPolynomial是用来设置CRC校验多项式,提高通信可靠性,大于1即可。

 

(四)SPI 发送/接收

通过官方提供的库函数可以看到,不管是通过SPI读数据还是写数据,它最终操作的都是SPI对应的数据寄存器的内存缓冲区。我们来看下面这张图

 通过官方手册可以了解到,一个数据寄存器区对应着两个数据缓存区,一个用于缓存发送数据,一个用于缓存接收数据。我们可以总结为如下图所示:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SPI通信协议 的相关文章

  • I2C总线和SPI总线

    I2C串行总线一般有两根信号线 xff0c 一根是双向的数据线SDA xff0c 另一根是时钟线SCL I2C协议 2条双向串行线 xff0c 一条数据线SDA xff0c 一条时钟线SCL SDA传输数据是 大端传输 xff08 字节高位
  • 蓝牙BLE---DA14683的SPI主机通信讲解

    DA14683的SPI主机通信例程 Date 2018 12 19 Create Jim 导入例程 首先导入ble peripheral例程或者pxp reporter例程 再到以下位置打开硬件SPI的宏定义 xff1a 获取SPI例程源码
  • spi通信

    特点 常规四线通信方式 一根片选线 xff0c 一根时钟线 xff0c 两根数据线 xff1a 一根是主进从出线 xff0c 一根主出从入线 同步 xff0c 全双工 xff0c 通信方式 和谁通信就将谁的片选线拉低 xff0c 每增加一个
  • 详解LVDS通信协议

    目录 LVDS概述LVDS接口电路的组成LVDS输出接口电路类型单路6位LVDS输出接口双路6位LVDS输出接口单路8位1TL输出接口双路8位1TL输出位接口 典型LVDS发送芯片介绍四通道LVDS发送芯片五通道LVDS发送芯片十通道LVD
  • Single SPI、Dual SPI、Qaud SPI

    博主目前已经用上了 QSPI
  • UART,SPI,IIC,RS232通信时序和规则

    一 UART 1 串口通信方式 2 串口通信步骤 注意 xff1a 串口协议规定 xff0c 闲置时必须是高电平 校验位 xff1a 是使用奇偶校验 停止位必须高电平 一个0和多个0区分是靠掐时间 异步通信 xff1a 时钟各不一样 二 I
  • RT-Thread记录(十六、SFUD组件 — SPI Flash的读写)

    从本文开始 测试学习一些 RT Thread 常用的组件与软件包 先从刚学完的 SPI 设备开始 目录 前言 一 SFUD 组件简介 1 1 基本简介 1 2 SFUD 对 Flash 的管理 二 SFUD 组件操作函数 2 1 初始化相关
  • 外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

    移动设备的广泛应用增加对移动过程中各种参数的检测需求 ADXL345三轴数字加速度计可以用来检测加速度 进而测量倾斜角度等 在这一篇中 我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现 1 功能概述 ADXL345是一款小而薄的
  • 西门子S7通信协议以及JAVA版的实现

    西门子S7协议实现 采用java的方式实现西门子S7协议 链接地址 iot communication github https github com xingshuangs iot communication gitee https gi
  • Linux SPI 总线 和设备驱动架构之三:SPI控制器驱动

    通过第一篇文章 我们已经知道 整个SPI驱动架构可以分为协议驱动 通用接口层和控制器驱动三大部分 其中 控制器驱动负责最底层的数据收发工作 为了完成数据收发工作 控制器驱动需要完成以下这些功能 1 申请必要的硬件资源 例如中断 DMA通道
  • RS485通信(Modbus)丢包解决经验(基于ARM/Linux和STM32平台)

    1 RS485通信属于半双工通信 即发送和接收不能同时进行 需要切换 一般定义一根GPIO做RTS切换 2 ARM Linux平台有Linux底层驱动做自动切换 比如应用程序发送完成后 一般会在底层驱动自动切换接收 3 但是STM32平台基
  • HTTPS 原理详解

    转自 https baijiahao baidu com s id 1570143475599137 wfr spider for pc 前言 HTTPS 全称 HyperText Transfer Protocol over Secure
  • usart和uart的主要区别

    USART 通用同步和异步收发器UART 通用异步收发器 当进行异步通信时 这两者是没有区别的 区别在于USART比UART多了同步通信功能 这个同步通信功能可以把USART当做SPI来用 比如用USART来驱动SPI设备 同步是指 发送方
  • SPI菊花链原理和配置

    一 概述 在一个主机和多个从器件的典型 SPI 系统中 通常采用专门的片选信号来寻址从器件 随着从器件数量不断增加 片选线也随之增多 这种情况将给电路板布板带来很大的挑战 一个布板方法就是采用菊链结构 本文详细讲述了 SPI 系统的菊链配置
  • spi,ClassLoader,双亲委托模式

    转载 https www cnblogs com hiyujie p wo xueJava1ClassLoader yu shuang qin wei tuo mo sh html 1 ClassLoader分类 Java虚拟机会创建三类C
  • Android-模块化通信-简单实用的android spi机制

    目录 前言 一 spi是什么 二 ServiceLoader 1 ExportTableLoader 2 ExportTable 3 LazyLoader 4 ServiceLoader 三 应用 四 总结 前言 为了实现Android 模
  • Arm 板上有两个以上的 SPI 设备,但只支持两个?

    我们其中一块板上的 Arm 处理器有一个 spi 端口 带有两条片选线 该处理器的数据表中提到它最多可以控制两个 spi 设备 是否可以使用 GPIO 作为附加 spi 设备的从选择 如何修改现有的库 设备驱动程序以支持此更改 到目前为止
  • 计算机网络中的通信子网主要有哪些功能?

    计算机网络中的通信子网主要具有以下功能 负责全网的数据通信 通信子网通过使用各种通信协议和传输控制功能 能够确保数据从一台主机安全 准确地传输到另一台主机 这包括数据的封装 解封装 传输控制 差错控制等过程 完成各种网络数据的处理 转换和交
  • 计算机网络中的通信子网:架构、协议与技术简介

    在计算机网络中 通信子网是负责实现主机之间以及主机与终端之间数据传输的核心部分 它由一系列硬件设备和通信协议组成 为上层应用提供可靠 高效和透明的数据传输服务 本文将详细介绍通信子网的架构 协议与技术 一 通信子网的架构 星型拓扑 星型拓扑
  • 是什么让 SPI 比 I2C 协议更快 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我了解 I2C 和 SPI 通信的基础知识 因为两者都是同步协议 我想知道是什么让 SPI 比 I2C 更快 如果我没记错的话 使用 I2

随机推荐