Suatu hari yang cerah dan cerah untuk bekerja membutuhkan konverter antarmuka CAN ke Ethernet yang murah. Secara alami, pencarian dimulai dengan solusi siap pakai, tetapi, seperti yang sering terjadi, pada akhirnya diputuskan untuk mengembangkan sampel mereka sendiri. Tentu saja, antusiasme penulis tidak bisa menolak dan membatasi dirinya pada fungsionalitas yang "terpotong". Apa yang terjadi, bagaimana dan mengapa - di bawah luka.
Ringkasan umum. Foto di atas menunjukkan model 3D papan yang saya kembangkan menggunakan CAD Altium Designer. Fitur dan fungsionalitas utama:
- 10 \ 100 Mb Ethernet
- Rtc
- MicroSD (FAT12, FAT16, FAT32) 4GB
- RS232 \ RS485
- BISA
- Bel
- 3 LED Pengguna
- GPIO
- EEPROM 32 KB
- FLASH 2 MB
- I2C
- SPI
- UART
- SW \ JTAG
- Serial USB (Port COM)
- Daya: miniUSB 5V \ Eksternal 9..24V
Biaya dewan yang dikumpulkan adalah ~ 5000 R. Proyek ini bersifat open source, sumbernya dapat ditemukan di
github . Apa yang ternyata pada akhirnya, selain fungsi utama, dapat dianggap sebagai papan debugging yang baik untuk bekerja dengan mikrokontroler STM32.
Dan sekarang untuk detail ciptaan.
Perangkat keras
Studi masalah ini dimulai dengan pencarian dan evaluasi solusi yang sudah jadi. Persyaratan utama adalah:
- konversi frame CAN2.0B yang masuk ke paket TCP \ IP dan sebaliknya;
- biaya rendah, sebagai akibatnya, implementasi perangkat berbasis mikrokontroler.
Kolega dari Tiongkok memiliki beberapa solusi industri, tetapi bukan solusi yang murah, sehingga perwakilan produksi PIRS CAN-Ethernet Interface Converter dikirim ke kantor kami untuk pengujian. Menurut kapabilitas dan karakteristik yang dijelaskan, perangkat memuaskan T.Z sederhana, hanya tinggal memeriksa kinerja dalam praktek, yang saya lakukan, dipersenjatai dengan Wireshark dan osiloskop. Untuk alasan yang tidak diketahui, ketika mengirim paket ke perangkat TCP pada output perangkat, di mana frame CAN seharusnya muncul, urutan dengan tingkat CAN fisik (pasangan diferensial) tetapi protokol antarmuka UART logis (dengan bit mulai dan henti) dimuntahkan. Membuka kasing, membuka dokumentasi sirkuit mikro dan membunyikan trek papan, saya menemukan, memang, pin RX dan TX (UART) dari mikrokontroler terhubung ke transceiver CAN dan terhubung ke konektor eksternal darinya. Dengan demikian, tidak ada dukungan perangkat keras untuk standar CAN2.0B yang diharapkan.
Inilah yang saya lihat pada output CANL dari "PIRS CAN-Ethernet" saat mengirim dua byte data [
0xF0 ] dan [
0x0A ] melalui TCP \ IP:

Urutan bit terbalik, tetapi Anda dapat menghadapinya secara terprogram, tetapi sudah lebih sulit untuk melakukan sesuatu pada tingkat aplikasi dengan memulai dan menghentikan bit melalui setiap byte, karena mereka dimasukkan ke dalam perangkat keras.
Dan inilah bingkai CAN2.0B "benar" dengan dua byte data yang sama akan terlihat seperti:

Seperti yang dapat Anda lihat dari osilogram, selain byte data, frame berisi banyak bit layanan dari protokol plus bit isian, dan yang paling penting, mereka berjalan terus menerus tanpa bit start dan stop! (Bagi mereka yang tertarik, di bawah spoiler deskripsi rinci tentang paket ini).
Spoiler
4 byte pertama adalah pengenal bingkai. Anda dapat mempelajari lebih lanjut tentang format CAN dari
[1] Jadi, tidak mungkin bagi saya untuk memecahkan masalah ketidakcocokan frame CAN dan UART dengan metode perangkat lunak, dan, melihat hasil penelitian menengah dengan tampilan kecewa, diputuskan untuk mengembangkan prototipe kita sendiri dari perangkat yang diperlukan.
Karena kenyataan bahwa sekarang mungkin untuk mengendalikan berbagai karakteristik teknis perangkat yang lebih luas, persyaratan berikut ditambahkan:
3. Kemampuan berkuasa dari 12-24 V dalam sistem transportasi;
4. Kehadiran memori eksternal untuk menyimpan log;
5. Dimensi papan tidak lebih dari 86x80mm.
6. Kisaran suhu pengoperasian -40..85 °
Platform
STM32F407VET6 yang terkenal
[2] dipilih sebagai otak perangkat baru, yang memiliki dukungan perangkat keras untuk semua antarmuka yang diperlukan dan persediaan RAM dan memori FLASH yang baik. Setelah memoles Internet, transceiver
DP83848IVV [3] dipilih sebagai PHY Ethernet, yang, menurut pendapat saya, memiliki dokumentasi yang baik dan cukup contoh skema koneksi dan perutean. Sebagai memori non-volatile eksternal untuk menyimpan log, saya memilih SPI FLASH 2 MB dan SPI EEPROM untuk menyimpan berbagai pengaturan. Selain itu, perlindungan daya terhadap tegangan lebih, pembalikan polaritas ditambahkan. Setelah malam N dan akhir pekan M, diagram sirkuit dan jejak papan sirkuit cetak perangkat versi pertama dikompilasi. Karena ada cukup ruang di papan tulis, tapi saya tidak ingin meninggalkan kaki MK idle, selain fungsi utama, papan ditambahkan:
- alat debugging SW, JTAG;
- Sakelar 8-DIP;
- micro-USB (USB Serial);
- RS-232;
- UART
- I2C;
- GPIO
Idenya adalah bahwa, jika perlu, dewan siap untuk memperluas fungsionalitas dengan memasang komponen tambahan. Selain itu, kursi cadangan tidak memengaruhi biaya produksi. Di satu sisi, sayangnya, karena ini, itu tidak mungkin untuk cocok semuanya, jadi papan ternyata bilateral 86x80mm, mnt. lebar track 0,25mm, diameter lubang min 0,6mm.
Versi pertama dari desain PCBKemudian, dua sampel uji diperintahkan dan dirakit dengan satu set lengkap periferal untuk penelitian. Untuk menghemat uang, papan dibuat tanpa topeng dan karenanya memiliki warna yang tidak seperti biasanya.

Dengan bantuan STM32CubeMX, saya membuat sketsa firmware uji dengan uji operabilitas modul periferal utama perangkat dan, sebagai perkiraan pertama, semuanya berfungsi kecuali meluncurkan MK dari kuarsa 8 MHz eksternal. Ternyata, karena kesalahan saya dalam menyusun spesifikasi, kapasitor beban yang salah disolder. Tetapi ini tidak menghentikan STM32F407 dari bekerja dengan generator RC internal. Ketika saya bisa melakukan ping perangkat saya, tidak ada sukacita yang menahan. Saya sudah lama menggunakan jejak PHY Ethernet. Kemudian di browser saya melihat halaman http pengujian saya dan tenang dengan pengujian.
Produksi sampel papan pertama dipesan di Zelenograd. Dan, terlepas dari kenyataan bahwa biaya "dengan" topeng dan "tanpa" hampir dua kali berbeda, saya tidak merekomendasikan melakukannya bahkan pada tahap prototipe, karena, pada umumnya, pada tahap inilah kesalahan penelusuran muncul dan sesuatu terjadi solder. Tapi mabuk di trek "telanjang" itu sangat tidak menyenangkan, menghemat uang, tetapi hampir tidak ada saraf. Ya, dan menebak kemudian apakah ada istirahat pendek di suatu tempat atau jejaknya tidak benar - kesenangan seperti itu. Karena pengalaman saya, menyolder resonator kuarsa dan kapasitor beban, saya membunuh satu sampel.
Pada saat itu, di tempat kerja, di nampan ada sepotong besi yang mampu menyelesaikan tugas konversi dalam proyek saat ini, tetapi, selain ukuran besar dan biaya, setelah menulis firmware untuk itu, saya mengalami masalah terkait dengan ukuran RAM dan fungsi terpotong dari tumpukan TCP \ IP MK LPC2368. Jadi keinginan untuk membuat perangkat Anda semakin intensif.
Setelah mempelajari dengan hati-hati kekurangan versi pertama, saya, tanpa berpikir dua kali, melanjutkan ke versi kedua. Dan sekali lagi saya ingin menambahkan "jaminan untuk masa depan", menggabungkan komponen-komponen berikut ke dalam faktor bentuk sebelumnya:
- Dukungan RTC dengan baterai;
- RS-485;
- micro-SD;
- tweeter bel;
- kemampuan untuk daya dari USB;
- SPI ke konektor eksternal;
- Daya 5V dan 3,3V ke konektor eksternal.
Antara lain, perlindungan daya saat ini dan dioda TVS pada konektor pengguna ditambahkan.
Hasilnya adalah semacam dev-board dengan kemampuan untuk menghubungkan modul eksternal. Kali ini saya memesan papan di Cina. Perakitan itu dilakukan bersama kami.

Versi kedua papan tulisUntuk versi kedua, saya menemukan pemodelan 3D dalam Altium Designer, yang banyak membantu untuk menghindari kesalahan dalam posisi relatif komponen pada dua sisi (ternyata Internet sudah memiliki banyak model komponen SMD yang sudah jadi
[4] ). Jadi, semua kesalahan pada versi pertama diperbaiki, inovasi menunjukkan efisiensi mereka, yang membuat saya sangat senang.
Firmware
Deskripsi kode berada di luar cakupan bagian ini, namun saya ingin mengatakan beberapa kata tentang komponen perangkat lunak. Di perangkat saya, saya memutuskan untuk menggunakan tumpukan FreeRTOS + LwIP. Ada cukup banyak artikel tentang mereka, misalnya,
[5] dan
[6] , jadi tidak sulit untuk mengikatnya dengan proyek Anda. Singkatnya, LwIP adalah tumpukan TCP \ IP untuk sistem tertanam, ditandai dengan konsumsi RAM yang rendah dan API yang nyaman (bahkan ada shell soket BCD). Saya menggunakan API netconn. Melalui FreeRTOS, semua pekerjaan tumpukan TCP \ IP ditempatkan dalam aliran terpisah dari aplikasi. Selain pekerjaan utama (menghubungkan server TCP eksternal ke bus CAN), server web terpisah berputar dalam aliran independen untuk mengakses pengaturan perangkat. Antarmuka web semacam itu dimaksudkan untuk memantau dan mengonfigurasi pengaturan perangkat - mengatur berbagai mode operasi, kecepatan transmisi, alamat, dll. Saya belum tahu apakah mungkin untuk membuat pembaruan firmware melalui itu.
Kesimpulan
Ini adalah proyek perangkat keras pertama saya (dan saya harap bukan yang terakhir) dengan kompleksitas seperti itu dan, meskipun ada kesalahan, versi kedua dari papan, saya pikir, dapat dianggap berhasil. Pada setiap iterasi, ada banyak keraguan, tetapi, bagaimanapun, sekali lagi saya yakin bahwa jika Anda tidak mencoba, tidak ada yang pasti akan berubah.
Sumber yang digunakan
1.
Wikipedia / Pengendali_Area_Network2.
lembar data STM32F407VET63.
Lembar data DP838484.
Model 3D5.
Pengantar FreeRTOS6.
Pengantar LwIP