From 0e8af8fa302219c1f3c769969a04a37aee66b96c Mon Sep 17 00:00:00 2001 From: qiuxin Date: Tue, 3 Jun 2025 13:53:10 +0800 Subject: [PATCH] =?UTF-8?q?refactor(io):=20=E9=87=8D=E6=9E=84=20TCA6416=20?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E9=80=BB=E8=BE=91=20=E5=86=99IO=E6=88=90?= =?UTF-8?q?=E5=8A=9F=20-=20=E4=BC=98=E5=8C=96=20TCA6416=20=E8=8A=AF?= =?UTF-8?q?=E7=89=87=E7=9A=84=E5=88=9D=E5=A7=8B=E5=8C=96=E5=92=8C=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E9=80=BB=E8=BE=91=20-=20=E6=B7=BB=E5=8A=A0=20TCA6416?= =?UTF-8?q?=5FWritePort=5Fbuff=20=E7=BC=93=E5=86=B2=E5=8C=BA=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E5=AD=98=E5=82=A8=E8=BE=93=E5=87=BA=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=20-=20=E4=BF=AE=E6=94=B9=E4=B8=BB=E4=BB=BB=E5=8A=A1=E4=B8=AD?= =?UTF-8?q?=20TCA6416=20=E7=9B=B8=E5=85=B3=E7=9A=84=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E9=AB=98=E7=A8=B3=E5=AE=9A=E6=80=A7=E5=92=8C?= =?UTF-8?q?=E5=8F=AF=E9=9D=A0=E6=80=A7=20-=20=E8=B0=83=E6=95=B4=20TCA6416?= =?UTF-8?q?=20=E5=9C=B0=E5=9D=80=E5=AE=9A=E4=B9=89=EF=BC=8C=E9=80=82?= =?UTF-8?q?=E5=BA=94=E7=A1=AC=E4=BB=B6=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Src/freertos.c | 39 ++++++++++++------------- Core/Src/main.c | 1 + MDK-ARM/controller_pcba.uvoptx | 15 ++++++++++ User/application/inc/TCA6416.h | 2 +- User/application/src/tcpserverc.c | 48 ++++++++++++++++++++++++++----- 5 files changed, 76 insertions(+), 29 deletions(-) diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 8edb12f..d5810b4 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -171,6 +171,7 @@ DMA_HandleTypeDef hdma_uart6_tx; // UART6发送DMA句柄 /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ extern float current_buff[2]; +extern uint8_t TCA6416_WritePort_buff[2]; extern struct netif gnetif; extern ETH_HandleTypeDef heth; @@ -262,7 +263,7 @@ void MX_FREERTOS_Init(void) osThreadDef(io_control_task, start_io_control_task, osPriorityNormal, 0, 256); io_control_taskHandle = osThreadCreate(osThread(io_control_task), NULL); - /* DAC控制任务 - 合并DAC161S997和DAC8568控制 */ + /* DAC控制任务 DAC8568控制 */ osThreadDef(dac_control_task, start_dac_control_task, osPriorityBelowNormal, 0, 256); dac_control_taskHandle = osThreadCreate(osThread(dac_control_task), NULL); @@ -474,10 +475,16 @@ void start_io_control_task(void const *argument) tca6416_init2_result = TCA6416_Init2(); tca6416_init3_result = TCA6416_Init3(); - // 配置TCA6416端口方向 - TCA6416_SetPortDirection(0, 0x00); // Port0输出 - TCA6416_SetPortDirection(1, 0x00); // Port1输出 + // 配置第一个TCA6416芯片的端口方向和输出状态 + if(tca6416_init_result == 0) // 确保初始化成功 + { + // 设置端口为输出模式 + TCA6416_SetPortDirection(0, 0x00); // Port0输出 + TCA6416_SetPortDirection(1, 0x00); // Port1输出 + osDelay(5); + } + // 配置其他两个芯片的端口方向 if(tca6416_init2_result == 0) { TCA6416_SetPortDirection2(0, 0xFF); // Port0输入 @@ -496,20 +503,12 @@ void start_io_control_task(void const *argument) // 获取信号量 if(osSemaphoreWait(io_semaphoreHandle, 100) == osOK) { - // 处理GPIO输入输出 - user_gpio_trigger(); - - // 读取TCA6416状态 - if(TCA6416_ReadPort(0, &tca6416_read_data) == 0) - { - tca6416_port0_status = tca6416_read_data; - } - - if(TCA6416_ReadPort(1, &tca6416_read_data) == 0) - { - tca6416_port1_status = tca6416_read_data; - } - + TCA6416_WritePort(0, TCA6416_WritePort_buff[1]); + osDelay(5); + TCA6416_WritePort(1, TCA6416_WritePort_buff[0]); + osDelay(5); + + // 读取其他芯片状态 if(tca6416_init2_result == 0) { if(TCA6416_ReadPort2(0, &tca6416_read_data) == 0) @@ -539,6 +538,7 @@ void start_io_control_task(void const *argument) // 释放信号量 osSemaphoreRelease(io_semaphoreHandle); } + // 200ms扫描周期 osDelay(200); @@ -734,10 +734,7 @@ void start_usart6_test_task(void const *argument) } /* USER CODE END start_usart6_test_task */ } -void start_usart6_dma_test_task(void const *argument) -{ -} void test_tca6416_task(void const *argument) { diff --git a/Core/Src/main.c b/Core/Src/main.c index 9569a70..6126f09 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -75,6 +75,7 @@ uart_t hart2_uart2 = {0}; uart_t hart1_uart5 = {0}; uart_t usb_uart1 = {0}; float current_buff[2] = {12.0f, 0};//设置初始电流为12ma +uint8_t TCA6416_WritePort_buff[2] = {0, 0}; uint8_t tcp_echo_flags_hart1 = 0; uint8_t tcp_echo_flags_hart2 = 0; diff --git a/MDK-ARM/controller_pcba.uvoptx b/MDK-ARM/controller_pcba.uvoptx index 8b02664..d9e5ad9 100644 --- a/MDK-ARM/controller_pcba.uvoptx +++ b/MDK-ARM/controller_pcba.uvoptx @@ -250,6 +250,21 @@ 1 dac161s997_status_reg + + 20 + 1 + tca6416_error_count + + + 21 + 1 + TCA6416_WritePort_buff[0] + + + 22 + 1 + TCA6416_WritePort_buff[1] + 0 diff --git a/User/application/inc/TCA6416.h b/User/application/inc/TCA6416.h index 2aa8f2d..ae131a6 100644 --- a/User/application/inc/TCA6416.h +++ b/User/application/inc/TCA6416.h @@ -18,7 +18,7 @@ #define TCA6416_SDA_PORT2 GPIOE /* TCA6416 I2C地址 */ -#define TCA6416_ADDR 0x20 // 第一个芯片地址 (A0=A1=A2=GND)单独总线,SDA PE3 SCL PE4 +#define TCA6416_ADDR 0x20 // 第一个芯片地址 (A0=A1=A2=GND)单独总线,SDA PE3 SCL PE2 #define TCA6416_ADDR2 0x21 // 第二个芯片地址 (A0=1, A1=A2=GND)与TCA6416_ADDR3共用总线,SDA PE4 SCL PE5 #define TCA6416_ADDR3 0x20 // 第三个芯片地址 (与第二个芯片共用总线,地址0x20) diff --git a/User/application/src/tcpserverc.c b/User/application/src/tcpserverc.c index fea7360..0c4a3d5 100644 --- a/User/application/src/tcpserverc.c +++ b/User/application/src/tcpserverc.c @@ -26,6 +26,9 @@ #include "task.h" #include "cmsis_os.h" +// 添加外部信号量声明 +extern osSemaphoreId io_semaphoreHandle; // 添加IO控制信号量外部声明 + // 添加test_adc_read_data变量定义 uint8_t test_adc_read_data[74] = {0}; // 74字节的测试数据缓冲区 @@ -51,6 +54,7 @@ extern uint8_t tcp_echo_flags_ble2; extern uint8_t tcp_echo_flags_control; extern uint8_t send_data_flag_cmd; extern float current_buff[2]; // 只声明,不初始化 +extern uint8_t TCA6416_WritePort_buff[2]; extern uint8_t uart_echo_flags_hart1; extern uint8_t uart_echo_flags_hart2; @@ -805,14 +809,44 @@ static err_t tcpecho_recv_control(void *arg, struct tcp_pcb *tpcb, struct pbuf * current_buff [0] = (float)dac161s_value / 1000.0f; - + //中间4个字节是比例阀 // 数字量输出刷新第一个芯片的输出状态 - if(tcp_rx_data[27] != 0xFF || tcp_rx_data[28] != 0xFF) { // 只在值变化时更新 - TCA6416_WritePort(0, tcp_rx_data[27]); // 直接写入Port0的值8-15 - osDelay(5); - TCA6416_WritePort(1, tcp_rx_data[28]); // 写入Port1的值0-7 - osDelay(5); - } + TCA6416_WritePort_buff[0] = tcp_rx_data[31]; + TCA6416_WritePort_buff[1] = tcp_rx_data[32]; + // if(tcp_rx_data[27] != 0xFF || tcp_rx_data[28] != 0xFF) + // { // 只在值变化时更新 + // // 获取信号量保护 + // if(osSemaphoreWait(io_semaphoreHandle, 100) == osOK) + // { + // // 设置输出前先确认端口方向 + // TCA6416_SetPortDirection(0, 0x00); // 确保Port0为输出 + // osDelay(5); + // TCA6416_SetPortDirection(1, 0x00); // 确保Port1为输出 + // osDelay(5); + + // // 写入输出值 + // TCA6416_WritePort(0, tcp_rx_data[27]); // Port0的值8-15 + // osDelay(5); + // TCA6416_WritePort(1, tcp_rx_data[28]); // Port1的值0-7 + // osDelay(5); + + // // 验证写入是否成功 + // uint8_t verify0, verify1; + // if(TCA6416_ReadPort(0, &verify0) == 0 && TCA6416_ReadPort(1, &verify1) == 0) + // { + // if(verify0 != tcp_rx_data[27] || verify1 != tcp_rx_data[28]) + // { + // // 如果验证失败,重试一次 + // TCA6416_WritePort(0, tcp_rx_data[27]); + // osDelay(5); + // TCA6416_WritePort(1, tcp_rx_data[28]); + // } + // } + + // // 释放信号量 + // osSemaphoreRelease(io_semaphoreHandle); + // } + // } // 保存设置的数据到adc_set_data数组 memcpy(adc_set_data, tcp_rx_data + 9, body_len);