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

STM32與ESP32的硬件SPI通信(個人學(xué)習(xí)記錄)

這篇具有很好參考價值的文章主要介紹了STM32與ESP32的硬件SPI通信(個人學(xué)習(xí)記錄)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、硬件配置

????????STM32F103ZET6作為主機,使用SPI2,ESP32S2作為從機,進行SPI雙向通信;硬件接線如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 主機? ? ? ? ? ? ? ? ? ? ? ? 從機

CS? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PB12 ——————? 14

MOSI? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PB6 ——————? ? 2

MISO? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PB14 ——————? 13

CLK? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PB15 ——————? 12

HANDSHAKE? ? ? ? ? ? ? ? ? ? ? ? ?PB13 ——————? ?15

GND? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GND?——————? ?GND? ?

(地線一定相連在一起,不然傳輸?shù)臄?shù)據(jù)會亂碼)

二、主機代碼

#define SPI2READY	PBin(6)    //讀取握手線是否準備好

void SPI2_Init(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;

	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO, ENABLE );
	RCC_APB1PeriphClockCmd(	RCC_APB1Periph_SPI2,  ENABLE );//SPI2時鐘使能 	
	
    //CS片選線
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //PB12推挽輸出 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
	
    //HANDSHAKE 握手線
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6;	     
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;     //PB6下拉輸入 
	GPIO_Init(GPIOB, &GPIO_InitStructure);            
	
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15復(fù)用推挽輸出 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

 	GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//設(shè)置SPI工作模式:設(shè)置為主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;	//SPI發(fā)送接收8位幀結(jié)構(gòu)
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		    //串行同步時鐘的空閑狀態(tài)為高電平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;	    //第一個跳變沿數(shù)據(jù)被采樣
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		    //軟件管理
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//預(yù)分頻值為256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//數(shù)據(jù)傳輸從MSB位開始
	SPI_InitStructure.SPI_CRCPolynomial = 7;        	//CRC值計算的多項式
	SPI_Init(SPI2, &SPI_InitStructure);                 //初始化外設(shè)SPIx寄存器
 
	SPI_Cmd(SPI2, ENABLE);                             //使能SPI外設(shè)
}  

//SPIx 讀寫一個字節(jié)
//TxData:要寫入的字節(jié)
//返回值:讀取到的字節(jié)
u8 SPI2_ReadWriteByte(u8 TxData)
{		
	u8 retry=0;	
	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) 
	{
        retry++;
        if(retry>200) return 0;    //發(fā)送上一個數(shù)據(jù)時間過長,報錯
    }			  
	SPI_I2S_SendData(SPI2, TxData); //通過外設(shè)SPIx發(fā)送一個數(shù)據(jù)
	retry=0;
	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) 
	{
		retry++;
		if(retry>200) return 0;
	}	  						    
	return SPI_I2S_ReceiveData(SPI2); //返回通過SPIx最近接收的數(shù)據(jù)					    
}

u8 TXBuffer[128];
u8 RXBuffer[128];

 int main(void)
 {	 
	u16 i=0;
	delay_init();	    	 //延時函數(shù)初始化	  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級分組為組2
	uart_init(115200);	 	//串口初始化為115200
	LED_Init();		  		//初始化與LED連接的硬件接口	
	SPI2_Init();
	
	 for (i = 0; i < 10; i++)    //給發(fā)送數(shù)組賦初值
    {
        TXBuffer[i] = 0x47+i;
    }
	 
	while(1)
	{
		
		if(SPI2READY==1)        //如果從機準備好接收
		{
			GPIO_ResetBits(GPIOB,GPIO_Pin_12);	    //拉低CS
			for(i=0;i<10;i++)                       //發(fā)送數(shù)據(jù)并接收從機返回數(shù)據(jù)
			{
				RXBuffer[i]=SPI2_ReadWriteByte(TXBuffer[i]);
			}
			GPIO_SetBits(GPIOB,GPIO_Pin_12);        //拉高CS
			LED0 = ~LED0;                           //指示燈閃爍
		}
		printf("%s\r\n",RXBuffer);                  //串口打印從機接收到的數(shù)據(jù)
		delay_ms(1000);                                
	}
}




?三、從機代碼

根據(jù)官方所給例程修改

#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include "esp_log.h"
#include "driver/spi_slave.h"
#include "driver/gpio.h"

#define GPIO_HANDSHAKE 2
#define GPIO_MOSI 12
#define GPIO_MISO 13
#define GPIO_SCLK 15
#define GPIO_CS 14

#ifdef CONFIG_IDF_TARGET_ESP32
#define RCV_HOST    HSPI_HOST
#else
#define RCV_HOST    SPI2_HOST
#endif

在事務(wù)進入隊列并準備由master提取時調(diào)用。我們用這個來設(shè)置握手線
void my_post_setup_cb(spi_slave_transaction_t *trans) {
    gpio_set_level(GPIO_HANDSHAKE, 1);
}

//事務(wù)發(fā)送/接收后調(diào)用。我們用這個來降低握手線。
void my_post_trans_cb(spi_slave_transaction_t *trans) {
    gpio_set_level(GPIO_HANDSHAKE, 0);
}

//Main application
void app_main(void)
{
    int n=0;
    esp_err_t ret;

    //Configuration for the SPI bus
    spi_bus_config_t buscfg={
        .mosi_io_num=GPIO_MOSI,
        .miso_io_num=GPIO_MISO,
        .sclk_io_num=GPIO_SCLK,
        .quadwp_io_num = -1,
        .quadhd_io_num = -1,
    };

    //Configuration for the SPI slave interface
    spi_slave_interface_config_t slvcfg={
        .mode=0,                    //CPOL 0,CPHA 0 (注意模式配置,需要與主機一致) 
        .spics_io_num=GPIO_CS,
        .queue_size=3,              
        .flags=0,
        .post_setup_cb=my_post_setup_cb,
        .post_trans_cb=my_post_trans_cb
    };

    //Configuration for the handshake line
    gpio_config_t io_conf={
        .intr_type=GPIO_INTR_DISABLE,
        .mode=GPIO_MODE_OUTPUT,
        .pin_bit_mask=(1<<GPIO_HANDSHAKE)
    };

    //Configure handshake line as output
    gpio_config(&io_conf);
    //Enable pull-ups on SPI lines so we don't detect rogue pulses when no master is connected.
    gpio_set_pull_mode(GPIO_MOSI, GPIO_PULLUP_ONLY);
    gpio_set_pull_mode(GPIO_SCLK, GPIO_PULLUP_ONLY);
    gpio_set_pull_mode(GPIO_CS, GPIO_PULLUP_ONLY);

    //Initialize SPI slave interface
    ret=spi_slave_initialize(RCV_HOST, &buscfg, &slvcfg, SPI_DMA_CH_AUTO);
    assert(ret==ESP_OK);

    WORD_ALIGNED_ATTR char sendbuf[129]="";
    WORD_ALIGNED_ATTR char recvbuf[129]="";
    memset(recvbuf, 0, 33);     //將前33個字節(jié)填充為0     
    spi_slave_transaction_t t;  
    memset(&t, 0, sizeof(t));

    while(1) {
        //Clear receive buffer, set send buffer to something sane
        memset(recvbuf, 0x00, 129);     //將129個字節(jié)全部填充為0xA5

        for(int j=0;j<26;j++)    //給從機發(fā)送緩存區(qū)賦值
        {
            sendbuf[j]=0x41+j;
        }

        //Set up a transaction of 128 bytes to send/receive
        t.length=20*8;             //設(shè)置一次接收/發(fā)送的最大值,必須比主機一次發(fā)送的數(shù)據(jù)大小要大,否則會亂序
        t.tx_buffer=sendbuf;
        t.rx_buffer=recvbuf;
        
        ret=spi_slave_transmit(RCV_HOST, &t, portMAX_DELAY);
       // spi_slave_queue_trans(RCV_HOST, &t, portMAX_DELAY);    //可以用這個函數(shù),但是沒有驗證,容易出錯

        printf("Received: %s\n", recvbuf);
        n++;
    }
}

?esp32 spi stm32,學(xué)習(xí),單片機,嵌入式硬件,stm32

運行順序應(yīng)該是從機接收先復(fù)位,再等待主機復(fù)位;如果主機先復(fù)位,則接收時序可能會不正確。

?四、運行結(jié)果

主機接收到從機返回的數(shù)據(jù)

esp32 spi stm32,學(xué)習(xí),單片機,嵌入式硬件,stm32?

從機接收到主機發(fā)送的數(shù)據(jù)

esp32 spi stm32,學(xué)習(xí),單片機,嵌入式硬件,stm32文章來源地址http://www.zghlxwxcb.cn/news/detail-729967.html

到了這里,關(guān)于STM32與ESP32的硬件SPI通信(個人學(xué)習(xí)記錄)的文章就介紹完了。如果您還想了解更多內(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)文章

  • 【0基礎(chǔ)自研記錄】ESP32-CAM自制個人網(wǎng)絡(luò)監(jiān)控

    【0基礎(chǔ)自研記錄】ESP32-CAM自制個人網(wǎng)絡(luò)監(jiān)控

    目的:實現(xiàn)一個小型家庭監(jiān)控 esp32-acm+燒錄板+燒錄線 Arduion IDE +CH340串口驅(qū)動 下載地址如下 Arduion IDE:https://www.arduino.cc/en/software CH340串口驅(qū)動 鏈接:https://pan.baidu.com/s/1ri8dK7wW6KFz8rOPsF-e-A 提取碼:28ft 說明:Thony軟件也可燒錄,但或許是由于燒錄板的原因,開發(fā)板與thony連接未成

    2024年02月09日
    瀏覽(16)
  • ESP8266與手機App通信(STM32)

    ESP8266與手機App通信(STM32)

    ????????ESP8266是一種低成本的Wi-Fi模塊,可用于連接物聯(lián)網(wǎng)設(shè)備,控制器和傳感器等。它具有小巧、高度集成和低功耗的特點,因此在物聯(lián)網(wǎng)應(yīng)用中被廣泛使用。ESP8266模塊由Espressif Systems開發(fā),具有單芯片的封裝和多種功能,包括Wi-Fi網(wǎng)絡(luò)連接、GPIO控制、PWM控制和模擬輸入

    2023年04月09日
    瀏覽(28)
  • 入門stm32:STM32hal庫實現(xiàn)ESP8266與手機通信(不定長數(shù)據(jù)收發(fā)和ESP8266使用的一些問題)

    入門stm32:STM32hal庫實現(xiàn)ESP8266與手機通信(不定長數(shù)據(jù)收發(fā)和ESP8266使用的一些問題)

    目錄 前言 一、stm32cubeMX的串口配置 二、空閑中斷+dma接收 三、ESP8266.c和ESP8266.h ESP8266.h ESP8266.c 注意事項 四、與手機通信例程 步驟: ?例程代碼main.c 運行結(jié)果 五、相關(guān)問題 總結(jié) 相關(guān)的app和源碼 ? ? ? ? 前提: 1.掌握串口通信和ESP8266的使用方法 串口通信:單片機串口通信

    2024年02月04日
    瀏覽(158)
  • 基于stm32 ESP8266WiFi模塊的基本通信

    基于stm32 ESP8266WiFi模塊的基本通信

    本篇涉及到的模塊與工具為: 1. ATK-ESP8266wifi模塊 2. USB-UART模塊 3. 串口調(diào)試助手 提取鏈接:https://pan.baidu.com/s/17xRlpnjp8j-VvyD2VDxNXw?pwd=ufms 提取碼:ufms 4. 網(wǎng)絡(luò)調(diào)試助手 提取鏈接:https://pan.baidu.com/s/10spxZmwMGI70USlzkOzdxg?pwd=fmxe 提取碼:fmxe 程序源碼提取連接放置文章底部,需者自提

    2024年02月02日
    瀏覽(29)
  • 利用stm32+app inventor與esp8266通信

    利用stm32+app inventor與esp8266通信

    本章實驗的目的是將手機連接上ESP8266提供的WIFI網(wǎng)絡(luò),打開自定義的app連接ESP8266的ip地址及端口號,實現(xiàn)app與ESP8266模塊的通信,進而達到app控制32開發(fā)板的目的,并將開發(fā)板上面的數(shù)據(jù)返回到app上顯示出來。 ??關(guān)于stm32與esp8266之間的通信,在前面的文章中已經(jīng)介紹得差不多

    2023年04月11日
    瀏覽(24)
  • (2)STM32+ESP8266+手機網(wǎng)絡(luò)助手實現(xiàn)AP模式通信

    (2)STM32+ESP8266+手機網(wǎng)絡(luò)助手實現(xiàn)AP模式通信

    根據(jù)手頭要實現(xiàn)的需求, 我需要通過手機端向32端發(fā)送指令,32端進行判斷執(zhí)行,所以采用esp8266的AP模式,將esp8266模塊本身作為熱點服務(wù)器,手機端作為客戶端,連接熱點WiFi發(fā)送數(shù)據(jù) 。 STM32rct6板、esp8266(ESP-01S)、手機端網(wǎng)絡(luò)助手app wifi模塊直接與TTL轉(zhuǎn)串口模塊相連即可,RX

    2024年02月07日
    瀏覽(22)
  • STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng) 保姆級教學(xué)(附代碼) --3. STM32硬件連接+keil代碼修改

    STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng) 保姆級教學(xué)(附代碼) --3. STM32硬件連接+keil代碼修改

    提示:這里是從實際應(yīng)用如何使用教學(xué)配置,未從原理講解,適合小白從零開始到成功,比較有成就感 STM32+ESP8266(AT固件)連接阿里云物聯(lián)網(wǎng)系列保姆級教學(xué) 1. 創(chuàng)建產(chǎn)品和設(shè)備 2. 設(shè)置產(chǎn)品Topic數(shù)據(jù)和功能定義設(shè)備物模型數(shù)據(jù)顯示 3. 硬件連接+代碼修改 4. Web數(shù)據(jù)可視化 5.功能

    2024年02月05日
    瀏覽(26)
  • ESP8266 -- STM32與阿里云物聯(lián)網(wǎng)平臺建立通信(四)

    ESP8266 -- STM32與阿里云物聯(lián)網(wǎng)平臺建立通信(四)

    目錄 鏈接快速定位 前沿 1 準備工作 2 硬件環(huán)境介紹 3 軟件環(huán)境介紹 3.1 串口初始化及配置 3.2 編寫AT MQTT指令代碼 3.2.1 ESP8266_Cmd函數(shù)介紹 3.2.2 wifi連接函數(shù)介紹 3.2.3 云端連接語句介紹 3.2.4 環(huán)回消息測試語句介紹 3.2.5 屬性上報語句介紹 3.2.6 設(shè)置屬性語句介紹 4 實驗現(xiàn)象 4.1 代碼

    2024年02月04日
    瀏覽(49)
  • 入門小白:STM32hal庫實現(xiàn)ESP8266與手機通信(不定長數(shù)據(jù)收發(fā)和ESP8266使用的一些問題)

    入門小白:STM32hal庫實現(xiàn)ESP8266與手機通信(不定長數(shù)據(jù)收發(fā)和ESP8266使用的一些問題)

    目錄 前言 一、stm32cubeMX的串口配置 二、空閑中斷+dma接收 三、ESP8266.c和ESP8266.h ESP8266.h ESP8266.c 注意事項 四、與手機通信例程 步驟: ?例程代碼main.c 運行結(jié)果 五、相關(guān)問題 總結(jié) 相關(guān)的app和源碼 ? ? ? ? 前提: 1.掌握串口通信和ESP8266的使用方法 串口通信:單片機串口通信

    2024年02月07日
    瀏覽(25)
  • STM32+esp8266實現(xiàn)單片機與服務(wù)器的WiFi通信

    STM32+esp8266實現(xiàn)單片機與服務(wù)器的WiFi通信

    ? ? ? ? ?源碼已上傳至gitee: stm32: 一些stm32模塊使用經(jīng)驗記錄 - Gitee.com https://gitee.com/lrf1125962926/stm32/tree/esp8266wifi%E9%80%9A%E4%BF%A1/ ????????本實驗采用STM32F1系列+esp8266 01s模塊,采用HAL庫開發(fā)。主控芯片哪個系列和型號都可以,只要有兩個串口(UART或者USART,以下統(tǒng)稱串口)

    2024年02月07日
    瀏覽(96)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包