STM32的SPI接口详解

目录

1.SPI简介

2.SPI工作原理

3.SPI时序

3.1 CPOL(Clock Polarity,时钟极性):

3.2 CPHA(Clock Phase,时钟相位):

3.3  四种工作模式

4.相关代码

4.1使能片选信号

4.2使能通讯线

4.3初始化SPI

4.4设置SPI速度

4.5读写数据


1.SPI简介

STM32 的SPI(Serial Peripheral Interface)是一个串行外设接口,它允许STM32微控制器与其他设备(如传感器、存储器等)进行高速、全双工、同步的串行通信。通常包含SCK(串行时钟)、MOSI(主设备输出/从设备输入)、MISO(主设备输入/从设备输出)和NSS(片选信号)这4条线,支持多个从设备连接到一个主设备上。

2.SPI工作原理

MISO   主设备数据输入,从设备数据输出。
MOSI   主设备数据输出,从设备数据输入。
SCLK   时钟信号,由主设备产生。
CS       从设备片选信号,由主设备控制。

主机和从机都存在一个移位寄存器,主机将要传输的数据保存到移位寄存器上,然后通过MOSI发送到从机的移位寄存器上,从机同时也将自己移位寄存器保存的数据通过MISO发送到主机的移位寄存器中,这样就完成了一次主机和从机的数据交换,如果是进行写操作,主机只要无视从机返回的数据就可以了,如果是进行读操作,那么主机就要发送对应字节的空字节来推动从机的数据传输

3.SPI时序

SPI通过CS片选设备以后开启数据传输,数据传输根据主机CPHA(Clock Phase,时钟相位)和CPOL(Clock Polarity,时钟极性)配置的不同衍生出了不同的工作模式。

3.1 CPOL(Clock Polarity,时钟极性):

CPOL决定了SPI通信中空闲状态的时钟电平。

当CPOL=0时,空闲状态下SCK(Serial Clock,串行时钟)为低电平。
当CPOL=1时,空闲状态下SCK为高电平。

3.2 CPHA(Clock Phase,时钟相位):

CPHA决定了数据是在SCK的第一个边沿还是第二个边沿被采样。

当CPHA=0时,数据在SCK的第一个边沿被采样(对于MOSI是上升沿,对于MISO可能是下降沿,取决于具体实现)。
当CPHA=1时,数据在SCK的第二个边沿被采样(对于MOSI是下降沿,对于MISO可能是上升沿)。

CPHA的选择影响数据传输的时序和稳定性。

3.3  四种工作模式

通过CPOL和CPHA的不同值组合,可以实现SPI的四种模式:

模式1 (CPOL=0, CPHA=0):空闲时SCK为低电平,数据在SCK的第一个上升沿被主设备发送,并在第一个下降沿被从设备接收。
模式2 (CPOL=0, CPHA=1):空闲时SCK为低电平,数据在SCK的第二个上升沿被采样。
模式3 (CPOL=1, CPHA=0):空闲时SCK为高电平,数据在SCK的第一个下降沿被主设备发送,并在第一个上升沿被从设备接收。
模式4 (CPOL=1, CPHA=1):空闲时SCK为高电平,数据在SCK的第二个下降沿被采样。

4.相关代码

本文基于STM32F429的HAL库为例讲解一下相关代码。

4.1使能片选信号

#define	W25QXX_CS 		PFout(6)  		//W25QXX的片选信号GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOF_CLK_ENABLE();           //使能GPIOF时钟//PF6
GPIO_Initure.Pin=GPIO_PIN_6;            //PF6
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速         
HAL_GPIO_Init(GPIOF,&GPIO_Initure);     //初始化W25QXX_CS=1;			                //SPI 不选中

使能GPIO_PF6为SPI的片选信号,默认拉高不选中。

4.2使能通讯线

 GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOF_CLK_ENABLE();       //使能GPIOF时钟__HAL_RCC_SPI5_CLK_ENABLE();        //使能SPI5时钟//PF7,8,9GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉GPIO_Initure.Speed=GPIO_SPEED_FAST;             //快速            GPIO_Initure.Alternate=GPIO_AF5_SPI5;           //复用为SPI5HAL_GPIO_Init(GPIOF,&GPIO_Initure);

使能SPI5,GPIO_F7/F8/F9推挽输出,默认上拉,快速,复用为SPI5。

4.3初始化SPI

void SPI5_Init(void)
{SPI5_Handler.Instance=SPI5;                         //SP5SPI5_Handler.Init.Mode=SPI_MODE_MASTER;             //设置SPI工作模式,设置为主模式SPI5_Handler.Init.Direction=SPI_DIRECTION_2LINES;   //设置SPI单向或者双向的数据模式:SPI设置为双线模式SPI5_Handler.Init.DataSize=SPI_DATASIZE_8BIT;       //设置SPI的数据大小:SPI发送接收8位帧结构SPI5_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH;    //串行同步时钟的空闲状态为高电平SPI5_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;         //串行同步时钟的第二个跳变沿(上升或下降)数据被采样SPI5_Handler.Init.NSS=SPI_NSS_SOFT;                 //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI5_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256SPI5_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI5_Handler.Init.TIMode=SPI_TIMODE_DISABLE;        //关闭TI模式SPI5_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验SPI5_Handler.Init.CRCPolynomial=7;                  //CRC值计算的多项式HAL_SPI_Init(&SPI5_Handler);//初始化__HAL_SPI_ENABLE(&SPI5_Handler);                    //使能SPI5SPI5_ReadWriteByte(0Xff);                           //启动传输
}

设置SPI为主机工作模式,双线模式,空闲状态为高电平,数据为8位帧结构,二个跳变沿(上升或下降)数据被采样,片选信号由软件控制,数据传输从MSB位开始,关闭硬件CRC校验,最后启动传输。

我们把 SPI5 的频率设置成了最低的256 分频,后面我们可以随时通过函数 SPI5_SetSpeed 来设置 SPI5 的速度。

4.4设置SPI速度

void SPI5_SetSpeed(u8 SPI_BaudRatePrescaler)
{assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性__HAL_SPI_DISABLE(&SPI5_Handler);            //关闭SPISPI5_Handler.Instance->CR1&=0XFFC7;          //位3-5清零,用来设置波特率SPI5_Handler.Instance->CR1|=SPI_BaudRatePrescaler;//设置SPI速度__HAL_SPI_ENABLE(&SPI5_Handler);             //使能SPI}

SPI_BaudRatePrescaler 可以设置 2/4/8/16/32/64/128/256分频,例如STM32F429的APB1为90MHz,设置2分频就是45MHz。

4.5读写数据

void read(){W25QXX_CS=0;//拉低片选信号      SPI5_ReadWriteByte(0XFF);W25QXX_CS=1; //拉高片选信号      
}u8 SPI5_ReadWriteByte(u8 TxData)
{u8 Rxdata;HAL_SPI_TransmitReceive(&SPI5_Handler,&TxData,&Rxdata,1, 1000);       return Rxdata;          		    //返回收到的数据		
}

读写数据都是用SPI5_ReadWriteByte这个函数,不同的是,如果是写入数据,不用管接收到的从机数据是什么,如果是读取数据,则可以发送0XFF,读取从机返回的对应数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

收银系统源代码-收银端UI风格

智慧新零售收银系统是一套线下线上一体化收银系统,给商户提供含线下收银称重、线上商城、精细化会员管理、ERP进销存、丰富营销活动、移动店务助手等一体化的解决方案。 如Windows版收银(exe安装包)、安卓版收银(apk安装包&#…

什么是 YAML?了解 YAML 语法与最佳实践

什么是 YAML YAML 是 "YAML Aint Markup Language" 的缩写,这是一种用于数据序列化的基于文本的标记语言。 YAML 的用途 YAML (YAML Aint Markup Language) 是一种人类可读的数据序列化格式,主要用于以下目的: 作为配置文件格式…

C++:C++入门基础|命名空间|输入输出

欢迎来到HarperLee的学习笔记! 博主主页传送门: HarperLee的博客主页! 想要一起进步的uu来后台哦! 一、什么是C? 在此之前,我们所学习的C语言是一种结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题&a…

25.无源蜂鸣器驱动设计

相对于有源蜂鸣器,无源蜂鸣器的成本更低,声音频率可控。而有源蜂鸣器因其内部 自带振荡源,只要加上适当的直流电源即可发声,程序控制较为方便。 (1)设计定义:设计一个无源蜂鸣器的驱动程序&…

二阶线性微分方程

假设一个质量 m 连接在弹簧和阻尼器上,系统受到外力 F(t) 的作用。设 x(t) 为质量的位移,系统的运动方程可以用牛顿第二定律表示为: 这是一个典型的二阶线性非齐次微分方程:其中: m 是质量(Fma&#xff09…

蓝桥杯备赛攻略(怒刷5个月拿省一)

十五届蓝桥杯结束,up也在这次比赛中获得了不错的成绩,为了帮助大家在25年蓝桥杯上获得好的成绩,我将根据今年的经验写一份蓝桥杯的备赛攻略,希望能帮到大家。 参赛准备 蓝桥杯算法赛必须指定一个编程语言赛道报名,也就…

Access系统开发必备技巧:轻松调整应用程序标题,提升用户体验!

Hi~ 大家好久不见呀! 一直忙,但不知道在忙啥,好多事情都落下了,ERP的文章最近也没有时间更新,接下去我还在考虑弄个直播,不知道大家有没有什么想了解的,大家给我留言,直播的时候给…

vue学习day02-Vue指令-v-html、v-show与v-if、v-else与v-else-if、v-on、v-bind、v-for、v-model

6、Vue指令 指令:带有v-前缀的特殊标签属性 (1)v-html 作用:设置元素的innerHTML 语法:v-html“表达式” 示例: 提供一个地址,这里是百度的地址,通过v-html渲染 结果&#xff…

怎么将图片旋转30度?旋转图片的几种方法推荐

怎么将图片旋转30度?在创作过程中,我们常常需要处理图片的镜像效果,确保其视觉效果和构图都达到最佳状态。镜像效果的合理运用不仅可以解决视觉单调的问题,还能在艺术作品中吸引观者的注意力。此外,镜像可以有效地调整…

大数据之Hadoop平台的搭建

实验环境 三台虚拟机 master slave1 slave2 服务器集群单节点,机器最低配置:双核 CPU、8GB 内存、100G 硬盘运行环境CentOS 7.4服务和组件服务和组件根据实验需求安装 1实验过程 1.1实验任务一:配置 Linux 系统基础环境 1.1.1步骤一&a…

Cesium版本升级webgl问题,glsl代码关键字修改

简介 Cesium 从1.102.0 开始,Cesium 默认使用 WebGL2 上下文。一些webgl特效代码在webgl1中支持,但是在版本升级后,运行会报各种glsl代码错误。现在有两种解决方案。详细办法描述如下所示。 1、修改配置使用WebGL1 地球初始化配置如下&…

wordpress外贸建站公司案例英文模板

Indirect Trade WP外贸网站模板 WordPress Indirect Trade外贸网站模板,建外贸独立站用wordpress模板,快速搭建十分便捷。 衣物清洁wordpress独立站模板 洗衣粉、洗衣液、衣物柔顺剂、干洗剂、衣领净、洗衣皂等衣物清洁wordpress独立站模板。 家具wordpr…

可以拖拽的富文本编辑器(VueDragResize,quill-editor)

该功能实现一个帮助文档的展示和编辑功能,默认进去只能查看帮助文档的内容,点击编辑可以进行富文本编辑器的编辑功能。 出现的问题1.如何隐藏富文本编辑的工具栏并且禁止编辑 //隐藏工具栏this.toolbar this.$refs.myTextEditor.quill.getModule(toolb…

【算法】代码随想录之数组(更新中)

文章目录 前言 一、二分查找法(LeetCode--704) 二、移除元素(LeetCode--27) 前言 跟随代码随想录,学习数组相关的算法题目,记录学习过程中的tips。 一、二分查找法(LeetCode--704&#xff0…

Spring系统学习 - AOP之基于注解的AOP和XML的AOP

上一篇我们围绕了AOP中代理模式的使用,这篇我们将主要围绕AOP的相关术语介绍,以及重点围绕基于注解的AOP进行相关知识的概述和使用说明。 AOP的相关术语 切面(Aspect):切面是一个模块化的横切关注点,它包含…

ASP.NET MVC Lock锁的测试

思路:我们让后台Thread.Sleep一段时间,来模拟一个耗时操作,而这个时间可以由前台提供。 我们开启两个或以上的页面,第一个耗时5秒(提交5000),第二个耗时1秒(提交1000)。 期望的测试结果: 不加Lock锁&…

192.168.1.1路由器管理系统使用教程

节选自:192.168.1.1路由器管理系统-厂商有哪些-如何使用-无法登录原因-苏州稳联 什么是 192.168.1.1 路由器管理系统? 192.168.1.1 是大多数家庭路由器的默认 IP 地址,用于访问路由器的管理控制台。通过这个管理系统,用户可以配…

【多媒体】Java实现MP4和MP3音视频播放器【JavaFX】【更多功能的播放器】【音视频播放】

在Java中播放视频可以使用多种方案,最常见的是通过Swing组件JFrame和JLabel来嵌入JMF(Java Media Framework)或Xuggler。不过,JMF已经不再被推荐使用,而Xuggler是基于DirectX的,不适用于跨平台。而且上述方案都需要使用第三方库。…

websockt初始化,创建一个webSocket示例

写文思路: 以下主要从几个方面着手写websocket相关,包括以下:什么是webSocket,webSocket的优点和劣势,webSocket工作原理,webSocket握手示例,如何使用webSocket(使用webSocket的一个示例)&#…

2024中国大学专业排名:生态、地理、草业、林学、资环

生态学、林学、地理科学、草业科学、农业资源与环境、大气科学、农学、地球化学、水土保持与荒漠化防治、自然地理与资源环境、地理信息科学、应用气象学共12个专业。 一、生态学 二、林学 三、地理科学 四、草业科学 五、农业资源与环境 六、大气科学 七、农学 八、地球化学 九…