198 lines
5.8 KiB
C
198 lines
5.8 KiB
C
#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);
|
||
}
|