【嵌入式学习笔记】嵌入式入门8——SPI总线协议

news2024/9/21 13:51:49

1.SPI介绍

SPI:串行外设设备接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。主要应用在存储芯片、AD转换器以及LCD中。
【注:IIC是电平协议,SPI是边沿协议】
在这里插入图片描述
在这里插入图片描述

1.1.SPI框图(以F1/F4为例,主机模式)

在这里插入图片描述

  • SPI外设对应的引脚
    STM32芯片有多个SPI外设,每个SPI外设输出的信号会到不同的GPIO口。STM32F1有三个SPI。F4 / F7 / H7 系列芯片SPI外设都有6个,分别为SPI1、SPI2、SPI3、SPI4、SPI5和SPI6。不同系列的SPI外设用到的引脚是不一样的,具体可以查看芯片的datasheet。

  • SPI发送与接收流程
    主机只向从机进行写操作,可以忽略接收到的从机数据。
    主机要对从机进行读操作,需要发送一个空数据来引发从机发送数据。

在这里插入图片描述
在这里插入图片描述

1.2.SPI的工作模式

  • 时钟极性(CPOL):没有数据传输时时钟线的空闲状态电平
    0:SCK在空闲状态保持低电平
    1:SCK在空闲状态保持高电平
  • 时钟相位(CPHA):时钟线在第几个时钟边沿采样数据
    0:SCK的第一(奇数)边沿进行数据位采样,数据在第一个时钟边沿被锁存
    1:SCK的第二(偶数)边沿进行数据位采样,数据在第二个时钟边沿被锁存

在这里插入图片描述

  • 模式0:CPOL=0,CPHA=0,低电平奇数边沿
    在这里插入图片描述

  • 模式1:CPOL=0,CPHA=1,低电平偶数边沿
    在这里插入图片描述

  • 模式2:CPOL=1,CPHA=0,高电平奇数边沿
    在这里插入图片描述

  • 模式3:CPOL=1,CPHA=1,高电平偶数边沿
    在这里插入图片描述

1.3.SPI相关寄存器介绍(F1/F4/F7)

  • SPI控制寄存器1
    用于配置SPI工作参数:SPI模式、SPI方向、NSS、数据帧、CPOL、CPHA、波特率、帧格式等
    在这里插入图片描述

  • SPI状态寄存器
    用于查询当前SPI传输状态(TXE、RXNE)
    在这里插入图片描述

  • SPI数据寄存器
    用于存放待发送数据或接收数据,有两个缓冲区(TX/RX)
    在这里插入图片描述

1.4.SPI配置步骤(F1/F4/F7)

  • 配置SPI工作参数:HAL_SPI_Init()
  • SPI的MSP初始化:HAL_SPI_MspInit(),配置NVIC、CLOCK、GPIO等
  • 使能SPI:__HAL_SPI_ENABLE
  • SPI传输数据:HAL_SPI_Transmit 发送数据、HAL_SPI_Receive 接收数据、HAL_SPI_TransmitReceive 进行发送与接收
  • 设置SPI传输速度(可选):操作SPI_CR1寄存器中的波特率控制位
    在这里插入图片描述
  • 关键结构体
typedef struct 
{ 
	uint32_t Mode				/* SPI模式(主机)  */
	uint32_t Direction			/* 工作方式(全双工) */
	uint32_t DataSize			/* 帧格式(8位) */
	uint32_t CLKPolarity		/* 时钟极性(CPOL = 0) */
	uint32_t CLKPhase			/* 时钟相位 (CPHA = 0)*/
	uint32_t NSS				/* SS控制方式(软件) */
	uint32_t BaudRatePrescaler	/* SPI波特率预分频值 */
	uint32_t FirstBit			/* 数据传输顺序(MSB)*/
	uint32_t TIMode				/* 帧格式:Motorola / TI  */
	uint32_t CRCCalculation		/* 设置硬件CRC校验 */
	uint32_t CRCPolynomial		/*  设置CRC校验多项式 */}SPI_InitTypeDef;
//(对于F7/H7来说,还有一些附加功能相关成员(NSS/CRC/IOSwap))

2.NOR FLASH介绍

2.1.FLASH简介

  • FLASH是常用的储存器件,它具有容量大,可重复擦写、按“扇区/块”擦除、掉电后数据可继续保存的特性,属于EEPROM
  • FLASH是有一个物理特性:写数据前需要擦除写操作,1->0,擦除0->1
  • FLASH主要有NOR Flash和NAND Flash两种类型,NOR和NAND是两种数字门电路

【注意:NAND和NOR的0地址是不冲突的,NOR占用BANK地址,而NAND不占用BANK地址,它的0地址是内部的】

在这里插入图片描述

2.2.NOR FLASH举例——NM25Q128

NM25Q128,串行闪存器件,属于NOR FLASH,容量为128 Mb。擦写周期可达10W次,可以将数据保存达20年之久。
SPI数据传输时序:支持模式0(CPOL = 0 , CPHA = 0)和模式3(CPOL = 1, CPHA = 1)
数据格式:数据长度8位大小,先发高位,再发低位
传输速度:支持标准模式104M bit/s
在这里插入图片描述
在这里插入图片描述
寻址范围:0x00000000-0x00FFFFFF
读:任意读
写:页内写、页间写(擦除/不擦除)
擦:片擦、块擦、扇擦…

  • 常用指令及时序

2.3.NOR Flash工作时序(NM25Q128)

NOR FLASH的指令总数比较多, 但是如果只需要实现基本操作, 还是比较简单的。一般我们只需要:5条指令即可完成对NOR FLASH的基本使用(以NM25Q128为例)
在这里插入图片描述

  • 写使能 Write Enable (06H)
    在这里插入图片描述

  • 读状态寄存器Read Status Reg1(05H)
    在这里插入图片描述

  • 读时序 Read Data Bytes(03H)
    在这里插入图片描述

  • 页写时序 PageProgram (02H)
    在这里插入图片描述

  • 扇区擦除时序 Sector Erase(20H)
    在这里插入图片描述

  • NM25Q128的状态寄存器
    在这里插入图片描述
    BUSY位:指示当前状态。 0:空闲状态(硬件自动清除) 1:当前处于忙碌状态
    WEL位 :执行WriteEnable指令该位为1,可以页写/扇区or块or片擦除/写状态寄存器。0:写禁止,不能页编程/扇区or块or片擦除/写状态寄存器

2.4.NOR FLASH驱动步骤(NM25Q128)

  • 初始化片选引脚与SPI接口:相关GPIO初始化、SPI初始化(模式、位数、分频、MSB等)
  • NM25Q128 读取:0x03指令 + 24位地址 + 读取数据
  • NM25Q128 扇区擦除:0x06指令 + 等待空闲 + 0x20指令 + 24位地址 + 等待空闲
  • NM25Q128 写入:擦除扇区(可选)+ 0x06指令 + 0x02指令 + 24位地址 + 写入数据 + 等待空闲

NOR FLASH驱动核心在写数据,写数据需要注意:

  1. 是否需要擦除?
  2. 写入数据(是否需要换页?是否需要换扇区?)
  3. 遵循:读、改、写 的原则

3.STM32使用SPI协议驱动NM25Q128实验

在这里插入图片描述
【代码暂不贴出】

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

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

相关文章

WX1860- ngbe-1.2.5 xdp程序在路由模式下,使用iperf工具测试数据包不转发,用jmeter可以

本地验证时重定向iperf包有出现calltrace错误&#xff0c;经推断&#xff0c;系统PAGE_SIZE<8k时可能出现&#xff08;getconf PAGE_SIZE指令可查看&#xff09;&#xff0c;按下图将ngbe_main.c的2350行ngbe_rx_bufsz改为ngbe_rx_pg_size可修复。其次&#xff0c;需要将加载…

AE-卡通人物解说动画视频的制作

目录 1.导入卡通人物图片和音频文件 2.新建合成 3.在卡通人物图片上添加效果和表达式 4.在音频文件上添加效果和表达式 5.将卡通人物中的 CC Split2 中分割1 表达式链接到滑块中 6.卡通人物根据音频文件自动匹配口型。 AE制作卡通人物解说视频&#xff0c;卡通人物口型根据…

C++笔记之花括号和圆括号初始化区别,列表初始化和初始化列表区别

C笔记之花括号和圆括号初始化区别&#xff0c;列表初始化和初始化列表区别 code review! 文章目录 C笔记之花括号和圆括号初始化区别&#xff0c;列表初始化和初始化列表区别1.花括号{}进行初始化和圆括号()进行初始化2.列表初始化&#xff08;list initialization&#xff0…

idea插件推荐——mybatis log plugin快速查看运行SQL

我们在编写代码的时候一定会编写SQL&#xff0c;简单的SQL我们一般不会出错但是如果遇到了mybatis中的复杂动态SQL&#xff0c;我们可能就会出现一些问题&#xff0c;为了在开发自测阶段及时发现处理问题&#xff0c;我们需要快速查看编译得到的SQL&#xff0c; log4j 的打印的…

SpringBoot整合Druid、Mybatis、MybatisPlus以及MybatisPlus的使用

1.SpringBoot整合Druid 1&#xff09;引入jar包 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.3</version></dependency>2&#xff09;在application.yml中 …

C++新经典03--共用体、枚举类型与typedef

共用体 共用体&#xff0c;也叫联合&#xff0c;有时候需要把几种不同类型的变量存放到同一段内存单元&#xff0c;例如&#xff0c;把一个整型变量、一个字符型变量、一个字符数组放在同一个地址开始的内存单元中。这三个变量在内存中占的字节数不同&#xff0c;但它们都从同…

Java开源项目mall学习笔记(1)——项目初始化

一、学习声明与项目介绍 该笔记是记录学习开源项目mall过程的文档笔记&#xff0c;完全原创&#xff0c;转载请声明。同时也对开源项目的作者表示感谢&#xff01; mall: &#x1f525; mall项目是一套基于 SpringBoot Vue uni-app 实现的电商系统&#xff0c;包括前台商城项…

基于springboot+vue的武汉旅游网(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

快速搭建园林园艺商城小程序的五个关键步骤

园艺设计是现代人们爱好的一项活动&#xff0c;通过设计和布置花园&#xff0c;营造出美丽的自然景观&#xff0c;给人们带来舒适和愉悦的感觉。如今&#xff0c;随着科技的发展&#xff0c;园林园艺小程序商城成为了园艺爱好者们购物和交流的新平台。本文将为大家介绍一个简单…

Modbus_TCP协议如何使用?

1 驱动简介 网关支持标准的Modbus-TCP协议&#xff0c;支持Modbus-TCP协议的设备&#xff08;例如智能仪表、电表等&#xff09;&#xff0c;都可以通过此协议直接通讯&#xff0c;实现远程采集、监控、控制设备的功能。 从站号&#xff1a;默认为1&#xff0c;需要查看设备说…

【实际开发21】- 项目部署

目录 1. 项目打包方式就两种 : war、jar 1. Windows 环境运行 Jar 包 2. Windows 后台运行 jar 包 1. cmd 下执行方式 2. bat 批处理方式 - ( Batch ) 3. 启动 : 在 xx.jar 同级目录下建立 run.bat 文件 4. 项目部署打包 忽略 test 文件 2. CICD 自动化部署 3. 代码质…

数据结构—散列表的查找

7.4散列表的查找 7.4.1散列表的基本概念 基本思想&#xff1a;记录的存储位置域关键字之间存在对应关系 ​ 对应关系——hash函数 ​ Loc&#xff08;i&#xff09; H&#xff08;keyi&#xff09; 如何查找&#xff1a; 根据散列函数 H(key) k 查找key9&#xff0c;则访…

【刷题笔记8.17】LeetCode:最长公共前缀

LeetCode&#xff1a;最长公共前缀 &#xff08;一&#xff09;题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 &#xff08;二&#xff09;分析 纵向扫描时&#xff0c;从前往后遍历所有字符串的每一列&am…

python开发环境准备

python开发环境准备 文章目录 python开发环境准备windows安装配置python3下载配置 安装pip&#xff08;通过get-pip.py&#xff09;测试与问题 测试python windows安装配置python3 校验日期 &#xff1a;2023年8月11日 下载 下载地址 官网地址 版本分为推荐下载最新的版本和…

leetcode 377. 组合总和 Ⅳ

2023.8.17 本题属于完全背包问题&#xff0c;乍一看和昨天那题 零钱兑换II 类似&#xff0c;但细看题目发现&#xff1a;今天这题是排列问题&#xff0c;而“零钱兑换II”是组合问题。排列问题强调顺序&#xff0c;而组合顺序不强调顺序。 这里先说个结论&#xff1a;先遍历物品…

原码、反码、补码,进制转换,有符号数和无符号数转换

计算机底层存储数据时&#xff0c;存储的是数据对应的二进制数字。对于整型数据&#xff0c;其二进制表示形式有三种&#xff0c;分别是&#xff1a;原码、反码、补码&#xff0c;而实际存储的是整型数据的补码。 原码、反码以及补码都是有符号的&#xff0c;其中最高位存放符…

windows系统丢失mfc120u.dll的解决方法

1.mfc120u.dll是什么 mfc120u.dll是Windows操作系统中的一个动态链接库&#xff08;Dynamic Link Library&#xff0c;简称DLL&#xff09;文件。它包含了一些用于运行C程序的函数和其他资源。这个特定的DLL文件是Microsoft Foundation Classes&#xff08;MFC&#xff09;库的…

LangChain源码逐行解密之系统(二)

LangChain源码逐行解密之系统 20.2 serapi.py源码逐行剖析 我们可以看一下Google查询的例子,在LangChain中有多种实现的方式。 如图20-5所示,在utilities的serpapi.py代码文件中实现了SerpAPIWrapper。 图20- 5 utilities的serpapi.py的SerpAPIWrapper 在langchain目录的se…

matplotlib从起点出发(7)_Tutorial_7_Artist

1 Artist教程 使用Artist对象来渲染画布。 matplotlib API一共有三个层次&#xff1a; matplotlib.backend_bases.FigureCanvas是绘制图形的区域&#xff1b;matplotlib.backend_bases.Renderer是知道如何在FigureCanvas上绘制的对象&#xff1b;matplotlib.artist.Artist是…

[NOIP2008 提高组] 传纸条——DP+优化

传纸条——DP优化 [NOIP2008 提高组] 传纸条题目描述输入格式输出格式样例样例输入样例输出 提示 温馨提示结题思路四维DP&#xff08;不推荐&#xff09;三维DP&#xff08;推荐&#xff09; A C 代码 [NOIP2008 提高组] 传纸条 题目描述 小渊和小轩是好朋友也是同班同学&am…