#include #include "sdkconfig.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/i2c_master.h" #include "driver/uart.h" #include "driver/gpio.h" #include "cmd_parser.h" #include #define I2C_PORT -1 // Auto selecting #define I2C_MASTER_SCL_IO GPIO_NUM_9 #define I2C_MASTER_SDA_IO GPIO_NUM_8 // UART1 #define RX1_BUF_SIZE (1024) #define TX1_BUF_SIZE (512) #define TXD1_PIN (GPIO_NUM_21) #define RXD1_PIN (GPIO_NUM_20) // UART0 #define RX0_BUF_SIZE (1024) #define TX0_BUF_SIZE (512) #define TXD0_PIN (GPIO_NUM_1) #define RXD0_PIN (GPIO_NUM_0) // 任务句柄 static TaskHandle_t xHandleTaskUart0 = NULL; static TaskHandle_t xHandleTaskUart1 = NULL; static void vTaskUart0(void *pvParameters); static void vTaskUart1(void *pvParameters); static TaskHandle_t xHandleTaskDac = NULL; uint8_t power = 0; // 默认功率 int8_t cmd1[5] = {0xaf, 0x01, 0x01, 0x00, 0xfa}; char error_tag[] = "Error Command!\n"; // IIC任务 static void vTaskDac(void *pvParameter) { i2c_master_bus_config_t i2c_mst_config = { .clk_source = I2C_CLK_SRC_DEFAULT, .i2c_port = I2C_PORT, .scl_io_num = I2C_MASTER_SCL_IO, .sda_io_num = I2C_MASTER_SDA_IO, .glitch_ignore_cnt = 7, //.flags.enable_internal_pullup = true, }; i2c_master_bus_handle_t bus_handle; ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_config, &bus_handle)); i2c_device_config_t dev_cfg = { .dev_addr_length = I2C_ADDR_BIT_LEN_7, .device_address = 0x60, .scl_speed_hz = 100000, }; i2c_master_dev_handle_t dev_handle; ESP_ERROR_CHECK(i2c_master_bus_add_device(bus_handle, &dev_cfg, &dev_handle)); uint32_t dacv = 4095; uint8_t temp[3] = {0x40, 0x10, 0x00}; temp[1] = dacv >> 4; temp[2] = (dacv & 0xF) << 4; i2c_master_transmit(dev_handle, temp, 3, -1); while (1) { for (int32_t i = 0; i <= 4095; i += 5) { dacv = i; temp[1] = dacv >> 4; temp[2] = (dacv & 0xF) << 4; i2c_master_transmit(dev_handle, temp, 3, -1); vTaskDelay(10 / portTICK_PERIOD_MS); } vTaskDelay(3000 / portTICK_PERIOD_MS); } } // 初始化串口 void uart_init(void) { // 串口配置结构体 uart_config_t uart0_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .source_clk = UART_SCLK_APB, }; uart_param_config(UART_NUM_0, &uart0_config); // 设置串口 uart_set_pin(UART_NUM_0, TXD0_PIN, RXD0_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); uart_driver_install(UART_NUM_0, RX0_BUF_SIZE * 2, 0, 0, NULL, 0); // 串口参数配置->uart1 uart_config_t uart1_config = { .baud_rate = 4800, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .source_clk = UART_SCLK_APB, }; uart_param_config(UART_NUM_1, &uart1_config); // 设置串口 uart_set_pin(UART_NUM_1, TXD1_PIN, RXD1_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); uart_driver_install(UART_NUM_1, RX1_BUF_SIZE * 2, 0, 0, NULL, 0); } // 读串口0,写串口1 static void vTaskUart0(void *pvParameters) { uint8_t *data = (uint8_t *)malloc(RX0_BUF_SIZE + 1); for (;;) { // 获取串口1接收的数据 int rxBytes = uart_read_bytes(UART_NUM_0, data, RX0_BUF_SIZE, 10 / portTICK_PERIOD_MS); // 10ms读一次,一个系统滴答 if (rxBytes > 0) { data[rxBytes] = 0; int8_t cmd = parse_serial_command(data, rxBytes); // 将接收到的数据发出去 // uart_write_bytes(UART_NUM_1, (char *)data, rxBytes); if(cmd == 0x01) { uart_write_bytes(UART_NUM_0, cmd1, 5); }else if(cmd == 0x02) { uint8_t power = data[5]; } else { uart_write_bytes(UART_NUM_0, error_tag, strlen(error_tag)); } // uart_write_bytes(UART_NUM_1, "UART0 Got Message!\n", strlen("UART0 Got Message!\n")); // printf("UART0: Got one message!\n"); } } free(data); } // 读串口1,写串口0 static void vTaskUart1(void *pvParameters) { uint8_t *data = (uint8_t *)malloc(RX1_BUF_SIZE + 1); for (;;) { int rxBytes = uart_read_bytes(UART_NUM_1, data, RX1_BUF_SIZE, 10 / portTICK_PERIOD_MS); // 10ms读一次,一个系统滴答 if (rxBytes > 0) { data[rxBytes] = 0; // 将接收到的数据发出去 uart_write_bytes(UART_NUM_0, (char *)data, rxBytes); // uart_write_bytes(UART_NUM_0, "UART1 Got Message!\n", strlen("UART1 Got Message!\n")); // printf("UART1: Got one message!\n"); } } free(data); } void app_main(void) { // 串口初始化 uart_init(); xTaskCreate(vTaskUart0, // 任务函数 "vTaskUart0", // 任务名 4096, // 任务栈大小,单位 word, 4 字节 NULL, // 任务参数 2, // 任务优先级 xHandleTaskUart0); // 任务句柄 // 创建串口1任务 xTaskCreate(vTaskUart1, // 任务函数 "vTaskUart1", // 任务名 4096, // 任务栈大小,单位 word, 4 字节 NULL, // 任务参数 3, // 任务优先级 xHandleTaskUart1); // 任务句柄 xTaskCreate(vTaskDac, "vTaskDac", 2048, NULL, 2, xHandleTaskDac); }