Microwave_Manager/main/main.c

198 lines
5.8 KiB
C
Raw Normal View History

2024-08-05 21:31:12 +08:00
#include <stdio.h>
#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 <string.h>
#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);
}