SPI通信

article/2025/9/21 12:57:56

1 SPI的简介及基本特点


1 SPI的简单介绍

最近工作中使用了SPI通信方式来做TM4C129和STM32之间的通信,为了更好地解决问题就学习了SPI原理的相关内容,完成了项目之后,也对这种通信方式有了较为深入的了解,现在来对SPI的使用方法进行详细的总结。 
SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO; SPI 接口主要应用在 EEPROM, FLASH,实时时钟, AD 转换器,还有数字信号处理器和数字信号解码器之间。 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议. 下图为SPI 的内部简明图: 
SPI内部结构图

SPI全双工的特点:一边发送一边接收,硬件上只有一个SPI_DR寄存器和两个缓冲器(发送缓冲器和接收缓冲器),主模式:SPI_DR会先从发送缓冲器读出数据,然后通过MOSI引脚一位一位地将数据发出去,在发送的过程中,SPI_DR的数据会左移(如果是高位先发送),并且会从MISO引脚读入数据填补SPI_DR左移后的空缺。传输8比特数据后,SPI_DR再把数据并行写入接收缓冲寄存器。


2 SPI的通信接口

MISO :主设备数据输入,从设备数据输出。
MOSI :主设备数据输出,从设备数据输入。
SCLK : 时钟信号,由主设备产生。
CS   : 从设备片选信号,由主设备控制。当从设备的片选被拉低的时候,才能从SPI总线上获取数据信息。
这里需要知道的地方是,根据SPI被配置成主或者从模式,MIMO和MOSI引脚的功能会自动改变,实现发送和接收的切换。 

3 SPI 主要特点:

 - 1.可以同时发出和接收串行数据; - 2.可以当作主机或从机工作;主机发送时钟频率可编程控制; - 3.有发送结束中断标志; - 4.写冲突保护; - 5.总线竞争保护;

2 SPI的四种工作方式

SPI 总线根据时钟极性和时钟相位的不同有四种工作方式 ,根据我们所需要通信的外设工作要求的不同,给SPI控制器配置为不同的工作模式,以满足 
1. 时钟极性( CPOL) : 
如果 CPOL=0,串行同步时钟的空闲状态为低电平。 
如果 CPOL=1,串行同步时钟的空闲状态为高电平。 
时钟极性对传输协议没有重大影响,只是规定了串行同步时钟在空闲时的电平为高还是为低。 
2. 时钟相位( CPHA) : 
如果 CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样。 
如果 CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。 
时钟相位主要是在设置数据在什么时候改变和什么时候被采样。

注意:在配置SPI模块时,SPI 主机和与之通信的外设备时钟相位和极性应该一致。 
SPI的工作方式

注意: 
1. 如果时钟相位为0,则主从都需要在第一个时钟沿跳边之前将需要发送的数据准备好并上线。在第一个时钟沿来临的时候进行数据采样。 
2. 如果时钟相位为1,则主从都在第一个时钟沿到来的时候开始准备数据并上线,等待第二个时钟沿来临的时候对数据进行采样。 
3. 如果主从双方的时钟极性和相位不同,则会出现数据移位错误的问题。SPI通信方式中要求从器件先工作,然后主器件才开始发送数据,否则可能发生数据传输错误,而且之后的数据都会出错。


SPI的参数设置

GPIO_InitTypeDef GPIO_InitStructure; 
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA| 
RCC_APB2Periph_SPI1, ENABLE ); //GPIO,SPI 时钟使能

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); 
//①初始化 GPIO 
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
//设置 SPI 全双工 
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 
//设置 SPI 工作模式:设置为主 SPI 
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 8 位帧结构 
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; 
//选择了串行时钟的稳态:时钟悬空高 
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿 
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号由软件管理 
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 
//预分频 256 
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始 
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式 
SPI_Init(SPI1, &SPI_InitStructure); 
//②根据指定的参数初始化外设 SPIx 寄存器 
SPI_Cmd(SPI1, ENABLE); / /③使能 SPI 外设 
SPI1_ReadWriteByte(0xff); / /④启动传输

连续和非连续传输:当在主模式下发送数据时,如果软件足够快,能够在检测到每次TXE的上升沿(或者TXE中断),并立即在正在进行的传输结束之前写入SPI_DR寄存器,则能够实现连续的通信;此时,在每个数据项的传输之间的SPI时钟保持连续,同时BSY位不会被清除。如果软件不够快,则会导致不连续的通信,这时状态位在每个数据传输之间会被清除。 
为了达到最大通信速度,需要及时的往SPI发送缓冲器填充数据,同样接收缓冲器中的数据也必须及时读走以防止溢出。为了方便高速率的数据传输,SPI实现了一种采用简单的请求、应答的DMA机制。 
直接存储器存取,DMA是计算机科学中的一种内存访问技术。他允许某些电脑内部的硬件子系统,可以独立的直接读写系统存储器,而不需要绕道CPU,在同等程度的CPU负担下,DMA是一种快速的数据传送方式。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU的大量中断请求。

SPI的状态标志

状态标志: 
应用程序可以通过三个状态标志可以完全监控SPI总线的状态。 
发送缓冲器空闲标志(TXE) 
此标志为1时表明发送缓冲器为空,可以写入下一个待发送的数据进入缓冲器。当写入发送寄存器SPI_DR时,TXE被清除。 
接收缓冲器为非空(RXNE) 
此标志为1时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。 
忙(BUSY)标志 
BSY标志由硬件设置与清除(写入此位无效果),此标志表明SPI通信层的状态,当被设置为1时,说明SPI正在忙于通信,但有一个例外:在主模式的双线接收模式下,(MSTR=1),BDM=1,并且BDOE=0,在接收期间BSY标志保持为低。 
在软件要关闭SPI模式并进入停机模式之前,可以使用BSY标志检测传输是否结束,这样可以避免破坏最后一次传输,因此需要严格按照下述过程执行。 
BSY标志还可以用于在多主系统中避免写冲突。

SPI的应用总结

使用总结: 
1.在使用SPI通信的时候首先要确定引脚对接正确;主器件和从器件的MISO,MOSI,CLK连在一起。CS引脚根据采用软件和硬件NSS来确定。如果有多个器件公用一个SPI则必须采用分时复用的方法,通过片选控制。 
2.注意SPI通信主从机的时钟极性和时钟相位须一致。 
3.使用合适的SPI通信速率,不要超过从设备的最大通信速率。 
4.NSS引脚一定要接,保证被硬件或者软件控制,否则可能会出现误码。 
5.建议在主设备发送时钟之前使能SPI从设备,否则可能会发生意外的数据传输。在通信时钟的第一个边沿到来之前或者正在进行的通信结束之前,从设备IDE数据寄存器必须就绪。在使能从设备和主设备之前,通信时钟的极性必须处于稳定的数值。 
6.使用STM32向SPI总线写数据时要注意检查:1.发送缓冲器是否空闲。2.SPI总线是否忙,否则可能会发送乱码。关闭SPI之前也要检查总线是否为忙,否则会破坏最后一次SPI传输。

SPI的常见错误以及解决办法

这里写图片描述 
这里写图片描述 
这里写图片描述

还有溢出错误和移位错误和其它的一些错误可以在下面的网页中找到。

http://www.dzsc.com/data/html/2011-3-25/89304.html

里面介绍的很详细。


http://chatgpt.dhexx.cn/article/Itvm8500.shtml

相关文章

详解SPI通信协议

一、SPI简介 SPI,即Serial Peripheral Interface的英文缩写。从字面意思看就是串行外部设备接口,是一种全双工、高速、同步的通信总线。 SPI最早是摩托罗拉公司开发的全双工同步串行总线,用于微控制器(MCU)连接外部设…

stm32中常见的通信协议之SPI

目录 1.SPI总线2.SPI的寻址方式3.SPI的工作原理总结4.SPI的通讯过程5.SPI的极性和相位6.IIC和SPI的异同7.stm32中SPI配置中常用的寄存器8.stm32中相关库函数 1.SPI总线 SPI是串行外设接口的缩写,SPI是一种高速的、全双工、同步的串行通信协议;SPI采用主…

【通信协议】一文搞懂SPI

SPI总线简介 SPI(Serial Peripheral Interface)是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。 接口定义 SPI接口共有4根信号线,分别是:片选信号、时钟信号、串行输出信号、串行…

SPI 通信协议 最详细解读!!!

SPI(Serial Peripheral Interface,串行外围接口)是一种高速、全双工、同步的通信总线,主要应用在EEPROM、FLASH、实时时钟、AD转换器上,以及数字信号处理器和数字信号解码器之间。 信号线 SPI有四根信号线:…

SPI 通信协议详解

SPI通信协议详解 写在最前: 本文讲述了SPI通信协议的基本内容包括如下 SPI的基础知识SPI的读写时序 本文重点参考 英文维基百科 中文维基百科 百度百科 注意: 倘若读者有足够的耐心和英文水平,强烈建议自行去英文维基百科去阅读相关知识。 相关链接: SPI…

通信协议篇——SPI通信

通信协议篇——SPI通信 1.简介 SPI(Serial Peripheral Interface)是一种高速、同步、全双工串行通信总线,采用主从机通信模式,主要应用在EEPROM,FLASH,实时时钟,AD转换器等。 2.原理 通信方…

SPI接口通信协议详解:SPI时序、2线、3线、4线SPI及4种常用工作模式

简介 SPI通信原理比I2C要简单,它主要是主从方式通信。这种模式通常只有一个主机和一个或者多个从机,标准的SPI是4根线,分别是SSEL(片选,也写作 SCS)、SCLK(时钟,也写作SCK)、MOSI(主机输出从机输入Master Output/Slav…

详解UART、I2C、SPI常用通信协议(全是细节)

前言 UART、I2C和SPI是我们在嵌入式开发中比较常见的通信协议了,没有最好的通信协议,每个通信协议都有自己的优缺点。如果想要通信速度快,SPI 将是理想的选择;如果用户想要连接多个设备而不是过于复杂,I2C 将是理想的选…

【总线】SPI 通信协议

目录 SPI总线协议概述 串行与并行通信 SPI通信介绍 SPI的工作原理 时钟 从属选择 多个从机 常规方法 菊花链方法 MOSI 和 MISO SPI 数据传输的步骤 SPI 的优缺点 优点 缺点 文章参考 SPI总线协议概述 SPI是许多不同设备使用的通用通信协议。例如,SD卡…

SPI通信协议详解,一篇就够!

一、什么是SPI? SPI 的英文全称为 Serial Peripheral Interface,顾名思义为串行外设接口。SPI 是一种同步串行通信接口规范,主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发,后发展成了行业规范。 …

2021年游戏项目的十大编程语言:C++、Java、C#均上榜

在这个技术驱动的世界里,游戏行业是全球增长最快的行业之一。在每一款华丽精美的电子游戏背后,都有一种编程语言,为用户提供优质的体验。游戏开发者利用顶级的编程语言来构建游戏。不同的游戏项目使用了不同的编程语言,这取决于游…

2021 编程语言排行榜

点击“终码一生”,关注,置顶公众号 每日技术干货,第一时间送达! IEEE Spectrum 发布了 2021 年编程语言排行榜,官方的标题是:Python 在新技术领域依然是主导地位。 Python 近几年随着大数据、数据挖掘、人…

2020 年最牛逼的 10 门编程语言

先看再点赞,给自己一点思考的时间,微信搜索【沉默王二】关注这个有颜值却假装靠才华苟且的程序员。 本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题。 对于很多初学编程的人来说,尤其是马上要入…

世界上到底有多少种编程语言?

最近,网站上看到一个很有意思的问题:世界上到底有多少种编程语言? 查遍网络之后,仍然没有找到准确答案,只知道几千的数量是有的,但是我们常用的也就几十来个,其中最常见的便是Java、Python、C、…

世界上最难的5种编程语言

世界上最难的5种编程语言 每个程序员都熟悉许多编程语言。许多编程语言都是高级的,它们的语法是人类可读的。然而,也有一些低级语言,对于一个人来说,读起来很困难,但是可以理解。然而,您是否遇到过一种既不…

2018年最流行的十大编程语言,有你用的吗?

对于编程界的初学者来说,最大的困难是决定从何处入手,或者应掌握哪种语言才能在职场上平步青云。有时,专业程序员也面临学习一门新语言似乎更卓有成效的情形。 无论是什么原因,下面列出了世界上最流行的编程语言,以便了…

5月编程排行榜出炉,最佳编程语言是谁?

技术的发展日新月异,作为开发者,应该时刻关注这些变化,不断学习才能跟上时代步伐。 编程语言层出不穷,关于“ 最佳编程语言 ”的争论也从未停止,网友们各抒己见...... 网友A: 人生苦短,我选Pyt…

十大热门编程语言的介绍

小编给大家分享一篇关于现阶段十大热门编程语言的文章:经过流行的搜索引擎,如谷歌,必应,雅虎,维基百科,亚马逊,YouTube和百度,用于计算评级;得出十大热门编程语言排行榜的…

GitHub2022年十大热门编程语言榜单

全球知名代码托管平台 GitHub发布的2022年GitHub Octoverse年度报告公布了全球最流行的十大编程语言,其中JavaScript蝉联第一,Python位列次席。 编程是技术革新的核心,对于所有的编程开发人员来说,对世界范围内编程语言发展和趋势…

2021年十大热门编程语言

几乎可以肯定,每个人都知道,在当今数字先进的世界中,技术是如何快速变化的。经常通过定期更新和改进来观察替代技术之间的相互超越已成为一种正常现象。在这一切之中,一个领域因技术世界的如此多变的性质而受到很大的影响&#xf…