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
英文地址,請注明出處:http://en.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盤兼容的多&…