(备份)esp32 串口,i2c ,spi 初始化结构体和初始化函数

3协议的模板

1.esp32  串口

typedef struct {
    int baud_rate;              // 波特率
    uart_word_length_t data_bits;  // 数据位
    uart_parity_t parity;          // 校验位
    uart_stop_bits_t stop_bits;    // 停止位
    uart_hw_flowcontrol_t flow_ctrl;  // 流控制
    uint8_t rx_flow_ctrl_thresh;   // RX流控制阈值(启用时)
    uint8_t source_clk;            // 源时钟
} uart_config_t;


void init_uart() {
    // 定义并配置 UART 初始化结构体
    uart_config_t uart_config = {
        .baud_rate = 115200,                    // 设置波特率为115200
        .data_bits = UART_DATA_8_BITS,          // 数据位设置为8位
        .parity = UART_PARITY_DISABLE,          // 禁用校验位
        .stop_bits = UART_STOP_BITS_1,          // 停止位设置为1位
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,  // 禁用硬件流控制
        .source_clk = UART_SCLK_APB,            // 使用 APB 时钟
    };

    // 使用配置结构体初始化 UART
    uart_param_config(UART_NUM, &uart_config);

    // 设置 UART 引脚 (TX: GPIO4, RX: GPIO5)
    uart_set_pin(UART_NUM, 4, 5, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    // 安装 UART 驱动程序,使用默认缓冲区大小
    uart_driver_install(UART_NUM, BUF_SIZE, 0, 0, NULL, 0);
}


2. i2c

typedef struct {
    i2c_mode_t mode;           // I2C模式:主机或从机
    int sda_io_num;            // SDA引脚编号
    int scl_io_num;            // SCL引脚编号
    int sda_pullup_en;         // SDA上拉启用
    int scl_pullup_en;         // SCL上拉启用
    uint32_t master_clk_speed; // 主机模式下的时钟速度
    uint32_t clk_flags;        // 时钟标志
} i2c_config_t;

void init_i2c() {
    // 定义并配置 I2C 初始化结构体
    i2c_config_t i2c_config = {
        .mode = I2C_MODE_MASTER,          // 设置I2C为主机模式
        .sda_io_num = I2C_MASTER_SDA_IO,  // 设置SDA引脚
        .scl_io_num = I2C_MASTER_SCL_IO,  // 设置SCL引脚
        .sda_pullup_en = GPIO_PULLUP_ENABLE,  // 启用SDA上拉
        .scl_pullup_en = GPIO_PULLUP_ENABLE,  // 启用SCL上拉
        .master_clk_speed = I2C_MASTER_FREQ_HZ,  // 设置I2C频率
    };

    // 使用配置结构体初始化 I2C
    i2c_param_config(I2C_MASTER_NUM, &i2c_config);

    // 安装 I2C 驱动程序
    i2c_driver_install(I2C_MASTER_NUM, i2c_config.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}

3. spi

ESP32 的 SPI 驱动程序使用两个主要的结构体来配置 SPI:

spi_bus_config_t: 用于配置 SPI 总线的参数。
spi_device_interface_config_t: 用于配置 SPI 设备接口的参数。

typedef struct {
    int mosi_io_num;           // MOSI 引脚编号
    int miso_io_num;           // MISO 引脚编号
    int sclk_io_num;           // SCLK 引脚编号
    int quadwp_io_num;         // 用于四线 SPI 写保护引脚
    int quadhd_io_num;         // 用于四线 SPI 保持引脚
    int max_transfer_sz;       // 最大传输大小
    uint32_t flags;            // 其他标志,如双工模式
    int intr_flags;            // 中断标志
} spi_bus_config_t;

typedef struct {
    int command_bits;           // 命令相位位数
    int address_bits;           // 地址相位位数
    int dummy_bits;             // 哑相位位数
    int mode;                   // SPI 模式 (0-3)
    int duty_cycle_pos;         // SPI 时钟占空比
    int cs_ena_pretrans;        // 在传输之前启用 CS
    int cs_ena_posttrans;       // 在传输之后启用 CS
    int clock_speed_hz;         // SPI 时钟频率
    int spics_io_num;           // CS 引脚编号
    int flags;                  // 设备标志
    int queue_size;             // 事务队列大小
    void (*pre_cb)(spi_transaction_t *trans);  // 传输之前的回调
    void (*post_cb)(spi_transaction_t *trans); // 传输之后的回调
} spi_device_interface_config_t;


void init_spi() {
    // 配置 SPI 总线
    spi_bus_config_t buscfg = {
        .mosi_io_num = PIN_NUM_MOSI,       // MOSI 引脚
        .miso_io_num = PIN_NUM_MISO,       // MISO 引脚
        .sclk_io_num = PIN_NUM_SCLK,       // SCLK 引脚
        .quadwp_io_num = -1,               // 四线 SPI 写保护引脚,未使用
        .quadhd_io_num = -1,               // 四线 SPI 保持引脚,未使用
        .max_transfer_sz = 4096            // 最大传输大小(字节)
    };

    // 初始化 SPI 总线
    esp_err_t ret = spi_bus_initialize(HSPI_HOST, &buscfg, 1);
    if (ret != ESP_OK) {
        printf("Failed to initialize SPI bus\n");
        return;
    }

    // 配置 SPI 设备接口
    spi_device_interface_config_t devcfg = {
        .clock_speed_hz = 10*1000*1000,           // SPI 时钟频率,10MHz
        .mode = 0,                                // SPI 模式 0
        .spics_io_num = PIN_NUM_CS,               // CS 引脚
        .queue_size = 7,                          // 事务队列大小
    };

    // 将设备添加到 SPI 总线上
    spi_device_handle_t spi;
    ret = spi_bus_add_device(HSPI_HOST, &devcfg, &spi);
    if (ret != ESP_OK) {
        printf("Failed to add SPI device\n");
        return;
    }

    // 现在可以使用 spi 进行 SPI 通信
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值