国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32硬件SPI通信詳解-------附代碼

這篇具有很好參考價值的文章主要介紹了STM32硬件SPI通信詳解-------附代碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

SPI外設(shè)簡介

1.STM32內(nèi)部集成了硬件SPI收發(fā)電路,可以由硬件自動執(zhí)行時鐘生成、數(shù)據(jù)收發(fā)等功能,減輕CPU的負擔(dān)
2.可配置8位/16位數(shù)據(jù)幀、高位先行/低位先行
3.時鐘頻率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)
4.支持多主機模型、主或從操作
5.可精簡為半雙工/單工通信
6.支持DMA
7.兼容I2S協(xié)議

STM32F103C8T6 硬件SPI資源SPI1(APB2外設(shè),72MHZ)、SPI2(APB1外設(shè),32MHZ)

SPI框圖

stm32f103的標(biāo)準(zhǔn)庫spi1通信,stm32,嵌入式硬件,單片機LSBFIRST控制位:配置低位或者高位先行
接收緩沖區(qū):RDR -----發(fā)送緩沖區(qū):TDR {二者配合實現(xiàn)無延遲傳輸}
BR[2:0]:時鐘分頻
TXE:發(fā)送寄存器空
RXNE:接收寄存器非空
NSS:實現(xiàn)多主機

SPI基本結(jié)構(gòu)

stm32f103的標(biāo)準(zhǔn)庫spi1通信,stm32,嵌入式硬件,單片機

主模式全雙工連續(xù)傳輸

stm32f103的標(biāo)準(zhǔn)庫spi1通信,stm32,嵌入式硬件,單片機

非連續(xù)傳輸

stm32f103的標(biāo)準(zhǔn)庫spi1通信,stm32,嵌入式硬件,單片機

軟件/硬件波形對比

stm32f103的標(biāo)準(zhǔn)庫spi1通信,stm32,嵌入式硬件,單片機
stm32f103的標(biāo)準(zhǔn)庫spi1通信,stm32,嵌入式硬件,單片機文章來源地址http://www.zghlxwxcb.cn/news/detail-859546.html

STM32硬件SPI代碼

STM32外設(shè)SPI庫函數(shù)詳解

void SPI_I2S_DeInit(SPI_TypeDef* SPIx);
//恢復(fù)缺省配置
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);
//SPI初始化
void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct);
//I2S初始化
void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct);
//SPI結(jié)構(gòu)體變量初始化
void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct);
//I2S結(jié)構(gòu)體變量初始化
void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);
//SPI外設(shè)Cmd使能
void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);
//I2SCmd外設(shè)使能
void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState);
//中斷使能
void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState);
//使能或者失能SPIx/I2Sx的DMA接口
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
//寫DR數(shù)據(jù)寄存器,發(fā)送字節(jié)
/*注釋:數(shù)據(jù)的發(fā)送和接收可以是8位或者16位的。為保證正確的操作,需要在啟用SPI之前就確定好數(shù)據(jù)幀格式*/
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);
//讀DR數(shù)據(jù)寄存器,接收字節(jié)
/*注釋:數(shù)據(jù)的發(fā)送和接收可以是8位或者16位的。為保證正確的操作,需要在啟用SPI之前就確定好數(shù)據(jù)幀格式*/
void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft);
//通過軟件內(nèi)部配置選定SPI的NSS引腳
void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState);
//使能或者失能SS輸出
void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize);
//為所選SPI配置數(shù)據(jù)幀大小,8/16位數(shù)據(jù)幀配置
void SPI_TransmitCRC(SPI_TypeDef* SPIx);
//發(fā)送SPIx的CRC校驗值
void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState);
//使能或失能硬件CRC校驗
/*只有在禁止SPI時(SPE=0),才能寫該位,否則出錯;該位只能在全雙工模式下使用;I2S模式下不使用*/
uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC);
//返回指定SPI的發(fā)送或接收CRC寄存器值
/*當(dāng)BSY標(biāo)志為’1’時讀該寄存器,將可能讀到不正確的數(shù)值; 在I2S模式下不使用*/
uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx);
//返回指定SPI的CRC多項式寄存器值
/*該寄存器包含了CRC計算時用到的多項式;在I2S模式下不使用*/
void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction);
//為指定的SPI選擇雙向模式下的數(shù)據(jù)傳輸方向
/*雙向模式下的輸出使能,決定在“單線雙向”模式下數(shù)據(jù)的輸出方向,這個“單線”數(shù)據(jù)線在主設(shè)備端為MOSI引腳,在從設(shè)備端為MISO引腳,在I2S模式下不使用*/
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);
//檢查指定的SPI/I2S標(biāo)志是否設(shè)置
void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);
//清除指定標(biāo)志位
ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT);
//檢查指定的SPI/I2S中斷是否發(fā)生
void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT);
//清除中斷標(biāo)志位

STM32硬件SPI.c配置

#include "stm32f10x.h"                  // Device header

/**
  * 函    數(shù):SPI寫SS引腳電平,SS仍由軟件模擬
  * 參    數(shù):BitValue 協(xié)議層傳入的當(dāng)前需要寫入SS的電平,范圍0~1
  * 返 回 值:無
  * 注意事項:此函數(shù)需要用戶實現(xiàn)內(nèi)容,當(dāng)BitValue為0時,需要置SS為低電平,當(dāng)BitValue為1時,需要置SS為高電平
  */
void MySPI_W_SS(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction)BitValue);		//根據(jù)BitValue,設(shè)置SS引腳的電平
}

/**
  * 函    數(shù):SPI2初始化
  * 參    數(shù):無
  * 返 回 值:無
  */
void MySPI_Init(void)
{
	/*************開啟時鐘********************/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//開啟GPIOA的時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);	//開啟SPI1的時鐘
	
	/************GPIO初始化*******************/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//將PB12引腳初始化為推挽輸出
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//將PB13和PB15引腳初始化為復(fù)用推挽輸出
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//將PB14引腳初始化為上拉輸入
	
	/***************SPI初始化*****************/
	SPI_InitTypeDef SPI_InitStructure;						//定義結(jié)構(gòu)體變量
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;			//模式,選擇為SPI主模式
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;	//方向,選擇2線全雙工
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//數(shù)據(jù)寬度,選擇為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模式0
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;				//NSS,選擇由軟件控制
	SPI_InitStructure.SPI_CRCPolynomial = 7;				//CRC多項式,暫時用不到,給默認值7
	SPI_Init(SPI2, &SPI_InitStructure);						//將結(jié)構(gòu)體變量交給SPI_Init,配置SPI2
	
	/***************SPI使能*******************/
	SPI_Cmd(SPI2, ENABLE);									//使能SPI2,開始運行
	
	/*設(shè)置默認高電平-----不選中從機*/
	MySPI_W_SS(1);											//SS默認高電平
}

/**
  * 函    數(shù):SPI起始
  * 參    數(shù):無
  * 返 回 值:無
  */
void MySPI_Start(void)
{
	MySPI_W_SS(0);				//拉低SS,開始時序
}

/**
  * 函    數(shù):SPI終止
  * 參    數(shù):無
  * 返 回 值:無
  */
void MySPI_Stop(void)
{
	MySPI_W_SS(1);				//拉高SS,終止時序
}

/**
  * 函    數(shù):SPI交換傳輸一個字節(jié),使用SPI模式0
  * 參    數(shù):ByteSend 要發(fā)送的一個字節(jié)
  * 返 回 值:接收的一個字節(jié)
  */
uint8_t MySPI_SwapByte(uint8_t ByteSend)
{
	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != SET);	//等待發(fā)送數(shù)據(jù)寄存器空
	
	SPI_I2S_SendData(SPI2, ByteSend);								//寫入數(shù)據(jù)到發(fā)送數(shù)據(jù)寄存器,開始產(chǎn)生時序
	
	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) != SET);	//等待接收數(shù)據(jù)寄存器非空
	
	return SPI_I2S_ReceiveData(SPI2);								//讀取接收到的數(shù)據(jù)并返回
}

STM32硬件SPI.h配置

#ifndef __MYSPI_H
#define __MYSPI_H

void MySPI_Init(void);
void MySPI_Start(void);
void MySPI_Stop(void);
uint8_t MySPI_SwapByte(uint8_t ByteSend);

#endif

到了這里,關(guān)于STM32硬件SPI通信詳解-------附代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【STM32CubeIDE】STM32F103硬件SPI驅(qū)動1.8寸TFT LCD128X160 ST7735S屏幕

    【STM32CubeIDE】STM32F103硬件SPI驅(qū)動1.8寸TFT LCD128X160 ST7735S屏幕

    ?雖然STM32CubeIDE也是基于HAL庫,但是還是不能直接轉(zhuǎn)Keil MDK工程,本驅(qū)動案例從GitHub下載來的,原始工程使用的是較老版本的STM32CubeIDE配置的,沒法在繼續(xù)在新版本上程序配置,工程只是做了初始化配置。程序并不能直接被點亮,重新配置了lcd初始化函數(shù)以及復(fù)位函數(shù)后,才

    2024年02月12日
    瀏覽(23)
  • STM32開發(fā)(六)STM32F103 通信 —— RS485 Modbus通信編程詳解

    STM32開發(fā)(六)STM32F103 通信 —— RS485 Modbus通信編程詳解

    ??《上一篇》 ???《主目錄》 ???《下一篇》 了解 RS485 Modbus協(xié)議技術(shù) 。本實驗是基于STM32F103開發(fā) 實現(xiàn) 通過RS-485實現(xiàn)modbus協(xié)議。 準(zhǔn)備好了嗎?開始我的show time。 1、硬件開發(fā)準(zhǔn)備 主控:STM32F103ZET6 RS485收發(fā)器:SP3485P 2、軟件開發(fā)準(zhǔn)備 軟件開發(fā)使用虛擬機 + VScode + STM32Cub

    2024年02月03日
    瀏覽(25)
  • STM32硬件SPI通信詳解-------附代碼

    STM32硬件SPI通信詳解-------附代碼

    1.STM32內(nèi)部集成了 硬件SPI收發(fā)電路 ,可以由 硬件自動執(zhí)行時鐘生成 、 數(shù)據(jù)收發(fā) 等功能, 減輕CPU的負擔(dān) 2.可配置 8位/16位數(shù)據(jù)幀 、 高位先行/低位先行 3. 時鐘頻率 : fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 4.支持 多主機模型 、 主或從操作 5.可精簡為 半雙工/單工通信 6. 支持DMA 7. 兼

    2024年04月27日
    瀏覽(16)
  • 使用STM32F103的SPI+DMA驅(qū)動ws2812 LED

    使用STM32F103的SPI+DMA驅(qū)動ws2812 LED

    目錄 前言 一、WS2812協(xié)議 1.1 數(shù)據(jù)傳輸編碼方式: ?1.2 傳輸?shù)臄?shù)據(jù)結(jié)構(gòu) 二、驅(qū)動方式:SPI+DMA 2.1 原理介紹 2.2 SPI+DMA操作 ?2.3 編寫代碼 2.4 使用 三 總結(jié) 參考文章 主要使用的STM32F103C8T6芯片的SPI+DMA方式實現(xiàn)WS2812的驅(qū)動協(xié)議,總體可以看作是使用SPI來實現(xiàn)一種通信協(xié)議來發(fā)送信號。

    2024年02月09日
    瀏覽(30)
  • stm32f103與openmv串口通信

    串口通信是指通過串行通信接口進行數(shù)據(jù)傳輸?shù)囊环N通信方式。在串口通信中,數(shù)據(jù)被分成一個個的字節(jié),按照一定的順序依次發(fā)送和接收。串口通信通常使用UART(通用異步收發(fā)傳輸)協(xié)議進行數(shù)據(jù)傳輸。 串口通信在嵌入式系統(tǒng)中應(yīng)用非常廣泛,其主要用途包括: 調(diào)試和監(jiān)

    2024年02月13日
    瀏覽(22)
  • 嵌入式硬件——stm32F103C8T6

    嵌入式硬件——stm32F103C8T6

    如下圖:? ? 處理器核心:STM32F103C8T6內(nèi)置了ARM Cortex-M3處理器,這是一種高性能、低功耗的32位RISC處理器,適用于嵌入式系統(tǒng)。 時鐘速度:它可以工作在不同的時鐘速度,最高主頻可達72 MHz。 存儲器:包括64KB的Flash程序存儲器用于存儲程序代碼,以及20KB的SRAM用于存儲數(shù)據(jù)和

    2024年02月05日
    瀏覽(125)
  • 【開源硬件篇】STM32F103C8T6核心板

    【開源硬件篇】STM32F103C8T6核心板

    一、STM32F103C8T6芯片 1.1 STM32F103C8T6簡介 ? STM32F103C8T6是一款由意法半導(dǎo)體公司(ST)推出的基于Cortex-M3內(nèi)核的32位微控制器,硬件采用LQFP48封裝。 ? 具體參數(shù)為: 64K x 8bit的Flash 20K x 8bit的SRAM 37個GPIO,分別為PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1 2個12bit ADC合計12路通道,外部通道:

    2024年02月03日
    瀏覽(86)
  • 【開源硬件篇】STM32F103C8T6主控板

    【開源硬件篇】STM32F103C8T6主控板

    設(shè)計目標(biāo) 能夠控制9路5V舵機 具有3路串口通信接口,其中有一路串口設(shè)計為串口轉(zhuǎn)USB,通過一根USB數(shù)據(jù)線直接進行通信 拓展口,除了所用到的功能模塊的IO口,其余的IO口都拓展出去 一路LED燈5V電源指示燈 設(shè)計了兩組3V3-GND引腳 一、STM32F103C8T6核心板外圍引腳電路 1.1 原理圖設(shè)

    2024年02月06日
    瀏覽(25)
  • 學(xué)習(xí)記錄之openmv和STM32F103的通信

    分上下位機,下位機向上位機發(fā)送數(shù)據(jù)。(上位機控制,下位機收集數(shù)據(jù)) 可能用到的函數(shù): UART :通用異步 收/發(fā)器 USART :通用同步/異步 收/發(fā)器 USART_ init() 串口初始化:波特率、數(shù)據(jù)字長,奇偶校驗,硬件流控及收發(fā)使能 USART_ Cmd 使能串口? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    2024年02月14日
    瀏覽(25)
  • STM32F103C8T6串口通信

    STM32F103C8T6串口通信

    ? 首先來看一下需要操作的函數(shù),以及配置的步驟: 圖1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2?? Code: usart.c #include \\\"usart.h\\\" void ustart_Init(void ) { GPIO_InitTypeDef GPIO_Init_Ustar ; // 定義輸出端口TX的結(jié)構(gòu)體對象 USART_InitTypeDef USTART_Init; // 定義串口初始化結(jié)構(gòu)體對象

    2024年02月16日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包