STM32——SPI通信协议以及软件读写

2024-08-22 14:28

本文主要是介绍STM32——SPI通信协议以及软件读写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、SPI协议

SPI相对于I2C传输速度更快;设计简单,通信协议使用硬件线比较多,有些资源浪费

以下设备需要进行共地,如果从机没有独立的供电源,主机需要给供电

SS线低电平有效,主机只能选择一个从机

推挽输出的高低电平均有高驱动能力,(I2C为防止电路短路采用开漏输出模式)

当某个从机未被选中时,它的MISO为高阻态,并不输出有用信息

首先由波特率发生器产生时钟上升下降沿

当主机中的数据是10101010,从机为01010101时,此时产生一个上升沿

此时MOSI通信线上为1,为高电平,MISO线为0,为下降沿,之后迎来一个下降沿时

主从机都会进行数据采样输入,如下所示:

同样的方式,直到第8个时钟之后:

以上是同时发送和接收

只有发送不想接收时,只读从机数据即可;只想接收不想发送,只看主机接收数据即可

之后是SPI时序条件:

上升沿时主机和从机分别移出数据最高位,下降沿时,主机移出的数据移入从机数据的最低位,从机的最高位移入主机数据的最低位。模式1与模式3的CPOL=1,SCK取反

MISO在SS为高电平是一直处于高阻态。以下和上述介绍的一样

除了以上模式外,还有提前半个相位的模式0,此时SCK的动作不一致,它需要在第0个边沿移出数据,然后移入等,相当于SS的下降沿也当为时钟的一部分,(这种模式使用更多)与模式2不同就是CPOL=1,SCL极性取反:

一些指令时序:

写使能指令,厂家定义0X06是写使能,由主机发送从机接收

高组态时没有规定为什么电平,因此这里设置为高电平

相当于主机发送0X06,从机发送0XFF(因为发送接收同时发生,如果是只发送,不管从机发送来的数据即可)

第二条指令:

首先发送写指令0X02

指定位置为24位,需要分成3个字节来构成,写指令之后的字节定义为地址高位,因此

0X12就是指定地址的23~16位

继续发送剩余字节 0X34、0X56,最终构成指定地址0X123456:

之后发送数据0X55:

以上表示在0X123456的地址写入0X55数据。

之后是:

先是读指令0X03

之后是地址与上边一样,之后读取数据,此次在MISO线上读取数据:

2、W25Q64芯片

数据掉电不丢失

Dual SPI表示厂商为不浪费资源,让MISO和MOSI同时收发数据相当于80MHz成为160MHz,可传输2位。实际上还是80MHz.

24位地址最大存储16M字节

上面有一杠表示低电平有效

之后是Flash一些操作事项:

掉电不丢失、容量大、成本低

在擦除后Flash显示为0XFF,此时为没有数据(擦除也算忙状态)

擦除时最小是一个扇区擦除(页>块>扇区)

之后是软件编程实现读写功能:

其中SPI需要完成封装、通信引脚初始化、起始、终止、交换字节

W25Q64需要完成写使能、擦除、页编程、读数据等

首先编写SPI协议代码:

对引脚进行初始化,输出(相对于主机)配置为推挽输出,输入(相对于主机)配置为上拉模式

因此主机有3条输出线,一条输入线

此时SS为高电平(无选择从机),SCL为低电平

之后为配置电平方便,将以上程序进行封装:

对SS进行写封装

SCL写封装

MOSI写封装

MISO读封装

之后是3个时序单元

起始条件:SS置低电平(由于引脚初始化时SS为高电平,这里可以直接置为低电平,不需要先置高电平再低电平)

终止条件:SS置高电平

交换一个字节:

对于硬件来说,由于存在移位寄存器,所以时钟的上升或者下降沿时,数据的移入或移出是同时发生的;

但是对于软件来说,程序是一条条执行,存在先后顺序,因此是时钟上升沿——移入数据,时钟下降沿——移出数据

通过掩码的方式取出数据指定一位

模式0就是相当于在第0个SCL电平变化时移出数据,第一个上升沿移入,第二个下降沿。

移出数据——上升沿——移入数据——下降沿

之后是W25Q64的代码:

主要分为初始化(调用MySPI初始化)、读ID号、写数据、是否忙状态、页编程、擦除、读数据

初始化:

1、读ID号:分为8位厂商ID和16位设备ID(高8位是寄存器类型,低8位是容量)

首先发送读ID的指令,不要接收的信息,没用;之后发送无意义信息为了接收到ID信息

第一次DID直接接收8位信息,第二次需要写成或等于防止高8位被覆盖。 

2、写使能

3、是否忙状态

4、页编程(输入为写入地址、数据、写入的数量)

起始条件——发送指令码02——发送3个字节地址(高8位,中间8位,低8位,Swap只接受8位数据)——发送数据组(最大发256个字节,超过将会覆盖从第一个开始)——停止条件——等待忙状态

5、擦除(输入一个地址)

一共有4种擦除,以扇区擦除为例:

起始——发送指令20——发送3个字节地址——停止——等待忙

6、读使能

起始——发送读取数据指令——3个字节地址——发送无用信息接收有用信息——停止

由于注意事项中写入之前要有写指令,因此在页编程和擦除前先加一个写使能!!!以及最后加一个是否忙状态(对应写入状态结束后,芯片进入忙状态),事后等待。

之后是实验结果:

1、输入01、02、03、04

2、只擦除不写入

此时读的数据就是擦除之后的结果,全为1,FF

3、验证只能1写0,不能0写1

先写入AA、BB、CC、DD(此时擦除开启)

之后关闭擦除功能,并写入55、66、77、88

可以看出写入的数据改变,读取的数据因为没有擦除功能后,只能1写0,不能0写1,因此读出的状态就由一开始的AA:10101010,到55:01010101,没有擦除就变成了00000000,即显示的结果。相当于读取的数据=写入的数据&原始数据(按位与)

4、写入不能跨页,读取可以跨页

之前知道页地址是从xxxx00到xxxxFF,因此将读、写地址直接改到FF时观察写入的数据能否到下一页写

此时写入01、02、03、04,读出来是01、FF、FF、FF

表明写入的01在地址FF,02由于不能跨页,因此又返回该页页首00;

不过读取可以跨页,剩余FF是第二页的数据,由于被擦除,所以都是FF

之后修改读取地址,从00开始读,写依然在FF开始写,可以看出此时06、07、08均在该页地址的00、01、02处,由于地址03为写入因此读取结果为FF

页编程的写入如下所示:写不能跨页!!!

之后学习SPI的硬件外设读写功能。

这篇关于STM32——SPI通信协议以及软件读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Ubuntu 怎么启用 Universe 和 Multiverse 软件源?

《Ubuntu怎么启用Universe和Multiverse软件源?》在Ubuntu中,软件源是用于获取和安装软件的服务器,通过设置和管理软件源,您可以确保系统能够从可靠的来源获取最新的软件... Ubuntu 是一款广受认可且声誉良好的开源操作系统,允许用户通过其庞大的软件包来定制和增强计算体验。这些软件

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank 正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD