Saya mencoba memunculkan PCB yang menggunakan STM32F407 dan LAN8720A Ethernet PHY, dan sepertinya saya tidak dapat menerima frame Ethernet - meskipun saya tidak memiliki masalah dalam mentransmisikan frame.
Pengaturan perangkat keras
Saya memiliki kristal 25 MHz pada STM32F4, menggerakkan pin keluaran clock 25 MHz ke LAN8720A, yang berada dalam mode REF_CLK_OUT - dan menggerakkan jam 50 MHz kembali ke STM32F4 sebagai bagian dari antarmuka RMII.
Dongkrak / magnet adalah bagian generik. Inilah datasheet:
Perangkat lunak
Saya menggunakan STM32CubeMX pembaruan terbaru untuk menghasilkan System Workbench untuk proyek STM32 yang berisi FreeRTOS, lwIP, ditambah driver periferal ETH. Saya belum benar-benar menyentuh salah satu kode yang dihasilkan - sehingga tumpukan lwIP diinisialisasi di dalam tumpukan FreeRTOS.
Eksperimen
Dengan papan lwIP saya yang dikonfigurasi untuk IP statis 10.0.0.2, dan dongle USB-to-ethernet di komputer saya yang dikonfigurasi untuk IP statis 10.0.0.1, saya menghubungkan kedua perangkat secara langsung dengan kabel Ethernet, dan papan saya mencoba menghubungkan ke layanan pada port 80 komputer. Saya menangkap interaksi antara papan saya dan komputer menggunakan Wireshark (berjalan di komputer, dan terikat ke konverter USB-to-Ethernet).
Karena masalah frame yang tidak diterima, kami tidak pernah bisa melewati hal-hal ARP ini: Seperti yang Anda lihat, Stmicroe (papan saya) dapat mengirim paket ARP - didengar oleh komputer saya - tetapi sepertinya tidak pernah mendengar respons dari komputer saya , karena terus mengeluarkan paket ARP.
Kedua perangkat dikonfigurasikan dengan mask 255.255.255.0, dan keduanya dikonfigurasikan dengan alamat gateway 10.0.0.1 (komputer). Saya pernah mendengar tentang tabel ARP yang kacau dan komputer mengabaikan paket ARP, tapi saya tidak bisa membayangkan papan akan mengabaikan paket ARP yang secara khusus ditujukan kepadanya oleh komputer saya - sebagai tanggapan atas permintaan yang dibuat oleh papan di tempat pertama.
Jadi, saya selami file ethernetif.c lwIP dan perhatikan bahwa HAL_ETH_GetReceivedFrame_IT(&heth)
itu mengembalikan kesalahan. Fungsi itu mengembalikan kesalahan karena (heth->RxDesc->Status & ETH_DMARXDESC_OWN)
== 0, bukan 1. Saya menafsirkannya berarti bahwa buffer DMA saat ini dipersenjatai untuk perangkat MAC, dan belum menerima apa pun.
Selain itu, saya telah memverifikasi bahwa HAL_ETH_IRQHandler tidak pernah dipanggil.
Ada masalah dengan PHY?
Pada titik ini, saya menduga PHY saya sendiri yang harus disalahkan.
Untuk menyelidiki lebih lanjut, saya melampirkan Saleae Logic Pro 16 saya ke semua sinyal yang relevan, dan melihat ada banyak lalu lintas di TX0 / TX1, serta jalur RX0 / RX1. Berikut adalah penangkapan beberapa lalu lintas RX dengan clock input 25 MHz:
RX_ERR rendah sepanjang waktu, kecuali jika saya mencoba untuk menangkap output clock 50 MHz (yang jelas-jelas menantang dengan perangkat seperti Saleae): dalam hal itu, RX_ERR secara bertahap dipotong tinggi untuk beberapa paket (yang sebenarnya merupakan pertanda baik - pin tampaknya berfungsi).
Langkah selanjutnya
Saya sudah mencoba secara manual mengaktifkan interupsi ETH dengan memanggil HAL_NVIC_EnableIRQ(ETH_IRQn);
setelah tcpip_init()
dipanggil dalam MX_LWIP_Init()
tugas, dan itu tampaknya tidak memperbaiki masalah. Saya tidak sepenuhnya yakin interupsi rutin Ethernet bahkan seharusnya dipanggil - itulah hal yang menantang dengan memunculkan desain baru; Saya berjuang untuk menentukan perilaku sistem yang tepat, jadi saya kemudian dapat menentukan perbedaan pengaturan saya.
Meskipun saya telah menggunakan STM32 / STM32CubeMX / FreeRTOS sebelumnya, saya belum pernah menggunakan periferal Ethernet STM32, dan satu-satunya pengalaman saya dengan hal ini adalah pada sistem Linux tertanam kustom, yang sepertinya selalu bekerja di luar kotak. Ini wilayah baru bagiku!
Saya yakin ada kotak centang bodoh di suatu tempat atau Ethernet_EnableReceive()
fungsi magis yang saya lupa panggil, tetapi saya tidak dapat menemukan dokumentasi yang menyarankan perlunya mengaktifkan hal-hal itu secara eksplisit, dan tulisan yang saya lihat di internet semuanya karena tidak berhubungan masalah.
Jika ada yang punya ide, saya ingin bantuan!
Tambahan: Menyingkirkan FreeRTOS
Hanya untuk menghilangkan hal-hal, saya telah menghapus komponen proyek FreeRTOS, kembali ke proyek bare-metal. Di loop utama saya, saya menelepon MX_LWIP_Process()
. Metode ini harus menghilangkan kebutuhan akan interupsi, tetapi tidak memperbaiki masalah; Saya masih tidak dapat menerima bingkai. Ini membuat saya berpikir ada sesuatu dalam kode ETH HAL yang dihasilkan oleh STM32CubeMX.
Larutan
Untuk berjaga-jaga jika seseorang menemukan pertanyaan ini di kemudian hari, masalahnya ternyata adalah pin RXD0 dan RXD1 yang terbalik. Inilah sebabnya mengapa saya dapat melihat lalu lintas pada penganalisis logika saya, tetapi itu tidak diterjemahkan oleh MCU saya.
Seperti yang ditunjukkan seseorang, magnet yang saya gunakan asimetris, dan tidak boleh digunakan untuk auto-MDI-X. Saya belum punya masalah. Saya mengantisipasi salah satu dari dua hal yang terjadi: - magnet tidak benar-benar berfungsi dalam orientasi lain, tetapi karena semua yang saya miliki menggunakan auto-MDI-X, papan saya pada dasarnya tetap dalam konfigurasi yang berfungsi, sementara perangkat lain menyala kabel mengarahkan sinyalnya agar sesuai. - magnetics memberikan integritas sinyal yang sesuai dengan jangka pendek Ethernet, tetapi analisis jangka panjang akan menunjukkan tingkat penurunan paket yang lebih tinggi atau masalah pada jangka yang lebih lama.
Sejujurnya, tidak jelas bagi saya mengapa akan menjadi masalah di sisi mana transformator 1: 1 filter garis dipasang, jadi di luar aplikasi PoE, saya tidak yakin mengapa desain simetris vs asimetris akan berpengaruh.