stm32之SPI学习

发布者:Qingliu2022最新更新时间:2024-10-12 来源: elecfans关键字:stm32  SPI学习 手机看文章 扫描二维码
随时随地手机看文章

SPI应用是相当的广了,同步串行总线,同步同步当然需要时钟信号来统一了,这样通讯双方通讯时就比较默契没那么延迟了。应用于中低速场合。


学起来从哪些地方入手呢?如下:


SPI概念与特点:不多说,串行,需要同步信号   主从结构的   CS(片选)  SCK   SDI  SDO

全双工  一主控多从   8或16位数据通信

其它特点:8个主模式波特率预分频系数  fpcll/2

         主模式和从模式下快速通行  并支持切换

         编程MSB 或LSB在前

         专用发送和接受标志可促发中断

         有SPI忙标志位

         支持硬件CRC校验,发送模式下crc值作为最后一个字节被发送,接受模式下最后一字节自动CRC校验

         支持错误中断标志,支持DMA功能的1字节发送和接受缓冲器:产生发送和接受请求。

SPI总线时序介绍:

使用stm32  spi需要以下的步骤

1.管脚因为复用的,故先配置好管脚、并打开spi时钟

2.设置spi的工作模式

通过 SPI1_CR1 来设置,设置SPI1主机模式,设置数据格式8位,然后通过 CPOL 和 CPHA 位来设置 SCK时钟极性及采样方式。并设置 SPI1 的时钟频率(最大18Mhz),以及数据的格式(MSB 在前还是 LSB在前)。
3.使能SPI.

SPI固件库函数
踏踏实实搞清 stm32 SPI总线 基础和编程
下面是初始化,必须得结构体原型

typedef struct
{
  uint16_t SPI_Direction;//设置方向     (2线全双工、2线只接受、一线发送、一线接受)

  uint16_t SPI_Mode;     //模式         (从或主设备)

  uint16_t SPI_DataSize; //宽度         (8或16位)

  uint16_t SPI_CPOL;     //时钟极性     (低或高)

  uint16_t SPI_CPHA;     //时钟相位     (第一个或第二个跳变沿)

  uint16_t SPI_NSS;      //片选方式     (硬件或软件方式)

  uint16_t SPI_BaudRatePrescaler; //波特率预分频    (从2---256分频)  

  uint16_t SPI_FirstBit;  //最先发送的位            (最低位,还是最高位在先)        

  uint16_t SPI_CRCPolynomial; //设置crc多项式        (数字)如7

}SPI_InitTypeDef;

下面是实例,对SPI2进行的初始化

void SPI2_Init(void) 
{
 SPI_InitTypeDef  SPI_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
 
 //配置SPI2管脚
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14| GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 //SPI2配置选项
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);
   
 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial = 7;
 SPI_Init(SPI2, &SPI_InitStructure);

 //使能SPI2
 SPI_Cmd(SPI2, ENABLE);  
}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

以上是,初始化的一些函数,发现固件库还有很多函数没用上,下面就要谈到应用了

STM32的SPI串行外围总线接口,本程序,是将STM32的SPI配置为全双工模式,且NSS使用的软件模式。在使用SPI前,下面的这个过程我们必须理解,即STM32作为主机发送一个字节数据时,必然能接收到一个数据,至于数据是否处理,由程序操作。

● 全双工模式(BIDIMODE=0并且RXONLY=0) 

─  当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始; 

─  在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,

然后按顺序被串行地移位送到MOSI引脚上; 

─  与此同时,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器

中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。 

注意:也就是说,在主机模式下,发送和接收是同时进行的,所以我们发送了一个数据,也就能接收到一个数据。而STM32内部硬件是这个过程的支撑!


读一个字节,往里面发送0,外设就返回一个数据了,发送的0外设不处理(需要先写入命令生效)

#define SPI_ReadByte(SPIx) SPI_WriteByte(SPIx,0)

写一个字节就直接发送相应的字节,外设就返回一个数据了

u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 byte);

//spi 写一个字节...................................................................
u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)
{
 while((SPIx->SR&SPI_I2S_FLAG_TXE)==RESET);  //等待发送区空  
 SPIx->DR=Byte;   //发送一个byte  
 while((SPIx->SR&SPI_I2S_FLAG_RXNE)==RESET);//等待接收完一个byte 
 return SPIx->DR;          //返回收到的数据   
}


关键字:stm32  SPI学习 引用地址:stm32之SPI学习

上一篇:STM32 LwIP测试过程简介
下一篇:stm32中断分组学习

推荐阅读最新更新时间:2026-03-14 10:21

stm32SPI学习
SPI应用是相当的广了,同步串行总线,同步同步当然需要时钟信号来统一了,这样通讯双方通讯时就比较默契没那么延迟了。应用于中低速场合。 学起来从哪些地方入手呢?如下: SPI概念与特点:不多说,串行,需要同步信号 主从结构的 CS(片选) SCK SDI SDO 全双工 一主控多从 8或16位数据通信 其它特点:8个主模式波特率预分频系数 fpcll/2 主模式和从模式下快速通行 并支持切换 编程MSB 或LSB在前 专用发送和接受标志可促发中断 有SPI忙标志位 支持硬件CRC校验,发送模式下crc值作为最后一个字节被发送,接受模式下最后一字节自动CRC校验
[单片机]
STM32学习日志——SPI实验
一、简介 SPI是外围串行设备接口,主要应用于EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器。它是一种高速、全双工、同步的通信总线。它有四根线,MISO:主机输入从机输出 MOSI:主机输出从机输入 SCK:时钟线 CS:片选。 SPI内部结构简明图 从图中可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。主机寄存器通过MOSI将字节发送给从机,从机寄存器通过MISO发送给主机,这样两个移位寄存器的内容就被交换,外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节,如果只进行读操作,只需发送一个空字节0xff。 SP
[单片机]
<font color='red'>STM32</font><font color='red'>学习</font>日志——<font color='red'>SPI</font>实验
STM32学习笔记 | SPI通信异常分析
SPI,全称为 Serial Peripheral Interface(串行外设接口) ,是一种用于短距离通信的同步串行通信接口,主要应用在嵌入式系统。 SPI的应用场合很广,显示模组、时钟芯片、存储芯片、温度传感器等众多器件都有使用SPI接口通信。这些器件通常作为从设备,STM32作为主设备来控制它们。 STM32 SPI基础内容 绝大部分STM32芯片都有多个SPI外设,它可与外部SPI器件进行半双工/全双工同步串行通信。 1. SPI特性 三条线全双工、双线单工同步传输 支持 8 位或 16 位传输帧格式选择 支持主模式或从模式操作 可编程的时钟极性和相位 支持 MSB 或 LSB 数据顺序 支持DMA收
[单片机]
<font color='red'>STM32</font><font color='red'>学习</font>笔记 | <font color='red'>SPI</font>通信异常分析
STM32学习 -- 工程师眼中的SPI
简介: 前些天,有位网友谈到通过FPGA来实现SPI通讯。通过帖子的回复发现好多网友对SPI通讯还有些疑惑,于是今天就带着大家从SPI的标准协议,SPI在STM32单片机上的配置及在74HC595逻辑芯片通讯的实例来全方面认识一下这个既复杂又简单的通讯协议。 SPI 是Serial Peripheral Interface的缩写,直译为串行外围设备接口,SPI是Motorola公司推出的一种同步串行通讯方式,是一种四线同步总线,因其硬件功能很强,与SPI有关的软件就相当简单,使MCU有更多的时间处理其他事务。这里要说明一下,专利在电子行业还是很关键的,因此,部分其它厂商将SPI通讯协议更名以规避高昂的专利费,但其硬件处理方式是
[单片机]
<font color='red'>STM32</font>再<font color='red'>学习</font> -- 工程师眼中的<font color='red'>SPI</font>
STM32学习笔记——SPI介绍及配置
SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32 也有 SPI 接口。下面我们看看 SPI 的内部简明图(图 29.1.1): SPI 接口一般使用 4 条线通信: MISO
[单片机]
<font color='red'>STM32</font><font color='red'>学习</font>笔记——<font color='red'>SPI</font>介绍及配置
STM32学习------SPI笔记【寄存器版】
一、介绍 简述: 1)通常 SPI 通信要求 4 根线,分别是 MOSI(主机输出从机输入), MISO(主机输入从机输出), CLK(时钟线), CS(片选线) 2)当发送和接受数据的工作都准备好了,只要有时钟 CLK,就发送数据,没有时钟就不发送,而且一个时钟周期发送一位(bit)数据,所以发送数据的快慢由时钟频率来控制。 3)至于时钟和数据的相位没有特别严格的要求(而 IIC 中,数据的变化只能在 SCL 是低电平的时候发生), SPI数据的变化是一个时钟周期一次,这样的方法来传输数据就简单多了。我们可以根据需求对时钟的极性和相位做调整,看看是在时钟上升沿还是下降沿来发送数据,还有停止发送时时钟的极性,是保持高电平还是低电平
[单片机]
<font color='red'>STM32</font><font color='red'>学习</font>------<font color='red'>SPI</font>笔记【寄存器版】
嵌入式stm32学习SPI-读写串行FLASH
bsp_spi_flash.h #ifndef __SPI_FLASH_H #define __SPI_FLASH_H #include stm32f4xx.h #include stdio.h /* Private typedef -----------------------------------------------------------*/ //#define sFLASH_ID 0xEF3015 //W25X16 //#define sFLASH_ID 0xEF4015 //W25Q16 //#define sFLASH_ID
[单片机]
STM32 学习笔记--SPI通信配置
SPI时序 SPI时序图如下: STM32做为主机设计SPI时序一般选用CPOL=1/CPHA=1; SPI通信配置 1、时钟使能。GPIO时钟使能RCC- APB2ENR,SPI时钟使能RCC- APB2ENR设置。 (为什么还要连接GPIO时钟,参见STM32参考手册8.1.4节。手册上这么说的:对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。) 2、配置GPIO工作模式。配置GPIO片选,由软件管理(即自定义引脚),推挽输出,上拉; 配置SPI引脚SCK、MOSI、MISO所用到的引脚为复用功能;GPIOX- CR1 GPIOX- ODR; 3、SPI设置工作模式。通过配置SPIx- CR1来设置SPI
[单片机]
<font color='red'>STM32</font> <font color='red'>学习</font>笔记--<font color='red'>SPI</font>通信配置
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved