ESP32 SPI GPIO

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32 SPI GPIO相关的知识,希望对你有一定的参考价值。

参考技术A ESP32芯片具有以下Strapping pins:

GPIO 0

GPIO 2

GPIO 4

GPIO 5(启动期间必须为高)

GPIO 12(启动期间必须低)

GPIO 15(启动期间必须为高)

Pins 1 and 3 are REPL UART TX and RX respectively

Pins 6, 7, 8, 11, 16, and 17 are used for connecting the embedded flash, and are not recommended for other uses

Pins 34-39 are input only, and also do not have internal pull-up resistors

The pull value of some pins can be set to Pin.PULL_HOLD to reduce power consumption during deepsleep.

ESP-C3入门2. 基于IDF的GPIO基本操作

ESP-C3入门2. 基于IDF的GPIO基本操作

一、ESP32-C3的GPIO口资源

ESP32-C3有22个物理GPIO管脚,编号从0~21。
每个管脚可用作通用IO,或连接一个内部的外设信号。

GPIO引脚特殊功能介绍:

GPIO模拟功能注释
GPIO0ADC1_CH0RTC
GPIO1ADC1_CH1RTC
GPIO2ADC1_CH2Strapping 管脚;RTC
GPIO3ADC1_CH3RTC
GPIO4ADC1_CH4RTC
GPIO5ADC2_CH0RTC
GPIO6
GPIO7
GPIO8Strapping 管脚
GPIO9Strapping 管脚
GPIO10
GPIO11
GPIO12SPI0/1
GPIO13SPI0/1
GPIO14SPI0/1
GPIO15SPI0/1
GPIO16SPI0/1
GPIO17SPI0/1
GPIO18USB-JTAG
GPIO19USB-JTAG
GPIO20
GPIO21

说明:

  • GPIO2、8、9是Strapping管脚;它们和芯片复位状态有关,在芯片的系统复位过程中,Strapping管脚对自己电平采样并存储到锁存器,一直保持到芯片掉电或关闭。避免把这几个端口使用到其它功能上。
  • GPIO12-17通常用于SPI flash和PSRAM,不推荐用作其它用途;
  • GPIO18、19默认用于USB-JTAG,如果用作GPIO将无法使用USB-JTAG;
  • RTC:GPIO0-5可以在Deep-sleep模式时使用。

二、重要的API

头文件位置:
components/driver/include/driver/gpio.h

1. gpio口配置函数

esp_err_t gpio_config(const gpio_config_t *pGPIOConfig)
端口可以设置以下模式:

  • pull-up
  • PullDown
  • IntrType
  • 参数: pGPIOConfig结构体
  • 返回: ERP_OK或ESP_ERR_INVALID_ARG

gpio_config_t 结构体

公共成员类型说明
pin_bit_maskunit64_tgpio引脚
modegpio_mode_t模式,input或oputput
pull_up_engpio_pullup_t是否启用内部上拉电阻,前提是已配置上拉电阻
pull_down_engpio_pulldown_t是否启用内部下拉电阻,前提是已配置下拉电阻
intr_typegpio_int_type_t中断类型

使用示例:

     gpio_set_pull_mode(3, GPIO_PULLUP_ONLY);
     gpio_set_pull_mode(4, GPIO_PULLUP_ONLY);
     gpio_set_pull_mode(5, GPIO_PULLUP_ONLY);
     gpio_config_t ioConfig = 
         .pin_bit_mask = (1ull<<3) || (1ull<<4) || (1ull<<5),
         .mode = GPIO_MODE_OUTPUT,
         .pull_up_en = 1
     ;
     gpio_config(&ioConfig);

2. gpio口复位函数

esp_err_t gpio_reset_pin(gpio_num_t gpio_num)

  • 设置为上拉、禁用输入、禁用输出
  • 参数: gpio口号
  • 返回: ESP_OK

3. 设置 gpio 方向

gpio_set_direction(gpio_num_tgpio_num, gpio_mode_tmode)

gpio_mode_tmode值

  • GPIO_MODE_DISABLE
  • GPIO_MODE_INPUT
  • GPIO_MODE_OUTPUT
  • GPIO_MODE_OUTPUT_OD
  • GPIO_MODE_INPUT_OUTPUT_OD
  • GPIO_MODE_INPUT_OUTPUT

4. GPIO输出高、低电平

gpio_set_level(gpio_num_t gpio_num, uint32_t level)
level:

  • 0 低电平
  • 1 高电平

5. 输入模式检测电平

gpio_get_level(gpio_num_t gpio_num)

6. 配置单个引脚内部上、下拉电阻

  • gpio_set_pull_mode(gpio_num_t gpio_num)
  • gpio_pullup_en(gpio_num_t gpio_num)
  • gpio_pullup_dis(gpio_num_t gpio_num)
  • gpio_pulldown_en(gpio_num_t gpio_num)
  • gpio_pulldown_dis(gpio_num_t gpio_num)

7. 配置内部上下拉电阻

esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull)
pull值列表:

  • GPIO_PULLUP_ONLY —— 仅上拉
  • GPIO_PULLDOWN_ONLY —— 仅下拉
  • GPIO_PULLUP_PULLDOWN —— 全部启用
  • GPIO_FLOATING —— 悬空

三、 示例

1. RGB轮流显示

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

void app_main()
    gpio_reset_pin(GPIO_NUM_3);
    gpio_reset_pin(GPIO_NUM_4);
    gpio_reset_pin(GPIO_NUM_5);
    gpio_set_direction(GPIO_NUM_3, GPIO_MODE_OUTPUT);
    gpio_set_direction(GPIO_NUM_4, GPIO_MODE_OUTPUT);
    gpio_set_direction(GPIO_NUM_5, GPIO_MODE_OUTPUT);

    int i=0;
    while(1)
        printf("r=%d,g=%d,b=%d \\n", i%3==0?0:1, i%3==1?0:1,i%3==2?0:1);
        //1为高电平,0为低电平
        gpio_set_level(GPIO_NUM_3,i%3==0?0:1);   // 红
        gpio_set_level(GPIO_NUM_4,i%3==1?0:1);   // 绿
        gpio_set_level(GPIO_NUM_5,i%3==2?0:1);   // 蓝

        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
        i++;
        if(i>2)i=0;
    

2. 读取GPIO值示例

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

void app_main()

    gpio_reset_pin(GPIO_NUM_6);
    gpio_set_direction(GPIO_NUM_6, GPIO_MODE_INPUT);
    // 配置下拉,默认低电平
    gpio_pulldown_en(GPIO_NUM_6);

    while (1)
    
        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
        int s = gpio_get_level(GPIO_NUM_6);
        printf("gpio6=%d \\n", s);
    

以上是关于ESP32 SPI GPIO的主要内容,如果未能解决你的问题,请参考以下文章

MicroPython ESP32通过sdcard模块软SPI读取SD卡实例

Arduino开发ESP32,求SPI接法

ESP32-IDF 02-4 外设-SPI

ESP32 单片机学习笔记 - 02 - 软件IIC&硬件SPI

ESP32学习笔记(19)——SPI(主机)接口使用

ESP32学习笔记(20)——SPI(从机)接口使用