Tôi đang cố gắng đưa ra một PCB sử dụng STM32F407 và LAN8720A Ethernet PHY và dường như tôi không thể nhận được bất kỳ khung Ethernet nào - mặc dù tôi không gặp vấn đề gì khi truyền khung.
Thiết lập phần cứng
Tôi có một tinh thể 25 MHz trên STM32F4, điều khiển pin đầu ra xung nhịp 25 MHz vào LAN8720A, ở chế độ REF_CLK_OUT - và đưa đồng hồ 50 MHz trở lại STM32F4 như một phần của giao diện RMII.
Các jack / từ tính là một phần chung. Đây là biểu dữ liệu:
Phần mềm
Tôi đang sử dụng STM32CubeMX cập nhật mới nhất để tạo System Workbench cho dự án STM32 có chứa FreeRTOS, lwIP, cộng với các trình điều khiển ngoại vi ETH. Tôi chưa thực sự chạm vào bất kỳ mã nào được tạo - vì vậy ngăn xếp lwIP được khởi tạo bên trong ngăn xếp FreeRTOS.
Thí nghiệm
Với lwIP của bo mạch của tôi được cấu hình cho IP tĩnh 10.0.0.2 và khóa USB-to-ethernet trên máy tính của tôi được định cấu hình cho IP tĩnh 10.0.0.1, tôi kết nối trực tiếp hai thiết bị bằng cáp Ethernet và bo mạch của tôi cố gắng kết nối đến một dịch vụ trên cổng 80 của máy tính. Tôi nắm bắt được sự tương tác giữa bo mạch của tôi và máy tính bằng Wireshark (chạy trên máy tính và được liên kết với bộ chuyển đổi USB sang Ethernet).
Do vấn đề không có khung nhận được, chúng tôi không bao giờ vượt qua công cụ ARP này: Như bạn có thể thấy, Stmicroe (bảng của tôi) có thể gửi các gói ARP - được nghe bởi máy tính của tôi - nhưng dường như không bao giờ nghe thấy phản hồi từ máy tính của tôi , vì nó tiếp tục nổ tung các gói ARP.
Cả hai thiết bị đều được cấu hình với mặt nạ 255.255.255.0 và cả hai đều được cấu hình với địa chỉ cổng 10.0.0.1 (máy tính). Tôi đã nghe nói về các bảng ARP bị vặn và máy tính bỏ qua các gói ARP, nhưng tôi không thể tưởng tượng được bảng sẽ bỏ qua các gói ARP được máy tính của tôi xử lý cụ thể - để đáp ứng các yêu cầu mà bảng đưa ra ở nơi đầu tiên.
Vì vậy, tôi đi sâu vào tập tin ethernetif.c của lwIP và nhận thấy HAL_ETH_GetReceivedFrame_IT(&heth)
có lỗi. Hàm đó trả về lỗi vì (heth->RxDesc->Status & ETH_DMARXDESC_OWN)
== 0, thay vì 1. Tôi hiểu điều đó có nghĩa là bộ đệm DMA hiện được trang bị cho thiết bị ngoại vi MAC và chưa nhận được gì.
Hơn nữa, tôi đã xác minh rằng HAL_ETH_IRQHandler không bao giờ được gọi.
Một vấn đề với PHY?
Tại thời điểm này, tôi đã nghi ngờ chính PHY của mình là đáng trách.
Để điều tra thêm, tôi đã gắn Saleae Logic Pro 16 của mình vào tất cả các tín hiệu có liên quan và nhận thấy có rất nhiều lưu lượng trên cả TX0 / TX1, cũng như các dòng RX0 / RX1. Đây là một bản ghi lưu lượng RX với đồng hồ đầu vào 25 MHz:
RX_ERR toàn bộ thời gian thấp, trừ khi tôi cố gắng thu được đầu ra xung nhịp 50 MHz (rõ ràng là một thách thức với một thiết bị như Saleae): trong trường hợp đó, RX_ERR bị mờ rất cao đối với một vài gói (thực sự là một dấu hiệu tốt - pin dường như đang hoạt động).
Bước tiếp theo
Tôi đã thử kích hoạt ngắt ETH theo cách thủ công bằng cách gọi HAL_NVIC_EnableIRQ(ETH_IRQn);
sau khi tcpip_init()
được gọi trong MX_LWIP_Init()
tác vụ và điều đó dường như không khắc phục được sự cố. Tôi không hoàn toàn chắc chắn rằng thói quen ngắt Ethernet thậm chí còn được gọi là - đó là điều khó khăn khi đưa ra một thiết kế hoàn toàn mới; Tôi đang vật lộn để xác định hành vi đúng đắn của hệ thống sẽ là gì, do đó tôi có thể xác định cách thiết lập của mình khác nhau như thế nào.
Mặc dù tôi đã sử dụng công cụ STM32 / STM32CubeMX / FreeRTOS trước đây, tôi chưa bao giờ sử dụng thiết bị ngoại vi Ethernet của STM32 và trải nghiệm duy nhất của tôi với công cụ này là trên các hệ thống nhúng nhúng tùy chỉnh, dường như luôn hoạt động ngoài hộp. Đây là lãnh thổ mới đối với tôi!
Tôi chắc chắn có một hộp kiểm ngu ngốc ở đâu đó hoặc Ethernet_EnableReceive()
chức năng ma thuật mà tôi quên gọi, nhưng tôi thực sự không thể tìm thấy bất kỳ tài liệu nào đề nghị cần kích hoạt rõ ràng nội dung đó và các bài đăng tôi thấy trên internet đều không liên quan các vấn đề.
Nếu bất cứ ai có ý tưởng, tôi muốn giúp đỡ!
Phụ lục: Loại bỏ FreeRTOS
Chỉ để loại bỏ công cụ, tôi đã loại bỏ thành phần dự án FreeRTOS, quay trở lại một dự án kim loại trần. Trong vòng lặp chính của tôi, tôi gọi MX_LWIP_Process()
. Phương pháp này sẽ loại bỏ sự cần thiết của các ngắt, nhưng nó không khắc phục được vấn đề; Tôi vẫn không thể nhận được khung. Điều này khiến tôi nghĩ rằng có một cái gì đó trong mã ETH HAL được tạo bởi STM32CubeMX.
Giải pháp
Chỉ trong trường hợp ai đó vấp phải câu hỏi này trong tương lai, vấn đề hóa ra là lật chân RXD0 và RXD1. Đây là lý do tại sao tôi có thể thấy lưu lượng truy cập trên máy phân tích logic của mình, nhưng nó không được giải mã bởi MCU của tôi.
Như ai đó đã chỉ ra, từ tính tôi sử dụng là không đối xứng và không nên được sử dụng cho tự động MDI-X. Tôi chưa có vấn đề gì. Tôi dự đoán một trong hai điều đang xảy ra: - từ tính không thực sự hoạt động theo hướng khác, nhưng vì mọi thứ tôi sử dụng tự động MDI-X, bo mạch của tôi về cơ bản vẫn cố định trong cấu hình hoạt động, trong khi thiết bị khác bật cáp định hướng tín hiệu của nó để phù hợp. - từ tính cung cấp tính toàn vẹn tín hiệu phù hợp với các lần chạy Ethernet ngắn, nhưng phân tích dài hạn sẽ cho thấy tốc độ giảm gói cao hơn hoặc các sự cố trong thời gian dài hơn.
Thành thật mà nói, tôi không rõ tại sao nó lại quan trọng ở phía nào của máy biến áp 1: 1, do đó, bên ngoài các ứng dụng PoE, tôi không chắc tại sao thiết kế đối xứng và không đối xứng lại quan trọng.