day15 SPI

1串行外设接口概述

1.1基本概念

SPI(串行外设接口)是一种高速、全双工、同步的串行通信协议。串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK),但是如果打算实现单向通信(最少3根线),就可以利用这种机制实现一对多或者一对一的通信。

1.2引脚定义

SPI总线采用的环形结构,利用的是主从模式(主机---->从机)进行数据的传输,由于是同步通信,所以在主机发送数据的同时也会收到从机发送的数据。

如果主机不打算和从机进行数据的传输,应该让NSS引脚在空闲状态下处于高电平(表示不通信),如果打算和某个从机进行单独通信的话,则需要把从机对应的NSS引脚拉低。

片选引脚之间是“互斥”的,同一时刻只能有一个片选引脚为低电平。

主设备和从设备都有片选引脚NSS/CS,通过片选引脚来实现主设备和多个从设备之间的通信,NSS片选引脚可以由软件控制,也可以由硬件控制。

1.3工作模式

由于SPI外设是全双工同步通信,所以时钟信号就由SCK引脚来生成,SCK引脚只能由主设备控制,从设备是无法控制的,所以SCK引脚输出的脉冲信号的极性和相位就需要进行配置。

时钟相位CPHA:置1  第二个边沿采集  置0   第一个边沿采集

时钟极性CPHL:置1 上升沿采样           置0  下降沿采样

这两位可以得到四种不同的组合,就被作为SPI总线的工作模式(模式0~模式3),到底要选择哪种模式,主机的工作模式必须根据从设备的数据手册的说明进行设置。

1.4 数据格式

主机与从机在通信的过程中传输的数据时以bit为单位(串行传输),所以数据格式就十分重要,主机的数据格式必须要根据从机的数据格式进行设置(MSB或者LSB)。

1.5通信速率:

由图可知:SPI1挂载在APB2上,而APB1总线频率42MHZ,APB2总线频率84MHZ,BR寄存器用000模式下最多可以使用42MHZ频率,SPI2和SPI3也可以达到21Mbps,但是一些外围器件的通信速率最高也就是10Mbps左右,极少数可以超过10Mbps(W25Q128芯片)。

2SPI配置

2.1使用流程

可以参考stm32f4xx_spi.c的开头注释以及ST公司提供的代码例程,根据代码思路进行设计

===================================================================
##### How to use this driver #####
===================================================================
[..]
(#) Enable peripheral clock using the following functions 
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE) for SPI1

1打开SPI外设的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE) for SPI2
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE) for SPI3
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE) for SPI4
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE) for SPI5
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE) for SPI6.

(#) Enable SCK, MOSI, MISO and NSS GPIO clocks using RCC_AHB1PeriphClockCmd()
function.2打开GPIO的外设时钟

In I2S mode, if an external clock source is used then the I2S 
CKIN pin GPIO clock should also be enabled.

(#) Peripherals alternate function: 
(++) Connect the pin to the desired peripherals' Alternate Function (AF) 
using GPIO_PinAFConfig() function④引脚功能复用
(++) Configure the desired pin in alternate function by: 
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF配置复用模式
(++) Select the type, pull-up/pull-down and output speed via GPIO_PuPd, 
GPIO_OType and GPIO_Speed members  ③初始化GPIO
(++) Call GPIO_Init() function In I2S mode, if an external clock source is 
used then the I2S CKIN pin should be also configured in Alternate 
function Push-pull pull-up mode. 
        ⑤配置SPI外设参数
(#) Program the Polarity, Phase, First Data, Baud Rate Prescaler, Slave 
Management, Peripheral Mode and CRC Polynomial values using the SPI_Init()
function.
In I2S mode, program the Mode, Standard, Data Format, MCLK Output, Audio 
frequency and Polarity using I2S_Init() function. For I2S mode, make sure 
that either:
(++) I2S PLL is configured using the functions 
RCC_I2SCLKConfig(RCC_I2S2CLKSource_PLLI2S), RCC_PLLI2SCmd(ENABLE) and 
RCC_GetFlagStatus(RCC_FLAG_PLLI2SRDY); or 
(++) External clock source is configured using the function 
RCC_I2SCLKConfig(RCC_I2S2CLKSource_Ext) and after setting correctly 
the define constant I2S_EXTERNAL_CLOCK_VAL in the stm32f4xx_conf.h file. 

(#) Enable the NVIC and the corresponding interrupt using the function 
SPI_ITConfig() if you need to use interrupt mode. 这个不用

(#) When using the DMA mode 这个不用
(++) Configure the DMA using DMA_Init() function
(++) Active the needed channel Request using SPI_I2S_DMACmd() function

(#) Enable the SPI using the SPI_Cmd() function or enable the I2S using
I2S_Cmd().⑥使能SPI

2.2代码展示

#include "stm32f4xx.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

void SPI1_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;

    // 1. 使能时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

    // 2. 配置GPIO(复用功能)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // SCK, MISO, MOSI
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;  // 复用模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 映射GPIO到SPI功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); // SCK
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); // MISO
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); // MOSI

    // 3. 配置片选引脚(PA4,普通GPIO输出)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_SetBits(GPIOA, GPIO_Pin_4); // 默认拉高(不选中)

    // 4. 配置SPI参数
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 全双工
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;                     // 主模式
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;                 // 8位数据
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;                        // CPOL=0
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;                      // CPHA=0(模式0)
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;                         // 软件控制NSS
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // 时钟分频(APB2=84MHz时,SPI时钟=10.5MHz)
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;                // MSB优先
SPI_InitStruct.SPI_CRCPolynomial = 7;                          // CRC多项式(默认值)
SPI_Init(SPI1, &SPI_InitStruct);

    // 5. 使能SPI
SPI_Cmd(SPI1, ENABLE);
}

3应用:Flash闪存

3.1基本概念

开发板中板载的主控芯片是STM32F407ZET6,主控芯片内部搭载512K的Flash闪存,但是用户程序是需要下载到Flash闪存空间的,所以留给用户的操作空间并不大,就为了用户的数据存储,可以使用外部串行Flash闪存芯片,开发板上板载的外部Flash芯片的型号是W25Q128,具体的特点如下图:

3.2内存分布

高电压生成器:实现FLASH掉电不丢失,击穿之后上电仍然记住击穿的状态

3.3基本模式

W25Q128芯片支持两种SPI模式(模式0和模式3),主机可以选择这两种模式的一种进行通信即可。

3.4代码配置

3.4.1初始化配置

3.4.2数据收发

3.4.3设备ID

3.4.4读取数据

3.4.5使能写入

3.4.6读取状态

3.4.7禁止写入

3.4.8擦除扇区

3.3.9扇区写入

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

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

相关文章

阿里云微服务引擎 MSE 及 API 网关 2025 年 7 月产品动态

点击此处,了解微服务引擎 MSE 产品详情。

RFID技术在汽车倍速链中的应用:驱动智能制造的隐形引擎

RFID技术在汽车倍速链中的应用:驱动智能制造的隐形引擎某汽车汽车倍速链现场存在问题:(1)条形码需人工扫描,数据采集延迟率高达15%,导致生产调度与实际工况脱节;(2)涂装车…

ES集群调优策略

Index(写)调优 副本数置0 如果是集群首次灌入数据,可以将副本数设置为0,写入完毕再调整回去,这样副本分片只需要拷贝,节省了索引过 程。 PUT /my_temp_index/_settings { "number_of_replicas": 0 } 自动生成doc ID  通过Elast…

mysql的安装步骤

安装步骤1.下载软件包,安装依赖环境2.安装mysql服务器3.基础安装路径,创用户,与权限4.初始化5.添加环境变量,把服务放到开机自启里面6.启动mysql服务器7.获取初始密码并且修改一,下载软件(yum,源…

Ant Design Vue notification自定义

<script setup> import { onMounted, h, ref, watch, getCurrentInstance } from vue; import { notification, Button } from ant-design-vue; onMounted(() > { const list [{id: 11,warnLevel: 严重,...},...]showMessage(list); }); function showMessage(){ for…

蓝桥杯算法之搜索章 - 2

大家好&#xff0c;接下来&#xff0c;我将带来对于搜索篇的新内容&#xff0c;这部分我将打算围绕DFS深度优先搜索去讲解。 温馨提示&#xff1a;由于这篇文章是接着上一篇文章的&#xff0c;如果新读者没有看过前一篇的话&#xff0c;推荐去看一下&#xff0c;不然有些地方可…

蓝桥杯----AT24C02

&#xff08;5-1&#xff09;、AT24C02掉电不丢失写入与读取AT24C02就是将数据写入E2PROM&#xff0c;保证写入数据掉电不丢失。考频低&#xff0c;一般不考&#xff0c;顶天考几个数据E2PROM&#xff0c;上电立马读取。AT24C02数据读取一定放在主程序最前面&#xff0c;否则会…

【物联网】基于树莓派的物联网开发【19】——树莓派搭建MQTT客户端及MQTTX使用

场景介绍 实现测试客户端与 MQTT 服务器的连接、订阅、取消订阅、收发消息等功能。 MQTT发布消息到代理服务器 安装paho-mqtt 使用pip工具安装paho-mqtt&#xff0c;输入以下指令即可&#xff1a; sudo pip install paho-mqtt安装 MQTT 客户端库 为了方便连接到 MQTT 服务器&am…

5G-A技术浪潮勾勒通信产业新局,微美全息加快以“5.5G+ AI”新势能深化场景应用

7月31日&#xff0c;国家互联网信息办公室发布《国家信息化发展报告》。《报告》中提出&#xff0c;新一代通信技术研发取得新成果&#xff0c;5G-A地空通信&#xff08;5G-ATG&#xff09;技术研发成功并完成测试验证。5G-A技术研发测试验证移动通信技术一般代际生命周期为10年…

SQLite Where 子句详解

SQLite Where 子句详解 SQLite 是一款轻量级的数据库管理系统,广泛应用于移动设备、嵌入式系统以及个人电脑。在 SQLite 中,WHERE 子句是 SQL 查询语句中不可或缺的一部分,它用于指定查询条件,从而筛选出满足特定条件的记录。本文将详细介绍 SQLite 中的 WHERE 子句,包括…

AI IDE+AI 辅助编程-生成的大纲-一般般

引言概述 AI IDE 和 AI 辅助编程的兴起及其对开发效率的影响提出核心问题&#xff1a;AI 工具能否真正帮助程序员减少加班&#xff08;告别 996&#xff09;&#xff1f;AI IDE 与 AI 辅助编程的定义与现状解释 AI IDE&#xff08;集成 AI 的开发环境&#xff09;和 AI 辅助编程…

ABP VNext + Dapr Workflows:轻量级分布式工作流

&#x1f680; ABP VNext Dapr Workflows&#xff1a;轻量级分布式工作流 &#x1f4da; 目录&#x1f680; ABP VNext Dapr Workflows&#xff1a;轻量级分布式工作流一、引言 ✨TL;DR &#x1f525;二、环境与依赖 &#x1f6e0;️三、系统架构与流程图 &#x1f3d7;️四、…

⭐ Unity 实现UI视差滚动效果(Parallax)鼠标控制、可拓展陀螺仪与脚本控制

✨ 效果如下在许多游戏、APP 或动效页面中&#xff0c;我们常见的一种视觉效果是 视差滚动&#xff08;Parallax Scrolling&#xff09;&#xff1a;前景、中景、背景在鼠标或设备移动时以不同速率轻微移动&#xff0c;从而营造出一种空间感和深度感。目前遇到这样一个需求 所以…

【05】VM二次开发——模块参数配置--带渲染/不带渲染(WinForm界面调用 模块参数配置)

文章目录1 Winform 窗口界面 &#xff08;带渲染的参数配置控件&#xff09;2 配置代码3 运行测试4 不带渲染的参数配置控件 对比4.1 添加控件4.2 代码及演示效果模块参数配置本教程介绍如何在VM二次开发中对模块参数进行配置 1 Winform 窗口界面 &#xff08;带渲染的参数配置…

Android 之 蓝牙通信(2.0 经典)

​​一、环境配置​​1. ​​添加依赖​​在 build.gradle 中添加库依赖&#xff1a;dependencies {implementation com.github.akexorcist:bluetoothspp:1.0.0 }2. ​​权限声明&#xff08;AndroidManifest.xml&#xff09;​<uses-permission android:name"androi…

使用 Scikit-LLM 进行零样本和少样本分类

使用 Scikit-LLM 进行零样本和少样本分类 使用 Scikit-LLM 进行零样本和少样本分类 在本文中&#xff0c;您将学习&#xff1a; Scikit-LLM如何将OpenAI的GPT等大型语言模型与Scikit-learn框架集成以进行文本分析。零样本和少样本分类之间的区别以及如何使用Scikit-LLM实现它…

android内存作假通杀补丁(4GB作假8GB)

可过如下app检测&#xff1a; 安兔兔、鲁大师、白眼、AIDA64、CPU X、CPU-Z、DevCheck、DeviceInfoHW lyw235yk235:~/Extend/lyw235/V/sprdroid1_v_4/sprdroid1_v$ git diff vnd/bsp/kernel5.15/kernel5.15/mm/page_alloc.c diff --git a/vnd/bsp/kernel5.15/kernel5.15/mm/pag…

Android 之 MVC架构

介绍1. MVC架构分工​​​​Model层​​&#xff1a;处理数据验证、网络请求等业务逻辑。​​View层​​&#xff1a;XML布局定义界面&#xff0c;Activity处理用户输入和显示结果。​​Controller层​​&#xff1a;Activity作为控制器&#xff0c;协调Model和View的交互对于登…

Centos Docker 安装手册(可用)

Centos 安装 Docker # 卸载旧版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-selinux # 安装依赖工具 yum install -y yum-utils device-mapper-persistent-d…

烽火HG680-KX-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包

烽火HG680-KX-海思MV320芯片-28G-安卓9.0-强刷卡刷固件包U盘强刷刷机步骤&#xff1a;1、强刷刷机&#xff0c;用一个usb2.0的8G以下U盘&#xff0c;fat32&#xff0c;2048块单分区格式化&#xff08;强刷对&#xff35;盘非常非常挑剔&#xff0c;usb2.0的4G U盘兼容的多&…