fix: harden CH390 bring-up diagnostics
This commit is contained in:
+12
-3
@@ -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
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user