diff --git a/AT固件使用手册.md b/AT固件使用手册.md index 5b277da..d88bc34 100644 --- a/AT固件使用手册.md +++ b/AT固件使用手册.md @@ -235,6 +235,10 @@ AT+NET?\r\n OK ``` +**MAC 设置说明:** + +当MAC设置为全0时,固件将使用硬件MAC地址,此时通过AT+?查询到的MAC地址即为当前生效的硬件MAC地址。 + ### 8.5 LINK 类命令 #### 设置单条 LINK 记录 diff --git a/App/uart_trans.h b/App/uart_trans.h index 94dc4e4..3024021 100644 --- a/App/uart_trans.h +++ b/App/uart_trans.h @@ -26,10 +26,10 @@ typedef struct { uint8_t payload[256]; } uart_mux_frame_t; -#define UART_RX_DMA_BUFFER_SIZE 128u -#define UART_TX_DMA_BUFFER_SIZE 128u -#define UART_RX_RING_BUFFER_SIZE 256u -#define UART_TX_RING_BUFFER_SIZE 256u +#define UART_RX_DMA_BUFFER_SIZE 256u +#define UART_TX_DMA_BUFFER_SIZE 256u +#define UART_RX_RING_BUFFER_SIZE 512u +#define UART_TX_RING_BUFFER_SIZE 384u #define UART_DEFAULT_BAUDRATE 115200u typedef struct { diff --git a/Core/Src/main.c b/Core/Src/main.c index 7eae588..6d3a6a9 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -57,7 +57,6 @@ void SystemClock_Config(void); static void LED_Init(void); static void LED_StartBlink(void); static void BootDiag_ReportCh390(void); -static void App_PollUart1ConfigRx(void); static void App_Init(void); static void App_Poll(void); static void App_ConfigureLinks(const device_config_t *cfg); @@ -143,14 +142,6 @@ static void BootDiag_ReportCh390(void) cfg->mux_mode); } -static void App_PollUart1ConfigRx(void) -{ - while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) { - uint8_t byte = (uint8_t)(huart1.Instance->DR & 0xFFu); - config_uart_rx_byte(byte); - } -} - static void App_ConfigureLinks(const device_config_t *cfg) { tcp_server_instance_config_t server_cfg; @@ -352,6 +343,7 @@ static void App_RouteMuxUartTraffic(void) const device_config_t *cfg = config_get(); while (uart_mux_try_extract_frame(UART_CHANNEL_U0, &frame)) { + SEGGER_RTT_printf(0, "Mux frame from UART0: src_id=%u dst_mask=0x%02X len=%u\r\n", frame.src_id, frame.dst_mask, frame.payload_len); if (frame.dst_mask == 0u) { at_result_t result; char *response_text = (char *)&g_mux_response_frame[5]; @@ -390,6 +382,7 @@ static void App_RouteMuxUartTraffic(void) } while (uart_mux_try_extract_frame(UART_CHANNEL_U1, &frame)) { + SEGGER_RTT_printf(0, "Mux frame from UART1: src_id=%u dst_mask=0x%02X len=%u\r\n", frame.src_id, frame.dst_mask, frame.payload_len); if (frame.dst_mask == 0u) { at_result_t result; char *response_text = (char *)&g_mux_response_frame[5]; @@ -437,7 +430,6 @@ static void App_Poll(void) App_StartLinksIfNeeded(); tcp_client_poll(); uart_trans_poll(); - App_PollUart1ConfigRx(); StackGuard_Check(); config_poll(); App_RouteTcpTraffic(); diff --git a/Core/Src/spi.c b/Core/Src/spi.c index c04adb0..b879e0f 100644 --- a/Core/Src/spi.c +++ b/Core/Src/spi.c @@ -44,7 +44,7 @@ void MX_SPI1_Init(void) hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; /* Match CH390 runtime baseline: CPOL=Low */ hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; /* Match CH390 runtime baseline: CPHA=1Edge (Mode 0) */ hspi1.Init.NSS = SPI_NSS_SOFT; /* Software CS control for CH390 */ - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; /* 72MHz/64 = 1.125MHz for conservative CH390 bring-up */ + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; /* 72MHz/2 = 36MHz, max SPI1 clock at current APB2 */ hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; diff --git a/Drivers/CH390/CH390_Interface.c b/Drivers/CH390/CH390_Interface.c index d55da0c..c6c2a16 100644 --- a/Drivers/CH390/CH390_Interface.c +++ b/Drivers/CH390/CH390_Interface.c @@ -60,6 +60,7 @@ extern SPI_HandleTypeDef hspi1; /* Timeout for SPI operations (ms) */ #define SPI_TIMEOUT 100 +#define CH390_SPI_CHUNK_SIZE 64u /*---------------------------------------------------------------------------- * Low-level GPIO operations @@ -105,6 +106,24 @@ static uint8_t ch390_spi_exchange_byte(uint8_t byte) return rx_data; } +static int ch390_spi_read_bytes(uint8_t *data, uint16_t length) +{ + static const uint8_t dummy_tx[CH390_SPI_CHUNK_SIZE] = {0}; + + while (length > 0u) + { + uint16_t chunk = (length > CH390_SPI_CHUNK_SIZE) ? CH390_SPI_CHUNK_SIZE : length; + if (HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)dummy_tx, data, chunk, SPI_TIMEOUT) != HAL_OK) + { + return -1; + } + data += chunk; + length = (uint16_t)(length - chunk); + } + + return 0; +} + static void ch390_spi_apply_mode(uint32_t polarity, uint32_t phase) { hspi1.Init.CLKPolarity = polarity; @@ -281,16 +300,15 @@ void ch390_write_reg(uint8_t reg, uint8_t value) */ void ch390_read_mem(uint8_t *data, int length) { - int i; - + if (data == NULL || length <= 0) + { + return; + } + ch390_cs(0); /* CS low - select */ ch390_spi_exchange_byte(OPC_MEM_READ); /* Send memory read command */ - - /* Read data bytes */ - for (i = 0; i < length; i++) - { - data[i] = ch390_spi_dummy_read(); - } + + (void)ch390_spi_read_bytes(data, (uint16_t)length); ch390_cs(1); /* CS high - deselect */ } @@ -322,16 +340,15 @@ void ch390_read_mem_dma(uint8_t *data, int length) */ void ch390_write_mem(uint8_t *data, int length) { - int i; - + if (data == NULL || length <= 0) + { + return; + } + ch390_cs(0); /* CS low - select */ ch390_spi_exchange_byte(OPC_MEM_WRITE); /* Send memory write command */ - - /* Write data bytes */ - for (i = 0; i < length; i++) - { - ch390_spi_exchange_byte(data[i]); - } + + (void)HAL_SPI_Transmit(&hspi1, data, (uint16_t)length, SPI_TIMEOUT); ch390_cs(1); /* CS high - deselect */ } diff --git a/Drivers/CH390/ch390_runtime.c b/Drivers/CH390/ch390_runtime.c index afbb699..dd930a6 100644 --- a/Drivers/CH390/ch390_runtime.c +++ b/Drivers/CH390/ch390_runtime.c @@ -157,6 +157,19 @@ struct pbuf *ch390_runtime_input_frame(struct netif *netif) return p; } +bool ch390_mac_address_valid(const uint8_t *mac) +{ + if (mac == NULL) { + return false; + } + for (uint8_t i = 0; i < ETHARP_HWADDR_LEN; ++i) { + if (mac[i] == 0u) { + return false; + } + } + return true; +} + void ch390_runtime_init(struct netif *netif, const uint8_t *mac) { struct ethernetif *ethernetif = (struct ethernetif *)netif->state; @@ -186,7 +199,19 @@ void ch390_runtime_init(struct netif *netif, const uint8_t *mac) SEGGER_RTT_WriteString(0, "ETH init: default\r\n"); ch390_default_config(); SEGGER_RTT_WriteString(0, "ETH init: mac\r\n"); - ch390_set_mac_address((uint8_t *)mac); + if (ch390_mac_address_valid(mac)) { + ch390_set_mac_address((uint8_t *)mac); + } + else { + if (mac != NULL) { + ch390_get_mac((uint8_t *)mac); + SEGGER_RTT_printf(0, "ETH init: invalid MAC in config, using hardware MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + } + else { + SEGGER_RTT_WriteString(0, "ETH init: no MAC in config\r\n"); + } + } netif->hwaddr_len = ETHARP_HWADDR_LEN; SEGGER_RTT_WriteString(0, "ETH init: getmac\r\n"); diff --git a/MDK-ARM/TCP2UART.uvoptx b/MDK-ARM/TCP2UART.uvoptx index 25488f9..2a37074 100644 --- a/MDK-ARM/TCP2UART.uvoptx +++ b/MDK-ARM/TCP2UART.uvoptx @@ -45,7 +45,7 @@ 79 66 8 - + .\TCP2UART\ 1 @@ -140,7 +140,7 @@ 0 CMSIS_AGDI - -X"Any" -UAny -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103R8$Flash\STM32F10x_128.FLM) + -X"Any" -UAny -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103R8$Flash\STM32F10x_128.FLM) 0 diff --git a/MDK-ARM/TCP2UART.uvprojx b/MDK-ARM/TCP2UART.uvprojx index 7abe30f..5071c1c 100644 --- a/MDK-ARM/TCP2UART.uvprojx +++ b/MDK-ARM/TCP2UART.uvprojx @@ -55,7 +55,7 @@ 1 1 1 - + .\TCP2UART\ 1 0 0 @@ -80,9 +80,9 @@ 0 - 0 + 1 0 - + keil-build-viewer.exe -NOPATH 0 0 diff --git a/MDK-ARM/keil-build-viewer-record.txt b/MDK-ARM/keil-build-viewer-record.txt new file mode 100644 index 0000000..6be3ba3 --- /dev/null +++ b/MDK-ARM/keil-build-viewer-record.txt @@ -0,0 +1,64 @@ + Code (inc. data) RO Data RW Data ZI Data Debug Object Name + 590 0 0 0 0 0 ch390.o + 616 0 64 0 0 0 ch390_interface.o + 1446 0 85 3 88 0 ch390_runtime.o + 3690 0 591 8 1240 0 config.o + 8 0 0 0 0 0 def.o + 124 0 0 0 0 0 dma.o + 1772 0 0 1 240 0 etharp.o + 238 0 12 0 0 0 ethernet.o + 178 0 0 0 48 0 ethernetif.o + 246 0 0 0 0 0 flash_param.o + 240 0 0 0 0 0 gpio.o + 452 0 0 0 0 0 icmp.o + 334 0 0 0 0 0 inet_chksum.o + 26 0 0 0 0 0 init.o + 0 0 0 0 24 0 ip.o + 778 0 0 2 0 0 ip4.o + 46 0 4 0 0 0 ip4_addr.o + 0 0 0 0 12 0 iwdg.o + 2746 0 185 6 272 0 main.o + 828 0 0 12 4115 0 mem.o + 196 0 244 32 6464 0 memp.o + 582 0 0 12 0 0 netif.o + 1118 0 0 0 0 0 pbuf.o + 248 0 0 4 0 0 raw.o + 214 0 9 168 272 0 segger_rtt.o + 64 0 0 0 0 0 segger_rtt_printf.o + 216 0 0 0 88 0 spi.o + 60 0 236 0 1024 0 startup_stm32f103xb.o + 128 0 0 12 0 0 stm32f1xx_hal.o + 198 0 0 0 0 0 stm32f1xx_hal_cortex.o + 808 0 0 0 0 0 stm32f1xx_hal_dma.o + 392 0 0 0 32 0 stm32f1xx_hal_flash.o + 240 0 0 0 0 0 stm32f1xx_hal_flash_ex.o + 516 0 0 0 0 0 stm32f1xx_hal_gpio.o + 12 0 0 0 0 0 stm32f1xx_hal_iwdg.o + 60 0 0 0 0 0 stm32f1xx_hal_msp.o + 1240 0 18 0 0 0 stm32f1xx_hal_rcc.o + 1510 0 0 0 0 0 stm32f1xx_hal_spi.o + 936 0 0 0 0 0 stm32f1xx_hal_tim.o + 108 0 0 0 0 0 stm32f1xx_hal_tim_ex.o + 2300 0 0 0 0 0 stm32f1xx_hal_uart.o + 490 0 0 0 0 0 stm32f1xx_it.o + 2 0 24 4 0 0 system_stm32f1xx.o + 3474 0 193 32 0 0 tcp.o + 1216 0 0 0 1120 0 tcp_client.o + 3684 0 0 36 20 0 tcp_in.o + 3862 0 0 0 0 0 tcp_out.o + 962 0 0 0 1104 0 tcp_server.o + 164 0 0 0 72 0 tim.o + 374 0 16 12 0 0 timeouts.o + 1268 0 0 0 2936 0 uart_trans.o + 816 0 0 0 624 0 usart.o +Object Totals + +Memory Map of the image + + Load Region LR_IROM1 + + Execution Region ER_IROM1 (Exec base: 0x08000000, Size: 0x0000D178, Max: 0x00010000, END) + + Execution Region RW_IRAM1 (Exec base: 0x20000000, Size: 0x00004FF8, Max: 0x00005000, END) + +Image component sizes \ No newline at end of file diff --git a/MDK-ARM/keil-build-viewer.exe b/MDK-ARM/keil-build-viewer.exe new file mode 100644 index 0000000..9f1184f Binary files /dev/null and b/MDK-ARM/keil-build-viewer.exe differ diff --git a/TCP2UART.ioc b/TCP2UART.ioc index 648961c..5d25a8d 100644 --- a/TCP2UART.ioc +++ b/TCP2UART.ioc @@ -234,10 +234,10 @@ RCC.USBFreq_Value=72000000 RCC.VCOOutput2Freq_Value=8000000 SH.GPXTI0.0=GPIO_EXTI0 SH.GPXTI0.ConfNb=1 -SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_8 -SPI1.CLKPhase=SPI_PHASE_2EDGE -SPI1.CLKPolarity=SPI_POLARITY_HIGH -SPI1.CalculateBaudRate=9.0 MBits/s +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2 +SPI1.CLKPhase=SPI_PHASE_1EDGE +SPI1.CLKPolarity=SPI_POLARITY_LOW +SPI1.CalculateBaudRate=36.0 MBits/s SPI1.Direction=SPI_DIRECTION_2LINES SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,VirtualNSS,CLKPolarity,CLKPhase SPI1.Mode=SPI_MODE_MASTER