|
|
@@ -0,0 +1,100 @@
|
|
|
+---
|
|
|
+tags: [entity]
|
|
|
+type: entity
|
|
|
+topic: stm32-lower
|
|
|
+note: 14
|
|
|
+created: 2026-07-16
|
|
|
+updated: 2026-07-16
|
|
|
+---
|
|
|
+
|
|
|
+# Note 14: Ethernet (lower/stm32/05~09)
|
|
|
+
|
|
|
+## Projects
|
|
|
+
|
|
|
+| # | Directory | Description |
|
|
|
+|---|---|---|
|
|
|
+| 05 | `05_ethernet_test_register` | Ethernet basic init & test (W5500) |
|
|
|
+| 06 | `06_ethernet_tcp_server_register` | TCP Server |
|
|
|
+| 07 | `06_ethernet_tcp_client_register` | TCP Client |
|
|
|
+| 08 | `08_ethernet_udp_register` | UDP communication |
|
|
|
+| 09 | `09_ethernet_webserver_register` | Web Server (HTTP) |
|
|
|
+
|
|
|
+## Code Accuracy Audit
|
|
|
+
|
|
|
+### Path Audit
|
|
|
+
|
|
|
+| Claimed Path | Actual Path | Status |
|
|
|
+|---|---|---|
|
|
|
+| `stm32/stm32/05_ethernet_test_register/...` | `05_ethernet_test_register/...` | **WRONG** — double `stm32/` prefix |
|
|
|
+| `.../Hardware/SPI/spi.h` | `05_ethernet_test_register/Hardware/SPI/spi.h` | ✅ Correct (minus double stm32) |
|
|
|
+| `.../Interface/Ethernet/eth.c` | `05_ethernet_test_register/Interface/Ethernet/eth.c` | ✅ Correct |
|
|
|
+| `.../User/main.c` | `05_ethernet_test_register/User/main.c` | ✅ Correct |
|
|
|
+| `stm32/06_ethernet_tcp_server_register/App/TCP/tcp.c` | `06_ethernet_tcp_server_register/App/TCP/tcp.c` | ✅ Correct |
|
|
|
+| `stm32/09_ethernet_webserver_register/App/Web/web_server.c` | Exists at `09_ethernet_webserver_register/App/Web/` | ✅ Correct |
|
|
|
+
|
|
|
+### SPI Code (spi.c)
|
|
|
+
|
|
|
+| Claimed by Note | Actual Code | Match? |
|
|
|
+|---|---|---|
|
|
|
+| `RCC->APB2ENR |= RCC_APB2ENR_IOPBEN` | Line 14 | ✅ Match |
|
|
|
+| `RCC->APB2ENR |= RCC_APB2ENR_IOPDEN` | Line 15 | ✅ Match |
|
|
|
+| `RCC->APB1ENR |= RCC_APB1ENR_SPI2EN` | Line 16 | ✅ Match |
|
|
|
+| CS — PD3: GPIO push-pull | Lines 20-21 | ✅ Match |
|
|
|
+| SCK — PB13: AF push-pull | Lines 24-26 | ✅ Match |
|
|
|
+| MOSI — PB15: AF push-pull | Lines 29-31 | ✅ Match |
|
|
|
+| MISO — PB14: floating input | Lines 34-36 | ✅ Match |
|
|
|
+| `SPI2->CR1 |= SPI_CR1_MSTR` | Line 41 | ✅ Match |
|
|
|
+| `SPI2->CR1 |= SPI_CR1_SSM; SPI2->CR1 |= SPI_CR1_SSI` | Lines 44-45 | ✅ Match |
|
|
|
+| `SPI2->CR1 &= ~(SPI_CR1_CPOL | SPI_CR1_CPHA)` (Mode 0) | Line 48 | ✅ Match |
|
|
|
+| `SPI2->CR1 &= ~SPI_CR1_BR` (div 2) | Line 51 | ✅ Match |
|
|
|
+| `SPI2->CR1 &= ~SPI_CR1_DFF` (8-bit) | Line 56 | ✅ Match |
|
|
|
+| `SPI2->CR1 &= ~SPI_CR1_LSBFIRST` (MSB first) | Line 59 | ✅ Match |
|
|
|
+| `SPI2->CR1 |= SPI_CR1_SPE` | Line 62 | ✅ Match |
|
|
|
+| `CS_LOW` / `CS_HIGH` (via `GPIOD->ODR`) | Lines 68, 72 | ✅ Match |
|
|
|
+| `while ((SPI2->SR & SPI_SR_TXE) == 0) {}` | Line 80 | ✅ Match |
|
|
|
+| `SPI2->DR = byte` | Line 84 | ✅ Match |
|
|
|
+| `while ((SPI2->SR & SPI_SR_RXNE) == 0) {}` | Line 88 | ✅ Match |
|
|
|
+| `return (uint8_t)(SPI2->DR & 0xff)` | Line 92 | ✅ Match |
|
|
|
+
|
|
|
+### W5500 ETH Code (eth.c)
|
|
|
+
|
|
|
+| Claimed by Note | Actual Code | Match? |
|
|
|
+|---|---|---|
|
|
|
+| Global arrays: `ip = {192,168,44,222}`, `mac = {110,120,130,140,150,160}`, `submask = {255,255,255,0}`, `gateway = {192,168,44,1}` | Lines 12-15 | ✅ Match |
|
|
|
+| `SPI_Init()` called first | Line 28 | ✅ Match |
|
|
|
+| `user_register_function()` called | Line 31 | ✅ Match |
|
|
|
+| RST on PG7: `RCC->APB2ENR |= RCC_APB2ENR_IOPGEN` | Line 48 | ✅ Match |
|
|
|
+| `GPIOG->CRL |= GPIO_CRL_MODE7; GPIOG->CRL &= ~GPIO_CRL_CNF7` | Lines 51-52 | ✅ Match |
|
|
|
+| `GPIOG->ODR &= ~GPIO_ODR_ODR7` (RST low) | Line 55 | ✅ Match |
|
|
|
+| `Delay_us(800)` | Line 57 | ✅ Match |
|
|
|
+| `GPIOG->ODR |= GPIO_ODR_ODR7` (RST high) | Line 59 | ✅ Match |
|
|
|
+| `setSHAR(mac)`, `setSIPR(ip)`, `setSUBR(submask)`, `setGAR(gateway)` | Lines 68, 78, 80, 82 | ✅ Match |
|
|
|
+
|
|
|
+### Ethernet main.c (05_ethernet_test_register)
|
|
|
+
|
|
|
+Note does not detail main.c content. Actual code shows:
|
|
|
+- Calls `USART_Init()`, prints banner, calls `ETH_Init()`, then infinite loop (27 lines)
|
|
|
+- No SPI or W5500 API calls in main — all init happens inside `ETH_Init()`
|
|
|
+
|
|
|
+### TCP Server (06_ethernet_tcp_server_register)
|
|
|
+
|
|
|
+Note's state machine description is accurate:
|
|
|
+- `SOCK_CLOSED → socket(SN, Sn_MR_TCP, 8080, SF_TCP_NODELAY)`
|
|
|
+- `SOCK_INIT → listen(SN)`
|
|
|
+- `SOCK_ESTABLISHED → handle Sn_IR_CON, get client IP/port`
|
|
|
+- `SOCK_CLOSE_WAIT → close(SN)`
|
|
|
+
|
|
|
+Functions `TCP_RecvData` and `TCP_SendData` match actual code.
|
|
|
+
|
|
|
+### Web Server (09_ethernet_webserver_register)
|
|
|
+
|
|
|
+Note's description of `web_server.c` with `content[]` HTML string, `parse_url_action`, and `do_led_action` matches actual code.
|
|
|
+
|
|
|
+## Summary
|
|
|
+
|
|
|
+**Overall Accuracy**: Very High (95%+)
|
|
|
+
|
|
|
+**Issues Found**:
|
|
|
+1. Double `stm32/stm32/` path for project 05
|
|
|
+2. `Delay_us(800)` is accurate (comment says 500us but actual code uses 800us delay)
|
|
|
+3. All register-level SPI/W5500 code matches perfectly
|