STM32 - SPI硬件外設

配合我的上一篇SPI ??????通信 協議-CSDN博客一起理解更佳,本文后看

? ? ? ?SPI 是由摩托羅拉(Motorola)公司開發的全雙工同步串行總線,是 MCU 和外圍設備之間進行通信的同步串行端口。主要應用在EEPROM、Flash、RTC、ADC、網絡控制器、MCU、DSP以及數字信號解碼器之間。SPI 系統可直接與各個廠家生產的多種標準外圍器件直接接口,一般使用4 條線:SCK、MISO、MOSI 、SS

STM32內部集成了硬件SPI收發電路,可以由硬件自動執行時鐘生成、數據收發等功能,減輕CPU的負擔

  • 可配置8位/16位數據幀、高位先行/低位先行
  • 時鐘頻率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 支持多主機模型、主或從操作
  • 可精簡為半雙工/單工通信
  • 支持DMA 兼容I2S協議

STM32F103C8T6 硬件SPI資源:SPI1(APB2)、SPI2(APB1

SPI基本圖?

NSS :從設備選擇。這是一個可選的引腳,用來選擇主 / 從設備。它的功能是用來作為“片選引腳”,讓主設備可以單獨地與特定從設備通訊,避免數據線上的沖突。
LSBFIRST是低位先行 。如果是MSBFIRST,那么就是高位先行,
此時MISO和MOSI需要換,如圖的另一種指法。

SPI基本結構?

注意:該圖是高位先行?

主模式傳輸?

主模式、全雙工模式下
連續傳輸(BIDIMODE=0并且RXONLY=0)時
TXE/RXNE/BSY 的變化示意圖

?

本質上來說:第一個字節數據發送,發送時下一個字節就已經到發送緩沖器等待,當第一個字節發送成功,立馬發送第二個,第三個字節進入發送緩沖器等待?。

非連續傳輸發送(BIDIMODE=0并且RXONLY=0)

TXE/BSY變化示意圖?

非連續傳輸發送來說:第一個字節數據發送,發送成功后,下一個字節才到發送緩沖器,再發送第二個,等發送成功后,第三個字節再進入發送緩沖器

代碼?

/*** 函    數:SPI初始化* 參    數:無* 返 回 值:無*/
void MySPI_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//開啟GPIOA的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);	//開啟SPI1的時鐘/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);			//將PA4引腳初始化為推挽輸出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);				//將PA5和PA7引腳初始化為復用推挽輸出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);				//將PA6引腳初始化為上拉輸入/*SPI初始化*/SPI_InitTypeDef SPI_InitStructure;					//定義結構體變量SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//模式,選擇為SPI主模式SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//方向,選擇2線全雙工SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;	//數據寬度,選擇為8位SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//先行位,選擇高位先行SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;//波特率分頻,選擇128分頻SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;			//SPI極性,選擇低極性SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;		//SPI相位,選擇第一個時鐘邊沿采樣,極性和相位決定選擇SPI模式0SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;			//NSS,選擇由軟件控制SPI_InitStructure.SPI_CRCPolynomial = 7;			//CRC多項式,暫時用不到,給默認值7SPI_Init(SPI1, &SPI_InitStructure);					//將結構體變量交給SPI_Init,配置SPI1/*SPI使能*/SPI_Cmd(SPI1, ENABLE);								//使能SPI1,開始運行/*設置默認電平*/MySPI_W_SS(1);										//SS默認高電平
}
SPI起始?
void MySPI_W_SS(uint8_t BitValue)
{GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue);	//根據BitValue,設置SS引腳的電平
}/*** 函    數:SPI起始* 參    數:無* 返 回 值:無*/
void MySPI_Start(void)
{MySPI_W_SS(0);				//拉低SS,開始時序
}
SPI終止?
/*** 函    數:SPI終止* 參    數:無* 返 回 值:無*/
void MySPI_Stop(void)
{MySPI_W_SS(1);				//拉高SS,終止時序
}
交換一個字節?
/*** 函    數:SPI交換傳輸一個字節,使用SPI模式0* 參    數:ByteSend 要發送的一個字節* 返 回 值:接收的一個字節*/
uint8_t MySPI_SwapByte(uint8_t ByteSend)
{while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != SET);//等待發送數據寄存器空SPI_I2S_SendData(SPI1, ByteSend);							//寫入數據到發送數據寄存器,開始產生時序while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != SET);//等待接收數據寄存器非空return SPI_I2S_ReceiveData(SPI1);							//讀取接收到的數據并返回
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43057.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網上怎么樣可以掙錢,分享幾種可以讓你在家賺錢的兼職項目

當今社會,壓力越來越大,工作、家庭、生活等等,方方面面都需要錢,僅靠一份工作賺錢,已經很難滿足我們的需求。所以很多人都會嘗試做一些副業,兼職來補貼家用。 現在呢,有很多人都想在網上賺錢&am…

微型導軌如何提升數控機床的穩定性?

數控機床是加工設備中常用的機床,精度和穩定性是衡量數控機床性能的重要指標。而微型導軌作為數控機床中重要的傳動元件,數控機床與其具體結構性能是密不可分的,那么微型導軌如何提高數控機床的穩定性呢? 1、微型導軌通過采用先進…

githup開了代理push不上去

你們好,我是金金金。 場景 git push出錯 解決 cmd查看 git config --global http.proxy git config --global https.proxy 如果什么都沒有,代表沒設置全局代理,此時如果你開了代理,則執行如下,設置代理 git con…

關于SQL NOT IN判斷失效的情況記錄

1.準備測試數據 CREATE TABLE tmp_1 (val integer);CREATE TABLE tmp_2 (val integer, val2 integer);INSERT INTO tmp_1 (val) VALUES (1); INSERT INTO tmp_1 (val) VALUES (2); INSERT INTO tmp_2 (val) VALUES (1); INSERT INTO tmp_2 (val, val2) VALUES (NULL,0);2.測…

掃地機器人工作原理

掃地機器人的工作原理主要可以歸納為以下幾個步驟: 一、啟動與建圖 掃地機器人開機后,通常會從充電底座啟動。使用激光導航或視覺導航技術的掃地機器人會開始掃描周圍環境,繪制室內地圖。激光導航的掃地機器人通過激光發射器和接收器測量機…

數據無憂:Ubuntu 系統遷移備份全指南

嘮嘮閑話 最近電腦出現了一些故障,送修期間,不得不在實驗室的臺式機上重裝系統,配環境的過程花費了不少時間。為避免未來處理類似事情時耗費時間,特此整理一些備份策略。 先做以下準備: U盤啟動盤,參考 …

什么是靜態住宅代理?一文看懂它

靜態住宅代理(也稱為 ISP 代理)是最流行的代理類型之一。它們也是隱藏身份和在線匿名的最佳方式之一。但是您需要了解它們什么?是什么讓它們如此特別?為什么您要使用住宅代理而不是僅僅使用常規代理服務?如果你感興趣&…

exel帶單位求和,統計元素個數

如果exel表格中,如果數據有單位,無法直接用 自動求和 直接求和。如下圖所示,求和結果為0,顯然不是我們想要的。 用下面的公式求和,單位不是“個”的時候記得替換單位。統計范圍不是“C1:C7”也記得換一下啊&#xff01…

華為的服務器創新之路

華為作為全球領先的信息與通信技術解決方案供應商,其在服務器領域的創新方法不僅推動了企業自身的發展,也為整個行業的進步做出了重要貢獻。以下是華為在服務器領域所采取的一些關鍵創新方法: 芯片級的自主創新 華為通過自主研發的“鯤鵬”處…

線程相關概念及操作

【1】線程的概念 1.線程-->進程會得到一個內存地址,進程是資源分配的基本單位線程才是真正進程里處理數據與邏輯的東西進程---》被分配一定的資源線程---》利用進程資源處理數據與邏輯 【2】進程和線程關系: 進程與進程之間是競爭關系,競…

【北京迅為】《i.MX8MM嵌入式Linux開發指南》-第一篇 嵌入式Linux入門篇-

i.MX8MM處理器采用了先進的14LPCFinFET工藝,提供更快的速度和更高的電源效率;四核Cortex-A53,單核Cortex-M4,多達五個內核 ,主頻高達1.8GHz,2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT…

BFS:邊權相同的最短路問題

一、邊權相同最短路問題簡介 二、迷宮中離入口最近的出口 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:const int dx[4]{1,-1,0,0};const int dy[4]{0,0,1,-1};int nearestExit(vector<vector<char>>& maze, vector<int>& e…

論文閱讀:Rethinking Interpretability in the Era of Large Language Models

Rethinking Interpretability in the Era of Large Language Models 《Rethinking Interpretability in the Era of Large Language Models》由Chandan Singh、Jeevana Priya Inala、Michel Galley、Rich Caruana和Jianfeng Gao撰寫&#xff0c;探討了在大型語言模型&#xff…

WVP后端項目文件結構

WVP&#xff08;Web Video Platform&#xff09;是一個基于GB28181-2016標準實現的網絡視頻平臺&#xff0c;負責實現核心信令與設備管理后臺部分&#xff0c;支持NAT穿透&#xff0c;支持海康、大華、宇視等品牌的IPC、NVR、DVR接入。支持國標級聯&#xff0c;支持rtsp/rtmp等…

使用C#進行MySQL刪改查操作

使用C#進行MySQL刪改查操作 1.前提準備2.C#中MySQL的向指定數據庫中增加數據3.C#中MySQL的向指定數據庫中修改數據4.C#中MySQL的向指定數據庫中刪除數據 1.前提準備 在MySQL官網上下載C#相關的dll&#xff0c;或者在Nuget包中搜索“MySql.Data”&#xff0c;進行下載。 2.C#中…

js函數擴展內容---多參數,函數屬性,字符串生成函數

1.多參數 在js中&#xff0c;Math.max()方法可以接受任意數量的參數&#xff0c; Math.max(1,2,3,4);//4 Math.max(1,2,3,4,5,6,7,8,9,10)//10 在max方法里面有一個rest參數&#xff0c;它接受了所有參數全部合成到了一個number數組里面&#xff0c; function rest(a,b,...a…

12 - matlab m_map地學繪圖工具基礎函數 - 在地圖上繪制矢量場m_vec函數和繪制風羽圖的m_windbarb函數

12 - matlab m_map地學繪圖工具基礎函數 - 在地圖上繪制矢量場函數m_vec和繪制風羽圖的函數m_windbarb 0. 引言1. 關于m_vec2. 關于m_windbarb3. 總結 0. 引言 本篇介紹下m_map中繪制矢量場的函數&#xff08;m_vec&#xff09;和地圖上繪制風羽圖的函數m_windbarb。 1. 關于m…

【python重復元素判定】

在Python中&#xff0c;判定一個序列&#xff08;如列表、元組等&#xff09;中是否存在重復元素&#xff0c;可以通過多種方法實現。這里列出幾種常用的方法&#xff1a; 1. 使用集合&#xff08;Set&#xff09; 集合是一個無序的、不包含重復元素的數據結構。將序列轉換為…

QT信號量與槽

文章目錄 概述用系統生成新增一個信號量和槽代碼方式信號量和槽的宏信號量和槽都用函數地址lamda表達式函數指針 槽和信號量函數信號量槽 小結 概述 這個內容是QT獨有的&#xff0c;寫的挺有意義的。之前寫過一篇QT slots的函數&#xff0c;思來想去&#xff0c;覺得不是那么有…

python-22-零基礎自學python-數據分析基礎 打開文件 讀取文件信息

學習內容&#xff1a;《python編程&#xff1a;從入門到實踐》第二版 知識點&#xff1a; 讀取文件 、逐行讀取文件信息等 練習內容&#xff1a; 練習10-1:Python學習筆記 在文本編輯器中新建一個文件&#xff0c;寫幾句話來總結一下你至此學到的Python知識&#xff0c;其中…