fix: harden CH390 bring-up diagnostics

This commit is contained in:
2026-04-01 04:22:13 +08:00
parent 14a532290d
commit 1808f9916f
3 changed files with 46 additions and 35 deletions
+12 -3
View File
@@ -441,7 +441,6 @@ bool config_try_process_frame(const uint8_t *data, uint16_t len)
char response[CONFIG_TX_BUFFER_SIZE]; char response[CONFIG_TX_BUFFER_SIZE];
char cmd_buffer[CONFIG_CMD_MAX_LEN]; char cmd_buffer[CONFIG_CMD_MAX_LEN];
at_result_t result; at_result_t result;
HAL_StatusTypeDef tx_status;
if (data == NULL || len < 2u) { if (data == NULL || len < 2u) {
return false; 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)); 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) { if (result == AT_NEED_REBOOT) {
static const char hint[] = "Note: Use AT+SAVE then AT+RESET to apply changes\r\n"; 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; return true;
+1 -28
View File
@@ -51,12 +51,6 @@
/* Private define ------------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */ /* 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 指示灯 */ /* LED 指示灯 */
#define LED_PIN GPIO_PIN_13 #define LED_PIN GPIO_PIN_13
#define LED_PORT GPIOC #define LED_PORT GPIOC
@@ -79,7 +73,6 @@ volatile uint8_t g_uart1_rx_probe_byte = 0u;
/* Private function prototypes -----------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void); void SystemClock_Config(void);
/* USER CODE BEGIN PFP */ /* USER CODE BEGIN PFP */
static void CH390_HardwareReset(void);
static void LED_Init(void); static void LED_Init(void);
static void LED_StartBlink(void); static void LED_StartBlink(void);
static void BootDiag_ReportCh390(void); static void BootDiag_ReportCh390(void);
@@ -91,24 +84,6 @@ static void App_Poll(void);
/* Private user code ---------------------------------------------------------*/ /* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */ /* 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 初始化(点亮表示系统启动) * @brief LED 初始化(点亮表示系统启动)
*/ */
@@ -318,9 +293,7 @@ int main(void)
MX_SPI1_Init(); MX_SPI1_Init();
MX_TIM4_Init(); MX_TIM4_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
ch390_hardware_reset();
/* LED 初始化 */ /* LED 初始化 */
LED_Init(); LED_Init();
LED_StartBlink(); LED_StartBlink();
+33 -4
View File
@@ -13,7 +13,7 @@ static volatile uint8_t g_ch390_irq_pending;
static uint8_t g_ch390_ready; static uint8_t g_ch390_ready;
static ch390_diag_t g_diag; 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.vendor_id = ch390_get_vendor_id();
g_diag.product_id = ch390_get_product_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.intcr = ch390_read_reg(CH390_INTCR);
g_diag.gpr = ch390_read_reg(CH390_GPR); g_diag.gpr = ch390_read_reg(CH390_GPR);
g_diag.isr = ch390_read_reg(CH390_ISR); 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.id_valid = (uint8_t)((g_diag.vendor_id != 0x0000u) &&
(g_diag.vendor_id != 0xFFFFu) && (g_diag.vendor_id != 0xFFFFu) &&
(g_diag.product_id != 0x0000u) && (g_diag.product_id != 0x0000u) &&
(g_diag.product_id != 0xFFFFu)); (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) 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 *p = NULL;
struct pbuf *q; struct pbuf *q;
uint16_t len; uint16_t len;
uint8_t rcr;
uint8_t rx_ready; uint8_t rx_ready;
uint8_t rx_header[4]; 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); rx_ready = ch390_read_reg(CH390_MRCMDX);
if (rx_ready & CH390_PKT_ERR) { 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_MPTRCR, 0x01u);
ch390_write_reg(CH390_MRRH, 0x0Cu); ch390_write_reg(CH390_MRRH, 0x0Cu);
ch390_delay_us(1000u); ch390_delay_us(1000u);
ch390_write_reg(CH390_RCR, RCR_RXEN | RCR_DIS_CRC); ch390_write_reg(CH390_RCR, rcr);
ethernetif->rx_len = 0u; ethernetif->rx_len = 0u;
LINK_STATS_INC(link.drop); LINK_STATS_INC(link.drop);
return NULL; return NULL;
@@ -107,6 +119,22 @@ void ch390_runtime_init(struct netif *netif, const uint8_t *mac)
ch390_spi_init(); ch390_spi_init();
SEGGER_RTT_WriteString(0, "ETH init: reset\r\n"); SEGGER_RTT_WriteString(0, "ETH init: reset\r\n");
ch390_hardware_reset(); 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"); SEGGER_RTT_WriteString(0, "ETH init: default\r\n");
ch390_default_config(); ch390_default_config();
SEGGER_RTT_WriteString(0, "ETH init: mac\r\n"); 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); ch390_write_reg(CH390_ISR, int_status);
if ((int_status & ISR_LNKCHG) != 0u) { if ((int_status & ISR_LNKCHG) != 0u) {
HAL_Delay(65u);
ch390_runtime_check_link(netif); ch390_runtime_check_link(netif);
} }