106-ESP32_SDK開發-SPI


<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnESP32" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

 

說明

ESP32共有4路SPI, SPI0,SPI1,SPI2,SPI3

同時SPI2還取了個別名叫做 HSPI ;  同時SPI3還取了個別名叫做 VSPI

SPI0,SPI1是只訪問緩存芯片使用,可以用來給模組用來擴容ram.

SPI0,SPI1的引腳分布在

GPIO6(SPI_CLK);  GPIO7(SPI_Q);  GPIO8(SPI_D);  GPIO9(SPI_HD);  GPIO10(SPI_WP);  GPIO11(SPI_CS0);

用戶不要使用這些引腳作為普通IO使用.關於SPI0和SPI1的使用會在以后的教程里面.

這節教程是學習SPI2(HSPI)和SPI3(VSPI);   HSPI和VSPI使用是一樣的哈.

如果按照下圖分配引腳(不包含CS引腳), SPI的傳輸速率可以達到80M

 

 

 

咱們就以HSPI為例(基礎使用)

1.配置HSPI信號線的參數

 

 

 

2.配置數據傳輸參數

 

 

3.設置傳輸的數據,和發送數據

 

 

#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "driver/timer.h"
#include "esp_timer.h"
#include "driver/uart.h"
#include "esp_log.h"
#include "driver/spi_master.h"


#define PIN_NUM_MISO 12
#define PIN_NUM_MOSI 13
#define PIN_NUM_CLK  14
#define PIN_NUM_CS   15

spi_device_handle_t spi_device;//存儲所配置的SPI句柄

void app_main(void)
{
    esp_err_t ret;

    //配置SPI總線參數
    spi_bus_config_t buscfg={
        .miso_io_num = PIN_NUM_MISO,//設置主機輸入從機輸出引腳(接收數據引腳)
        .mosi_io_num = PIN_NUM_MOSI,//設置主機輸出從機輸入引腳(發送數據引腳)
        .sclk_io_num = PIN_NUM_CLK,//設置時鍾引腳
        .quadwp_io_num = -1,//不使用wp信號線
        .quadhd_io_num = -1,//不使用hd信號線
        .max_transfer_sz = SOC_SPI_MAXIMUM_BUFFER_SIZE,//一次性最大傳輸字節個數;默認為SOC_SPI_MAXIMUM_BUFFER_SIZE(啟用DMA時需要設置為0)
    };
    //初始化配置SPI總線(配置HSPI);最后設置為0為不啟用DMA
    ret = spi_bus_initialize(HSPI_HOST, &buscfg, 0);
    ESP_ERROR_CHECK(ret);


    //配置SPI數據傳輸參數(可以新建多個這種結構體變量,相當於掛載SPI設備,一個SPI最多掛載3個設備,需要設置不同的片選引腳)
    spi_device_interface_config_t devcfg={
        .address_bits=0,                        //不需要地址數據
        .clock_speed_hz=40*1000*1000,           //頻率40M
        .command_bits=0,                        //不需要命令數據
        .mode=0,                                //SPI模式(0,1,2,3)
        .spics_io_num=PIN_NUM_CS,               //設置CS引腳
        .queue_size=1,                          //傳輸(事務)隊列大小(必須設置,先設置1,后面會說明這個有什么用)
    };
    //把傳輸參數配置進SPI總線
    ret = spi_bus_add_device(HSPI_HOST, &devcfg, &spi_device);
    ESP_ERROR_CHECK(ret);


    /*設置傳輸的數據*/
    const char spi_data[2]={0xaa,0x55};//2字節數據
    /*傳輸事務*/
    spi_transaction_t spi_transaction;
    memset(&spi_transaction, 0, sizeof(spi_transaction)); 

    spi_transaction.tx_buffer=spi_data; //發送的數據地址
    spi_transaction.length=2*8;         //傳輸數據大小(以數據位為單位);傳兩字節數據所以是2*8
    
    while(1){
        spi_device_transmit(spi_device, &spi_transaction);//使用SPI發送數據

        vTaskDelay(1000 / portTICK_PERIOD_MS); 
    }
}

 

 

 

 

3.關於上面的  配置SPI數據傳輸參數  里面的 命令和地址數據個數

在SPI傳輸的時候就是使用SPI傳輸的數據, 有時候咱想訪問一個芯片,假設是讀取芯片上的某個地址上的數據;

那個芯片的手冊上一般會說需要先使用SPI發送個什么命令,然后再發送個什么地址,然后就可以讀取到數據了.

實際上就是使用SPI發送個數據然后再使用SPI發送個數據嘛.只不過發送的第一個數據叫做xxxx命令

第二個數據就做xxx地址...............

假設在傳輸上面的0xAA和0x55之前,想先發送個0x11命令數據

 

 

 

 

 

假設在傳輸上面的0xAA和0x55之前,想先發送個0x11命令數據,然后再發送個地址數據0x22

 

 

 

4.關於傳輸事務大小

 

 

假設我們需要傳輸多條數據,那個傳輸事務大小就起作用了

我設置的為8,就是隊列最大可以保存8條要傳輸的事務.

下面增加了一個傳輸事務.

傳輸的時候把要傳輸的事務放到 spi_device_polling_transmit 函數就可以了

 

 

底層默認傳輸事務之間的時間間隔為35us左右

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM