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 通信
}