
Witajcie moi drodzy.
Przedstawię tutaj płytkę Fubarino-Eth oferującą łączność USB i Ethernet opartą na 32-bitowym PIC32MX795F512H (512KB Flash, 128KB RAM) i nieśmiertelnym ENC28J60. Płytka ta stanowi moją wersję słynnego Fubarino-SD 1.5 od fubarino.org / schmalzhaus. Płytkę tę nieco przerobiłem oraz przygotowałem dla niej przykłady w MPLAB X z XC32 oraz Mikro C Pro for PIC32. Projekt powstał z myślą o utworzeniu platformy oferującej z miejsca łączność USB i Ethernet przy zachowaniu możliwości łatwego podłączenia jej do płytki stykowej. Płytka ta zachowuje kompatybilność z oryginałem i jest też wspierana przez środowisko Arduino IDE (z modułem chipkit/mpide) z bootloaderem USB.
Projekt płytki
Projekt ten jest moją przerobioną wersją tzw. Fubarino SD o którym można poczytać tutaj:
https://wiki.seeedstudio.com/Fubarino_SD/
https://github.com/fubarino/fubarino.github.com
Poniżej zamieszczam dokumentację pierwowzoru:
Moja wersja, Fubarino-Eth, stawia większy nacisk na łączność i rezygnuje ze slotu na kartę microSD a na jej miejsce oferuje łączność Ethernet poprzez ENC28J60:

Jest też siłą rzeczy znacznie dłuższa, ale nie przekracza magicznej granicy 100mm by wciąż dało się jej gołe PCB zamówić tanio od chińczyków (większość płytkarni ma najmniejszą stawkę do rozmiaru 10cm na 10cm, a potem cena rośnie).
Płytka (oryginał, jak i moja wersja) oparta jest o PIC32MX795F512H:

Przyjrzyjmy się tutaj temu co dodałem, czyli sekcji łączności Ethernet:

ENC28J60 znajduje się w małej obudowie SSOP28, w żadnej innej by się nie zmieścił:

Jest on jeszcze dostępny w QFN, ale nie chciałem aż tak utrudniać lutowania, bo projekt jest zrobiony w założeniu, że da się to w domu zlutować (tak, da się, bez gorącego powietrza też, zlutowałem trzy sztuki).
W roli złącza Ethernet/magjack jest JXD0-0006NL:

Jego schemat wewnętrzny. W tym złączu transformatorek separacyjny jest zintegrowany. Redukuje to ilość elementów na PCB:

Cały schemat dodanej przeze mnie sekcji Ethernet, część 1, ENC28J600:

Część 2, JXD0-0006NL i reszta:

Schemat połączeń PIC32MX795F512H (lub odpowiednika) pozostał bez zmian względem pierwowzoru (Fubarino SD), więc go tu nie zamieszczam.
Pełny schemat mojej wersji w formacie .sch (Eagle) oraz płytka w .brd:
Poniżej Gerbery panelu 3 płytki na panel (te które zleciłem płytkarni):
Lutowanie płytki - początek
Tym razem wybrana płytkarnia nie doliczała nic za panel (dopóki w panelu powtarza się jedno PCB), więc zasadniczo kupiłem od niej 5 panelów po 3 sztuki PCB. (A chyba nawet 6 paneli dają, z reguły dają jeden więcej).


Do lutowania używam najtańszej lutownicy z regulacją mocy:

Zacząłem od najtrudniejszych elementów. Złącze mini USB i PIC:

Złącze mini USB. Specjalnie używam tego z dwoma wypustkami plastikowymi bo się solidnie trzyma i dobrze lutuje:


Jest to złącze z dodatkowym pinem USB ID (standard OTG, On-The-Go), potrzebny by móc wybrać czy urządzenie jest hostem czy slave.

Zlutowałem niezbędne minimum w trzech wersjach:
- PIC32MX575F512H
- PIC32MX675F512H
- PIC32MX795F512H
Ich wyprowadzenia są zgodne, więc nie było problemu.
Sprawdziłem już wtedy czy programator widzi mikrontroler. PICKIT3 (poprzez MPLAB IPE) wykrywa PIC32MX575F512H:

PICKIT3 (poprzez MPLAB IPE) też wykrywa PIC32MX795F512H:

Drobna poprawka
Niestety przy projektowaniu płytki przeoczyłem jedną rzecz. Nie dałem połączenia pinu RESET od ENC28J60 do któregoś z pinów PICa. Naprawiłem to potem poprzez dodanie zworki (nie jest to problematyczne), ale warto zaznaczyć, że taki problem wystąpił.

Program testowy - blink, przycisk, UART, USB
Program testowy przygotowałem w celu ułatwienia sobie weryfikacji lutów na płytce. Zrobiłem go w MPLAB X (kompilator XC32) na bazie przykładu "HID Keyboard" od Microchipa. Program ten po kolei sprawdza podstawowe funkcjonalności płytki (bez Ethernetu) tak bym mógł szybko określić, czy wszystko jest ok.
Program ten wymaga przylutowania:
- bloku zasilania (złącze USB, regulator LDO 3.3V)
- mikrokontrolera wraz z niezbędnymi elementami (rezystor RESET, kondensatory 100nF, kondensator VCAP)
- rezonatora kwarcowego 8MHz
- diody LED PRG
- przycisku PRG
Dodatkowo trzeba podłączyć konwerter USB<->UART do pinów RX/TX od UART2.
Program ten kolejno:
- miga kilkukrotnie diodą LED (RE5)
- wysyła komunikaty na UART
- tworzy urządzenie HID klawiatury
- czeka na przyciśnięcie przycisku PRG na RE7 i z każdym przyciśnięciem wysyła kolejną literkę udając klawiaturę
Skrócony kod przykładu:
Code: c
Sam kod klawiatury (wysyłanie po HID klawisza):
Code: c
Płytka przed testowaniem:

Powyżej widać podłączony PICKIT3, konwerter USB-UART i zasilanie oraz USB. Wszystko na jednym hubie (na którym też mam monitor VGA, ale to poza tematem).
Układ zasilany jest z USB przez regulator LDO.
Opcja "power target circuit from tool" nie chciała mi tutaj działać. Ogólnie nie chce mi ona działać z moim PICKIT3, pokazuje się komunikat, że jest za małe napięcie, ale chyba odczyt jest troszkę przekłamany. Może mój PK3 nie jest oryginałem, tylko klonem z Chin...
Początek testu - miganie diody LED:

Drugi etap testu - UART:

Trzeci etap testu - pojawia się urządzenie USB (klawiatura HID):

Widok z USB Dev View:

Czwarty etap testu - po wciśnięciu przycisku na płytce można pisać litery:

Projekt przykładu z repozytorium Microchipa, okrojony do minimum i przeniesiony pod moją płytkę:
Program testowy nr 2 - blink, UART, Ethernet
Następnie przylutowałem resztę układu (ENC28J60 i magjack). Na zdjęciu ENC28J60 w obudowie SSOP28 (inaczej ENC28J60/SS):

(początkującym jednak odradzam robienie takich zdjęć, łatwo jest uszkodzić układ poprzez ESD na skutek beztroskiego dotykania jego pinów)
Już ze złączem Ethernet:

Do testowania Ethernetu przygotowałem sobie drugi, osobny program. Użyłem do tego innego IDE niż wcześniej - Mikro C PRO for PIC32. Było to spowodowane przede wszystkim tym, że miałem go już w sumie gotowego w Mikro C jeszcze z czasów pisania pod PIC32MX250F128B. Wystarczyło tylko przenieść go pod użyty tutaj PIC, a one są w tej samej rodzinie, więc żaden problem.
Program ten wymaga poprawnie zlutowanego bloku ENC28J60 (wraz z rezonatorem 25MHz, wszystkim) i oczywiście podłączenia Ethernetu:

Skrócony kod przykładu:
Code: c
Osobna funkcja od odbsługi TCP:
Code: c
Po uruchomieniu programu najpierw miga dioda i wypisywane są komunikaty na UART:

Potem na złączu MagJack zapalają się diody (odbieranie i wysyłanie):

Komenda ping (a dokładniej: png 192.168.0.77 /t, z przełącznikiem /t czyli pingowanie non stop) wykrywa płytkę:

Na koniec można podłączyć się do PICa poprzez TCP (np. narzędziem Putty) i odebrać testowy komunikat:



Pełen projekt MikroC przykładu skonfigurowany pod PICa w wersji 575 (nie 975!):
Przykład 3 - Komunikacja HID
Teraz może dla odmiany przykład USB w Mikro C dla PIC32. Mikro C oferuje gotowe biblioteki dla USB, w tym dla komunikacji HID. Cały kod prostego Hello World HID sprowadza się do załączenia deskryptora USB i następującego kodu:
Code: c
Oczywiście konfiguracja zegara, PLL, itp. też powinna być poprawna. Trzeba respektować wymagania częstotliwości, np. UFin musi być równe 4MHz, a zegar USB 48MHz (dobieramy wartości div/PLL by było zgodnie z tym):

Swoje urządzenie nazwałem PIC32 mxetc:

Po wgraniu programu PICKITem i podłączeniu na USB Fubarino komputer od razu je widzi (HID nie wymaga sterowników):

Do sprawdzenia komunikacji HID może służyć samo narzędzie HID Terminal z Mikro C:

PIC odpowiada na komunikat:

Ten przykład HID można łatwo zmodyfikować i zrobić z niego już klawiaturę HID czy tam myszkę lub gamepada.
Pełen projekt MikroC przykładu skonfigurowany pod PICa w wersji 575 (nie 975!):
Programowanie w Arduino IDE
Oryginalne Fubarino SD kompatybilne jest z Arduino IDE, więc mój klon siłą rzeczy też jest. Można go programować w tym środowisku po dodaniu odpowiedniej paczki przez Boards Manager. Wtedy kod pisany na PICa łudząco przypomina oryginalne skecze Arduino oraz możemy go wgrywać przez USB. Wymaga to tylko jednokrotnego wcześniejszego wgrania bootloadera przez programator.
Szczegółowe informacje o tej płytce dla Chipkit/MPIDE znajdują się tutaj:
http://chipkit.org/wiki/index.php?title=ChipKIT_Fubarino_SD
Po wgraniu bootloadera płytka widziana jest jako "chipKIT USB Serial (Stk500v2 compatible)":

Plik bootloadera:
Po stronie komputera, w Arduino IDE, trzeba najpierw dodać lokalizację opisu płytki do "Additional Board Manager URLs". Link:
Quote:

A potem ten opis płytek dodać przez Boards Manager. Wyszukujemy "chipkit" (tam jest kompilator, itp. dla PIC32MX i biblioteki Fubarino):

Wymagane ustawienia Arduino IDE - trzeba wybrać programowaną płytkę oraz programowanie przez "serial (lecz w rzeczywistości to USB):

Aby wprowadzić płytkę w stan programowania trzymamy wciśnięty PRG i naciskamy RESET (puszczamy pierwszy RESET). Dioda na pinie 21 powinna zacząć szybko migać. Wtedy w Arduino IDE wykonujemy upload.
Sukces programowania przez bootloader USB:

Podsumowanie
Z projektu jestem zadowolony. Gdybym miał go teraz ulepszać, to być może użyłbym czegoś lepszego niż ENC28J60 (może z interfejsem RMII), ale jak składałem ten projekt to zależało mi by uruchomić go bez problemów, gdyż potrzebowałem już tych płytek w konkretnym celu, który być może wkrótce też zaprezentuję.
Oryginalnego Fubarino SD nigdy nie kupowałem, lecz myślę, że moja wersja wcale nie jest gorsza, choć gdybym miał oryginał , to być może ograniczyłbym się do zrobienia dla niego prostego shielda z Ethernetem. Ale po prostu nie opłacało mi się kupować Fubarino SD jak mogłem zrobić swoje.
Z mojej płytki wygodnie mi się korzysta, co prawda przycisk RESET jest teraz na jej środku, ale nie odczułem, by był to problem. Jeśli bym robił kolejną wersję, to być może rozważyłbym jakieś dodatkowe wyprowadzenie hosta USB w postaci złącza żeńskiego (opcjonalnego do przylutowania, jednocześnie z tym co jest), ale nie jest to niezbędne.
Dodatkowo można by zmienić footprint regulatora LDO 3.3V na jakiś większy, bo jednak troszkę ENC28J60 pobiera prądu w trakcie pracy, a jak robimy własny projekt to dochodzą też inne peryferia, więc trzeba myśleć przyszłościowo.
Wszystkie źródła (projekt płytki, testowe programy) i dokumentację daję jako załączniki w treści tekstu.
Cool? Ranking DIY