通过测试排除了一些问题
This commit is contained in:
141
Src/main.c
141
Src/main.c
@@ -35,6 +35,7 @@
|
||||
#include "rs485.h"
|
||||
#include "net_socket.h"
|
||||
#include "net_select.h"
|
||||
#include "ch395f_test.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@@ -49,10 +50,8 @@
|
||||
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN PM */
|
||||
#define TS() do { \
|
||||
uint32_t _t = HAL_GetTick(); \
|
||||
printf("[%lu.%03lu] ", _t / 1000UL, _t % 1000UL); \
|
||||
} while(0)
|
||||
#define DBG_TAG "[MAIN]"
|
||||
#include "dbg_log.h"
|
||||
/* USER CODE END PM */
|
||||
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
@@ -64,7 +63,6 @@ rs485_handle_t g_rs485;
|
||||
uint8_t g_rs485_rx_buf[RS485_RX_BUF_SIZE];
|
||||
/* TCP Server Echo 测试 */
|
||||
static int s_listen_sock = -1;
|
||||
static uint8_t s_echo_buf[1500];
|
||||
/* USER CODE END PV */
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
@@ -119,84 +117,78 @@ int main(void)
|
||||
HAL_Delay(100);
|
||||
|
||||
/* BSD Socket API 初始化(包含 CH395F 复位/配置/协议栈初始化/多连接模式) */
|
||||
printf("[NET] init: %s\r\n",
|
||||
(net_init("192.168.1.100", "255.255.255.0", "192.168.1.1") == 0) ? "OK" : "FAIL");
|
||||
DBG_INFO("net init: %s",
|
||||
(net_init("192.168.1.100", "255.255.255.0", "192.168.1.1") == 0) ? "OK" : "FAIL");
|
||||
|
||||
/* 读取 MAC */
|
||||
uint8_t mac[6];
|
||||
ch395f_get_mac_addr(mac);
|
||||
printf("[CH395F] MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",
|
||||
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
DBG_INFO("MAC: %02X:%02X:%02X:%02X:%02X:%02X",
|
||||
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
|
||||
/* 强制 100M 全双工,建立 PHY 链路 */
|
||||
ch395f_set_phy(CH395F_PHY_100M_FULL);
|
||||
HAL_Delay(3000);
|
||||
uint8_t phy = ch395f_get_phy_status();
|
||||
const char *phy_str = "UNKNOWN";
|
||||
switch (phy) {
|
||||
case CH395F_PHY_DISCONN: phy_str = "DISCONNECT"; break;
|
||||
case CH395F_PHY_10M_FULL: phy_str = "10M FULL"; break;
|
||||
case CH395F_PHY_10M_HALF: phy_str = "10M HALF"; break;
|
||||
case CH395F_PHY_100M_FULL: phy_str = "100M FULL"; break;
|
||||
case CH395F_PHY_100M_HALF: phy_str = "100M HALF"; break;
|
||||
}
|
||||
printf("[CH395F] PHY: %s\r\n", phy_str);
|
||||
DBG_INFO("PHY: %s",
|
||||
(phy == CH395F_PHY_100M_FULL) ? "100M FULL" :
|
||||
(phy == CH395F_PHY_100M_HALF) ? "100M HALF" :
|
||||
(phy == CH395F_PHY_10M_FULL) ? "10M FULL" :
|
||||
(phy == CH395F_PHY_10M_HALF) ? "10M HALF" :
|
||||
(phy == CH395F_PHY_DISCONN) ? "DISCONNECT" : "UNKNOWN");
|
||||
|
||||
/* GD5F 初始化测试 */
|
||||
int ret = gd5f2gq5ue_init();
|
||||
const char *gd5f_str = "UNKNOWN";
|
||||
switch (ret) {
|
||||
case GD5F_OK: gd5f_str = "OK"; break;
|
||||
case GD5F_ERROR: gd5f_str = "ERROR"; break;
|
||||
case GD5F_BUSY_TIMEOUT: gd5f_str = "BUSY TIMEOUT"; break;
|
||||
case GD5F_ECC_ERROR: gd5f_str = "ECC ERROR"; break;
|
||||
case GD5F_PROGRAM_FAIL: gd5f_str = "PROGRAM FAIL"; break;
|
||||
case GD5F_ERASE_FAIL: gd5f_str = "ERASE FAIL"; break;
|
||||
case GD5F_ID_MISMATCH: gd5f_str = "ID MISMATCH"; break;
|
||||
}
|
||||
printf("[GD5F] init: %s\r\n", gd5f_str);
|
||||
DBG_INFO("NAND init: %s",
|
||||
(ret == GD5F_OK) ? "OK" :
|
||||
(ret == GD5F_ERROR) ? "ERROR" :
|
||||
(ret == GD5F_BUSY_TIMEOUT) ? "BUSY TIMEOUT" :
|
||||
(ret == GD5F_ECC_ERROR) ? "ECC ERROR" :
|
||||
(ret == GD5F_PROGRAM_FAIL) ? "PROGRAM FAIL" :
|
||||
(ret == GD5F_ERASE_FAIL) ? "ERASE FAIL" :
|
||||
(ret == GD5F_ID_MISMATCH) ? "ID MISMATCH" : "UNKNOWN");
|
||||
|
||||
/* TPAFE5160 ADC 测试 */
|
||||
int tp_ret = tpafe5160_init();
|
||||
printf("[TPAFE5160] init: %s\r\n",
|
||||
(tp_ret == TPAFE5160_OK) ? "OK" : "TIMEOUT");
|
||||
DBG_INFO("ADC init: %s",
|
||||
(tp_ret == TPAFE5160_OK) ? "OK" : "TIMEOUT");
|
||||
|
||||
/* SD2506 RTC 初始化测试 */
|
||||
int sd_ret = sd2506_init();
|
||||
printf("[SD2506] init: %s\r\n",
|
||||
(sd_ret == SD2506_OK) ? "OK" : "I2C ERROR");
|
||||
DBG_INFO("SD2506 init: %s",
|
||||
(sd_ret == SD2506_OK) ? "OK" : "I2C ERROR");
|
||||
|
||||
if (sd_ret == SD2506_OK) {
|
||||
/* 读取 ID */
|
||||
uint8_t sd_id[8];
|
||||
sd2506_get_id(sd_id);
|
||||
printf("[SD2506] ID: %02X%02X%02X%02X%02X%02X%02X%02X\r\n",
|
||||
sd_id[0], sd_id[1], sd_id[2], sd_id[3],
|
||||
sd_id[4], sd_id[5], sd_id[6], sd_id[7]);
|
||||
DBG_INFO("SD2506 ID: %02X%02X%02X%02X%02X%02X%02X%02X",
|
||||
sd_id[0], sd_id[1], sd_id[2], sd_id[3],
|
||||
sd_id[4], sd_id[5], sd_id[6], sd_id[7]);
|
||||
|
||||
/* 读取当前时间 */
|
||||
sd2506_time_t sd_time;
|
||||
sd2506_get_time(&sd_time);
|
||||
printf("[SD2506] time: %04d-%02d-%02d %02d:%02d:%02d (week %d)\r\n",
|
||||
sd_time.year, sd_time.month, sd_time.day,
|
||||
sd_time.hour, sd_time.minute, sd_time.second,
|
||||
sd_time.week);
|
||||
DBG_INFO("SD2506 time: %04d-%02d-%02d %02d:%02d:%02d (week %d)",
|
||||
sd_time.year, sd_time.month, sd_time.day,
|
||||
sd_time.hour, sd_time.minute, sd_time.second,
|
||||
sd_time.week);
|
||||
|
||||
/* 读取温度 */
|
||||
int8_t sd_temp;
|
||||
sd2506_get_temperature(&sd_temp);
|
||||
printf("[SD2506] temp: %d C\r\n", sd_temp);
|
||||
DBG_INFO("SD2506 temp: %d C", sd_temp);
|
||||
|
||||
/* 读取电池电压 */
|
||||
uint16_t sd_vbat;
|
||||
sd2506_get_battery_voltage(&sd_vbat);
|
||||
printf("[SD2506] battery: %d.%02d V\r\n",
|
||||
sd_vbat / 1000, (sd_vbat % 1000) / 10);
|
||||
DBG_INFO("SD2506 battery: %d.%02d V",
|
||||
sd_vbat / 1000, (sd_vbat % 1000) / 10);
|
||||
}
|
||||
|
||||
/* RS-485 初始化(UART5 + PD0 方向控制) */
|
||||
rs485_init(&g_rs485, &huart5, ST_DIR4_GPIO_Port, ST_DIR4_Pin);
|
||||
printf("[RS485] init: OK (UART5, DE=PD0)\r\n");
|
||||
DBG_INFO("RS485 init: OK (UART5, DE=PD0)");
|
||||
|
||||
/* 启动第一次 RS-485 接收 */
|
||||
rs485_receive_start(&g_rs485, g_rs485_rx_buf, RS485_RX_BUF_SIZE);
|
||||
@@ -204,7 +196,7 @@ int main(void)
|
||||
/* 创建 TCP Server Echo 测试 */
|
||||
{
|
||||
s_listen_sock = net_socket(NET_AF_INET, NET_SOCK_STREAM, 0);
|
||||
printf("[NET] TCP listen socket: %d\r\n", s_listen_sock);
|
||||
DBG_INFO("TCP listen socket: %d", s_listen_sock);
|
||||
|
||||
struct net_sockaddr_in serv_addr;
|
||||
memset(&serv_addr, 0, sizeof(serv_addr));
|
||||
@@ -213,20 +205,37 @@ int main(void)
|
||||
serv_addr.sin_addr.s_addr = NET_INADDR_ANY;
|
||||
|
||||
if (net_bind(s_listen_sock, (struct net_sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) {
|
||||
printf("[NET] TCP bind: OK (port 8080)\r\n");
|
||||
DBG_INFO("TCP bind: OK (port 8080)");
|
||||
} else {
|
||||
printf("[NET] TCP bind: FAIL\r\n");
|
||||
DBG_ERROR("TCP bind: FAIL");
|
||||
}
|
||||
|
||||
if (net_listen(s_listen_sock, NET_TCP_SERVER_MAX_CLIENTS) == 0) {
|
||||
printf("[NET] TCP listen: OK (max_clients=%d)\r\n", NET_TCP_SERVER_MAX_CLIENTS);
|
||||
DBG_INFO("TCP listen: OK (max_clients=%d)", NET_TCP_SERVER_MAX_CLIENTS);
|
||||
} else {
|
||||
printf("[NET] TCP listen: FAIL\r\n");
|
||||
DBG_ERROR("TCP listen: FAIL");
|
||||
}
|
||||
}
|
||||
|
||||
/* 启动第一次转换(CubeMX 已配置 BUSY EXTI 中断) */
|
||||
tpafe5160_start_conv_irq();
|
||||
|
||||
/* CH395F 驱动测试 — 各阶段独立运行,注释 define 可跳过 */
|
||||
#ifdef ENABLE_PHASE1_TESTS
|
||||
ch395f_phase1_tests();
|
||||
#endif
|
||||
#ifdef ENABLE_PHASE3_TESTS
|
||||
ch395f_phase3_tests();
|
||||
#endif
|
||||
#ifdef ENABLE_PHASE2_TESTS
|
||||
ch395f_phase2_tests();
|
||||
#endif
|
||||
#ifdef ENABLE_PHASE5_TESTS
|
||||
ch395f_phase5_init();
|
||||
#endif
|
||||
#ifdef ENABLE_PHASE6_TESTS
|
||||
ch395f_phase6_tests();
|
||||
#endif
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
@@ -238,28 +247,17 @@ int main(void)
|
||||
/* USER CODE BEGIN 3 */
|
||||
/* 网络轮询(必须在主循环中调用) */
|
||||
net_poll();
|
||||
|
||||
/* TCP Server Echo 处理 —— 多连接模式,socket 0 监听,socket 1~7 收发 */
|
||||
{
|
||||
int i;
|
||||
for (i = NET_TCP_SERVER_DATA_SOCK_START; i < NET_MAX_SOCKETS; i++)
|
||||
{
|
||||
net_sock_t *sk = net_get_sock(i);
|
||||
if (sk == NULL || !sk->in_use || sk->state != NET_SOCK_STATE_ESTABLISHED)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
uint16_t rlen = ch395f_get_recv_len((uint8_t)i);
|
||||
if (rlen > 0) {
|
||||
uint16_t read_len = (rlen > sizeof(s_echo_buf)) ? sizeof(s_echo_buf) : rlen;
|
||||
ch395f_read_recv_buf((uint8_t)i, s_echo_buf, read_len);
|
||||
TS(); printf("[NET] recv sock%d: %d bytes\r\n", i, read_len);
|
||||
ch395f_write_send_buf((uint8_t)i, s_echo_buf, read_len);
|
||||
TS(); printf("[NET] send sock%d: %d bytes\r\n", i, read_len);
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef ENABLE_PHASE4_TESTS
|
||||
/* Phase 4: NET 层 TCP Echo */
|
||||
ch395f_phase4_tests();
|
||||
#endif
|
||||
/* Phase 5: NET 层 UDP Echo */
|
||||
#ifdef ENABLE_PHASE5_TESTS
|
||||
ch395f_phase5_tests();
|
||||
#endif
|
||||
#ifdef ENABLE_PHASE7_TESTS
|
||||
ch395f_phase7_tests();
|
||||
#endif
|
||||
|
||||
// /* TPAFE5160 中断模式读取 */
|
||||
// if (tpafe5160_data_ready()) {
|
||||
@@ -327,6 +325,7 @@ void SystemClock_Config(void)
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 4 */
|
||||
|
||||
/*
|
||||
* HAL UART 扩展接收回调(IDLE 空闲帧中断触发)
|
||||
* 当 RS-485 总线空闲超过 1 个字符时间后触发
|
||||
|
||||
Reference in New Issue
Block a user