STM32F407 + LAN8720A + lwIP + FreeRTOS = Tidak ada frame Ethernet yang diterima


9

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

Skema Ethernet PHY 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: masukkan deskripsi gambar di sini

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: Penangkapan Wireshark 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:

Menangkap paket yang diterima

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.


Di mana Wireshark diinstal?
Anonim

Komputer yang coba dihubungkan dengan papan. Saya akan mengedit pertanyaan untuk menambahkan kejelasan ini.
Jay Carlson

FWIW, saya akan merekomendasikan menggunakan tumpukan FreeRTOS. (Saya sadar ini tidak sesuai dengan permintaan spesifik Anda.) Saya tidak bisa melakukan apa-apa sampai malam ini, tetapi jika itu membantu, saya cukup yakin saya memiliki proyek untuk prosesor yang saya dapatkan pingnya dengan tumpukan FreeRTOS. Saya tidak tahu PHY mana yang ada di papan tulis, saya bangkit dan berlari. Bagaimanapun, beri tahu saya jika Anda menginginkan proyek tersebut, saya dapat meletakkannya di situs interaktif FreeRTOS.
DiBosco

Itu akan sangat membantu. Saya sangat agnostik terhadap stack yang saya gunakan --- Saya hanya butuh sesuatu yang bisa saya bangun dan jalankan dengan cepat.
Jay Carlson

1
Saya mencoba bertukar magnet dengan sesuatu yang simetris, dan itu tidak memperbaiki masalah. Namun! Saya mengamati skema saya dan menyadari bahwa RXD0 dan RXD1 saya bertukar. Doh! Itu sebabnya saya melihat data RX dikeluarkan dari PHY, tetapi tidak ada yang diterima oleh MAC. Saya mungkin menyolder ulang magnet lama saya kembali ke papan tulis (supaya saya tidak memiliki sesuatu yang menggantung di atas meja), dan saya merasa seperti protokol auto-MDI-X harus menyelesaikannya, bukan? LED "tautan" hanya akan menyala ketika tautan RX / TX yang valid dibuat, bukan? Itu selalu menyala, bahkan dengan magnet asimetris yang lama.
Jay Carlson

Jawaban:


0

Anda telah menginstal wireshark pada PC, dan seperti yang Anda katakan Anda menggunakan adaptor USB-to-LAN. Saya tidak yakin pada titik fisik mana Wireshark menangkap paket-paket dalam pengaturan Anda, dan karenanya merupakan pertanyaan yang bagus jika paket keluar benar-benar muncul di jaringan fisik . Saya sarankan Anda menghubungkan PC lain dengan antarmuka jaringan, dan melihat apakah PC ini dapat berkomunikasi satu sama lain dengan membandingkan output Wireshark pada mereka.

Output wireshark Anda tidak menunjukkan masalah apa pun, PC mengumumkan tiga kali bahwa itu ada di jaringan lokal dan memiliki alamat IP 10.0.0.1 (jika akan menerima balasan ke salah satu dari 3 permintaan ARP ini maka OS akan muncul dengan konflik alamat IP).

Kemudian, papan Anda terus bertanya Siapa yang memiliki 10.0.0.1? Beritahu 10.0.0.2 dan PC balasan dengan 10.0.0.1 adalah pada ... . Pertanyaannya adalah mengapa itu terjadi dalam lingkaran:

  1. board tidak secara fisik menerima paket respons yang dikirim oleh PC;
  2. board mengharapkan sesuatu yang lain, atau paket yang diterima rusak, dan itu membuang paket itu.

Jadi, sebagai langkah pemecahan masalah berikutnya, ambil PC lain dengan antarmuka Ethernet "normal", instal Wireshark di atasnya, konfigurasikan jaringannya dengan cara yang sama seperti yang Anda lakukan untuk naik, dan cobalah telnet 10.0.0.1 80 dan lihat bahwa muncul di Wireshark pada kedua mesin. Dengan cara ini Anda akan memastikan bahwa PC dengan adaptor USB-to-Ethernet berfungsi dengan baik.

Langkah Anda selanjutnya akan tergantung pada hal-hal yang Anda lihat di Wireshark ini.

Memperbarui:

Saya menerima paket, jika pin RXD0 / D1 tidak menunjukkan aktivitas, benar?

Tidak benar. Anda ingin berpikir bahwa papan Anda menerima paket. Anda melihat ada beberapa perubahan pada level sinyal input PHY, tetapi mereka tidak selalu mewakili paket yang valid. Fakta bahwa RX_ERR tidak beralih tidak langsung meyakinkan saya bahwa PHY bekerja dengan baik pada acara yang masuk, atau informasi yang masuk membuat paket yang tepat.

Bagaimanapun, terserah Anda, teori pemecahan masalah saya sederhana - Anda harus memastikan di tingkat yang lebih tinggi di mana Anda menghadapi masalah, dan kemudian menggali bagian masing-masing dari desain. Menggali semua bagian dan mencurigai semuanya tidak ada gunanya. Akan sangat beruntung jika Anda menemukan masalah dalam menyebarkan fokus; Anda sudah mencoba menyederhanakan perangkat lunak, jika tidak berhasil Anda kemungkinan besar akan mulai mengganti chip.

Saya tidak berpikir langkah pemecahan masalah saya sangat rumit untuk memastikan bahwa PC lain dapat berkomunikasi dengan PC dengan dongle dan membuktikan saya salah atau benar, dan dengan demikian memastikan bahwa Anda benar menggali jauh ke dalam mencurigai PHY board, MAC dan perangkat lunak yang bekerja pada mereka.


Meskipun saya menghargai Anda meluangkan waktu untuk menulis ini, cukup jelas bahwa PHY saya menerima paket dari PC saya, namun mereka tidak diterima oleh board saya. Kalau tidak, saya tidak akan melihat data Rx pada baris RMII, kan? Saya rasa ini bukan pertanyaan jaringan tingkat tinggi yang sederhana.
Jay Carlson

@JayCarlson Anda masih harus membuktikan bahwa sinyal listrik di ujung kabel papan Anda mewakili paket yang tepat yang dapat ditangkap dan tidak dibuang. Mengapa pergi ke kedalaman teknologi tanpa membuktikan hal-hal sederhana seperti itu?
Anonim

Apakah teori Anda bahwa komputer saya tidak benar - benar mengirim paket yang seharusnya dikirim (dan Wireshark mengatakan itu mengirim)? Paket apa yang diterima oleh papan saya? Papan terhubung langsung ke komputer saya. Ini bukan pengaturan jaringan yang rumit, dan paket apa pun yang diterima oleh PHY di papan saya harus berasal dari komputer saya, bukan? Saya menerima paket, jika pin RXD0 / D1 tidak menunjukkan aktivitas, benar? Hipotesis Anda adalah bahwa ada sesuatu yang membuang paket, kan? Apa yang? PHY itu? Bit RX_ERR tidak pernah diset. MAC MCU? ISR terima tidak pernah menyala.
Jay Carlson

Saya memperbarui jawabannya. Jangan ragu dan terbentuk sebelumnya. Hal-hal rumit mungkin tampak lebih sederhana daripada yang Anda pikirkan. Hanya bertindak dan kumpulkan informasi.
Anonim

1
Baiklah, saya menghubungkan komputer saya ke yang lain menggunakan kabel yang sama dan adaptor USB-to-ethernet. Saya menjalankan sebuah instance dari Wireshark pada kedua komputer, dan mereka menunjukkan data yang identik --- beberapa obrolan ARP, dan kemudian koneksi yang berhasil ke layanan netcat berjalan pada port 80. Saya sudah menguji keduanya. Saya sudah mencoba menghubungkan ke layanan itu dari papan tertanam saya, dan seperti yang saya katakan, tidak pernah melewati pesan ARP. Jika saya mencoba menyambungkan ke papan dari komputer saya, itu tidak melewati tahap ARP, karena papan tidak pernah menjawab permintaan ARP komputer saya. Saya benar-benar tidak berpikir itu paket pendengaran.
Jay Carlson

0

Maaf untuk menghidupkan kembali topik ini. Saya tidak bisa lulus tanpa menyebutkan pengalaman saya.

Saya telah menggunakan HR911105A ini (RJ45 dengan magnet) dengan salah satu proyek saya.

HR911105A: masukkan deskripsi gambar di sini Sekilas, satu hal yang menarik perhatian saya adalah koneksi antara LAN8720 dan RJ45 sesuai skema Anda.

Karena saya melihat bahwa koneksi terlihat crossover. Meskipun sistem yang terhubung sebagian besar menggunakan MDI-X dan karenanya mendeteksi pasangan Receive / Transmit, akan lebih baik untuk memberikan koneksi yang kurang membingungkan seperti itu:

LAN -> RJ45
=====================
TXP -> TD+ (Pin #1)
TXN -> TD- (Pin #2)
RXP -> RD+ (Pin #3)
RXN -> RD- (Pin #6)

Pin #4 and Pin #5(jadi resistor pull-up 49.9R) akan bagus jika terhubung ke 3V3_ANdalam skema Anda sementara sisi lain harus digabungkan ke GND melalui kapasitor (0,1uF atau 0,022uF).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.