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