From 1808f9916f542be5bd5ca1bf998a0644d704859b Mon Sep 17 00:00:00 2001 From: xiao Date: Wed, 1 Apr 2026 04:22:13 +0800 Subject: [PATCH] fix: harden CH390 bring-up diagnostics --- App/config.c | 15 +++++++++++--- Core/Src/main.c | 29 +-------------------------- Drivers/CH390/ch390_runtime.c | 37 +++++++++++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/App/config.c b/App/config.c index c8e8af6..f5a88f0 100644 --- a/App/config.c +++ b/App/config.c @@ -441,7 +441,6 @@ bool config_try_process_frame(const uint8_t *data, uint16_t len) char response[CONFIG_TX_BUFFER_SIZE]; char cmd_buffer[CONFIG_CMD_MAX_LEN]; at_result_t result; - HAL_StatusTypeDef tx_status; if (data == NULL || len < 2u) { return false; @@ -460,11 +459,21 @@ bool config_try_process_frame(const uint8_t *data, uint16_t len) } result = config_process_at_cmd(cmd_buffer, response, sizeof(response)); - tx_status = HAL_UART_Transmit(&CONFIG_UART_HANDLE, (uint8_t *)response, (uint16_t)strlen(response), 1000u); + if (HAL_UART_Transmit(&CONFIG_UART_HANDLE, + (uint8_t *)response, + (uint16_t)strlen(response), + 1000u) != HAL_OK) { + return false; + } if (result == AT_NEED_REBOOT) { static const char hint[] = "Note: Use AT+SAVE then AT+RESET to apply changes\r\n"; - tx_status = HAL_UART_Transmit(&CONFIG_UART_HANDLE, (uint8_t *)hint, sizeof(hint) - 1u, 1000u); + if (HAL_UART_Transmit(&CONFIG_UART_HANDLE, + (uint8_t *)hint, + sizeof(hint) - 1u, + 1000u) != HAL_OK) { + return false; + } } return true; diff --git a/Core/Src/main.c b/Core/Src/main.c index b9b7b0b..bcf1211 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -51,12 +51,6 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ -/* CH390 硬件控制引脚 */ -#define CH390_RST_PIN GPIO_PIN_1 -#define CH390_RST_PORT GPIOB -#define CH390_CS_PIN GPIO_PIN_4 -#define CH390_CS_PORT GPIOA - /* LED 指示灯 */ #define LED_PIN GPIO_PIN_13 #define LED_PORT GPIOC @@ -79,7 +73,6 @@ volatile uint8_t g_uart1_rx_probe_byte = 0u; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ -static void CH390_HardwareReset(void); static void LED_Init(void); static void LED_StartBlink(void); static void BootDiag_ReportCh390(void); @@ -91,24 +84,6 @@ static void App_Poll(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -/** - * @brief CH390 硬件复位 - * @note 复位时序: RST 低电平至少 10us,然后高电平等待 50ms 完成初始化 - */ -static void CH390_HardwareReset(void) -{ - /* 拉低 RST 引脚 */ - HAL_GPIO_WritePin(CH390_RST_PORT, CH390_RST_PIN, GPIO_PIN_RESET); - HAL_Delay(1); /* 保持低电平 1ms (远超最小 10us 要求) */ - - /* 拉高 RST 引脚,等待芯片初始化完成 */ - HAL_GPIO_WritePin(CH390_RST_PORT, CH390_RST_PIN, GPIO_PIN_SET); - HAL_Delay(50); /* 等待 50ms */ - - /* 确保 CS 为高电平(未选中状态) */ - HAL_GPIO_WritePin(CH390_CS_PORT, CH390_CS_PIN, GPIO_PIN_SET); -} - /** * @brief LED 初始化(点亮表示系统启动) */ @@ -318,9 +293,7 @@ int main(void) MX_SPI1_Init(); MX_TIM4_Init(); /* USER CODE BEGIN 2 */ - - ch390_hardware_reset(); - + /* LED 初始化 */ LED_Init(); LED_StartBlink(); diff --git a/Drivers/CH390/ch390_runtime.c b/Drivers/CH390/ch390_runtime.c index 56830e4..14bd464 100644 --- a/Drivers/CH390/ch390_runtime.c +++ b/Drivers/CH390/ch390_runtime.c @@ -13,7 +13,7 @@ static volatile uint8_t g_ch390_irq_pending; static uint8_t g_ch390_ready; static ch390_diag_t g_diag; -static void ch390_runtime_refresh_diag(void) +static uint8_t ch390_runtime_probe_identity(void) { g_diag.vendor_id = ch390_get_vendor_id(); g_diag.product_id = ch390_get_product_id(); @@ -25,11 +25,21 @@ static void ch390_runtime_refresh_diag(void) g_diag.intcr = ch390_read_reg(CH390_INTCR); g_diag.gpr = ch390_read_reg(CH390_GPR); g_diag.isr = ch390_read_reg(CH390_ISR); - g_diag.link_up = (uint8_t)ch390_get_link_status(); + g_diag.link_up = (uint8_t)0u; g_diag.id_valid = (uint8_t)((g_diag.vendor_id != 0x0000u) && (g_diag.vendor_id != 0xFFFFu) && (g_diag.product_id != 0x0000u) && (g_diag.product_id != 0xFFFFu)); + return g_diag.id_valid; +} + +static void ch390_runtime_refresh_diag(void) +{ + uint8_t id_valid = ch390_runtime_probe_identity(); + + if (id_valid != 0u) { + g_diag.link_up = (uint8_t)ch390_get_link_status(); + } } static struct pbuf *ch390_runtime_input(struct netif *netif) @@ -38,6 +48,7 @@ static struct pbuf *ch390_runtime_input(struct netif *netif) struct pbuf *p = NULL; struct pbuf *q; uint16_t len; + uint8_t rcr; uint8_t rx_ready; uint8_t rx_header[4]; @@ -45,11 +56,12 @@ static struct pbuf *ch390_runtime_input(struct netif *netif) rx_ready = ch390_read_reg(CH390_MRCMDX); if (rx_ready & CH390_PKT_ERR) { - ch390_write_reg(CH390_RCR, 0u); + rcr = ch390_read_reg(CH390_RCR); + ch390_write_reg(CH390_RCR, (uint8_t)(rcr & (uint8_t)(~RCR_RXEN))); ch390_write_reg(CH390_MPTRCR, 0x01u); ch390_write_reg(CH390_MRRH, 0x0Cu); ch390_delay_us(1000u); - ch390_write_reg(CH390_RCR, RCR_RXEN | RCR_DIS_CRC); + ch390_write_reg(CH390_RCR, rcr); ethernetif->rx_len = 0u; LINK_STATS_INC(link.drop); return NULL; @@ -107,6 +119,22 @@ void ch390_runtime_init(struct netif *netif, const uint8_t *mac) ch390_spi_init(); SEGGER_RTT_WriteString(0, "ETH init: reset\r\n"); ch390_hardware_reset(); + + SEGGER_RTT_WriteString(0, "ETH init: probe\r\n"); + g_ch390_ready = ch390_runtime_probe_identity(); + if (g_ch390_ready == 0u) { + netif->hwaddr_len = ETHARP_HWADDR_LEN; + netif->mtu = 1500; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP; + + ethernetif->rx_len = 0u; + ethernetif->rx_status = 0u; + + netif_set_link_down(netif); + SEGGER_RTT_WriteString(0, "ETH init: invalid chip id\r\n"); + return; + } + SEGGER_RTT_WriteString(0, "ETH init: default\r\n"); ch390_default_config(); SEGGER_RTT_WriteString(0, "ETH init: mac\r\n"); @@ -151,6 +179,7 @@ void ch390_runtime_poll(struct netif *netif) ch390_write_reg(CH390_ISR, int_status); if ((int_status & ISR_LNKCHG) != 0u) { + HAL_Delay(65u); ch390_runtime_check_link(netif); }