diff --git a/Core/Inc/main.h b/Core/Inc/main.h
index 56f090b..d02e0b8 100644
--- a/Core/Inc/main.h
+++ b/Core/Inc/main.h
@@ -101,10 +101,9 @@ extern "C"
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
-#define DI_CH5_Pin GPIO_PIN_2
-#define DI_CH5_GPIO_Port GPIOE
-#define DI_CH6_Pin GPIO_PIN_3
-#define DI_CH6_GPIO_Port GPIOE
+#define TCA6416_IIC3_SCL GPIO_PIN_2
+#define TCA6416_IIC3_SDA GPIO_PIN_3
+#define TCA6416_IIC3_GPIO_Port GPIOE
#define ETH_RESET_Pin GPIO_PIN_0
#define ETH_RESET_GPIO_Port GPIOC
#define T3_CH3_BUZZER_Pin GPIO_PIN_0
diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c
index 4a4763c..b4c75f9 100644
--- a/Core/Src/freertos.c
+++ b/Core/Src/freertos.c
@@ -33,6 +33,7 @@
#include "gpio.h"
#include "tcpserverc.h"
#include "lwip.h"
+#include "lwip/tcp.h" // 添加TCP相关定义
#include "uart_lcd.h"
#include "user_gpio.h"
#include "linear_encoder.h"
@@ -71,6 +72,13 @@ osThreadId ec11_taskHandle;
osThreadId ad7124_test_taskHandle;
osThreadId usart6_test_taskHandle; // 添加USART6测试任务句柄
+// 添加调试变量
+static volatile uint32_t uart6_dr_raw = 0; // UART数据寄存器的原始值
+static volatile uint8_t uart6_data_bits = 0; // 数据位(8位)
+static volatile uint8_t uart6_parity_bit = 0; // 校验位
+static volatile uint8_t uart6_stop_bits = 0; // 停止位
+static volatile uint8_t uart6_error_flags = 0; // 错误标志
+
// 添加RTS引脚监控变量
volatile GPIO_PinState rts_pin_state = GPIO_PIN_RESET; // RTS引脚当前状态
volatile GPIO_PinState rst_pin_state = GPIO_PIN_RESET; // RTS引脚当前状态
@@ -186,8 +194,8 @@ void MX_FREERTOS_Init(void)
// ad7124_test_taskHandle = osThreadCreate(osThread(ad7124_test_task), NULL);
/* HART测试任务 */
- // osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128);
- // usart6_test_taskHandle = osThreadCreate(osThread(usart6_test_task), NULL);
+ osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128);
+ usart6_test_taskHandle = osThreadCreate(osThread(usart6_test_task), NULL);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
@@ -437,8 +445,7 @@ void start_usart6_test_task(void const *argument)
{
/* USER CODE BEGIN start_usart6_test_task */
uint8_t rx_buffer[1]; // 接收缓冲区
- uint8_t tcp_tx_data[300] = {0}; // TCP发送缓冲区
- uint16_t tx_data_len = 0;
+ err_t err;
// 确保UART6已正确初始化
if (huart6.Instance == NULL) {
@@ -454,6 +461,13 @@ void start_usart6_test_task(void const *argument)
huart6.Init.Mode = UART_MODE_TX_RX;
huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart6.Init.OverSampling = UART_OVERSAMPLING_16;
+
+ // 清除所有标志位
+ __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_RXNE);
+ __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_PE);
+ __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_FE);
+ __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_ORE);
+
if (HAL_UART_Init(&huart6) != HAL_OK) {
Error_Handler();
}
@@ -461,43 +475,66 @@ void start_usart6_test_task(void const *argument)
/* Infinite loop */
for(;;)
{
- // 使用HAL库函数检查接收状态
- if (HAL_UART_GetState(&huart6) == HAL_UART_STATE_READY)
+ // 直接检查接收标志
+ if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_RXNE))
{
- // 尝试接收一个字节,超时时间设为0
- if (HAL_UART_Receive(&huart6, rx_buffer, 1, 0) == HAL_OK)
+ // 读取数据寄存器的原始值
+ uart6_dr_raw = huart6.Instance->DR;
+
+ // 解析数据寄存器的各个位
+ uart6_data_bits = (uint8_t)(uart6_dr_raw & 0xFF); // 低8位是数据位
+ uart6_parity_bit = (uint8_t)((uart6_dr_raw >> 8) & 0x1); // 第9位是校验位
+ uart6_stop_bits = (uint8_t)((uart6_dr_raw >> 9) & 0x3); // 第10-11位是停止位
+
+ // 存储错误标志
+ uart6_error_flags = 0;
+ if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_PE)) uart6_error_flags |= 0x01;
+ if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_FE)) uart6_error_flags |= 0x02;
+ if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_ORE)) uart6_error_flags |= 0x04;
+
+ // 使用数据位作为接收数据
+ rx_buffer[0] = uart6_data_bits;
+
+ // 检查是否有接收错误
+ if (uart6_error_flags == 0)
{
// 检查TCP连接状态
if (server_pcb_control != NULL && tcp_echo_flags_control == 1)
{
- // 构造帧头等
- tcp_tx_data[0] = 0xD5; // 帧头1
- tcp_tx_data[1] = 0xC8; // 帧头2
- tcp_tx_data[2] = 0x00; // 帧长度高字节 (1 + 11 = 12)
- tcp_tx_data[3] = 0x0C; // 帧长度低字节
- tcp_tx_data[4] = 0x01; // 源地址高
- tcp_tx_data[5] = 0x02; // 源地址低
- tcp_tx_data[6] = 0x0A; // 目标地址高
- tcp_tx_data[7] = 0x0B; // 目标地址低
- tcp_tx_data[8] = 0x88; // 报文类型(透传)
-
- // 复制接收到的数据
- tcp_tx_data[9] = rx_buffer[0];
-
- // 计算校验和
- uint16_t checksum = 0;
- for (int i = 4; i < 10; i++)
+ // 尝试发送数据
+ err = tcp_write(server_pcb_control, rx_buffer, 1, 1);
+ if (err == ERR_OK)
{
- checksum += tcp_tx_data[i];
+ err = tcp_output(server_pcb_control);
+ if (err != ERR_OK)
+ {
+ // TCP输出失败,可能需要重新建立连接
+ tcp_abort(server_pcb_control);
+ server_pcb_control = NULL;
+ tcp_echo_flags_control = 0;
+ }
+ }
+ else if (err == ERR_MEM)
+ {
+ // 内存不足,等待一段时间后重试
+ vTaskDelay(10);
+ }
+ else
+ {
+ // 其他错误,关闭连接
+ tcp_abort(server_pcb_control);
+ server_pcb_control = NULL;
+ tcp_echo_flags_control = 0;
}
- tcp_tx_data[10] = 0x00; // 校验和高字节
- tcp_tx_data[11] = checksum & 0xFF; // 校验和低字节
-
- // 发送数据
- tx_data_len = 12; // 总长度 = 数据长度(1) + 帧头(2) + 帧长(2) + 源地址(2) + 目标地址(2) + 类型(1) + 校验(2)
- user_send_data_control(tcp_tx_data, tx_data_len);
}
}
+ else
+ {
+ // 清除错误标志
+ __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_PE);
+ __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_FE);
+ __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_ORE);
+ }
}
vTaskDelay(1); // 给其他任务执行的机会
diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c
index 569d26e..0ff8448 100644
--- a/Core/Src/gpio.c
+++ b/Core/Src/gpio.c
@@ -73,10 +73,10 @@ void MX_GPIO_Init(void)
//HAL_GPIO_WritePin(HART1_RST_GPIO_Port, HART1_RST_Pin, GPIO_PIN_SET);
/*Configure GPIO pins : PEPin PEPin */
- GPIO_InitStruct.Pin = DI_CH5_Pin|DI_CH6_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+// GPIO_InitStruct.Pin = DI_CH5_Pin|DI_CH6_Pin;
+// GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+// GPIO_InitStruct.Pull = GPIO_PULLUP;
+// HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = ETH_RESET_Pin;
@@ -260,10 +260,10 @@ GPIO_PinState gpio_di_test(uint8_t gpio_num)
state = HAL_GPIO_ReadPin(DI_CH4_GPIO_Port, DI_CH4_Pin);
break;
case DI_5:
- state = HAL_GPIO_ReadPin(DI_CH5_GPIO_Port, DI_CH5_Pin);
+ //state = HAL_GPIO_ReadPin(DI_CH5_GPIO_Port, DI_CH5_Pin);
break;
case DI_6:
- state = HAL_GPIO_ReadPin(DI_CH6_GPIO_Port, DI_CH6_Pin);
+ //state = HAL_GPIO_ReadPin(DI_CH6_GPIO_Port, DI_CH6_Pin);
break;
default:
state = GPIO_PIN_RESET;
diff --git a/MDK-ARM/controller_pcba.uvoptx b/MDK-ARM/controller_pcba.uvoptx
index 54e41ff..0061ec1 100644
--- a/MDK-ARM/controller_pcba.uvoptx
+++ b/MDK-ARM/controller_pcba.uvoptx
@@ -235,6 +235,36 @@
1
rst_pin_state
+
+ 17
+ 1
+ uart6_raw_data,0x10
+
+
+ 18
+ 1
+ uart6_full_data
+
+
+ 19
+ 1
+ uart6_dr_raw
+
+
+ 20
+ 1
+ uart6_data_bits
+
+
+ 21
+ 1
+ uart6_parity_bit
+
+
+ 22
+ 1
+ uart6_stop_bits
+
0
diff --git a/Public/HT1200.pdf b/Public/HT1200.pdf
new file mode 100644
index 0000000..c2bcb66
Binary files /dev/null and b/Public/HT1200.pdf differ