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);