Czym jest programowanie skryptowe I2C/SPI z REVELPROG-IS?
Programowanie skryptowe I2C/SPI w przypadku REVELPROG-IS pełni funkcje tzw "BUS Pirate" dla protokołów szeregowej transmisji I2C oraz SPI. Narzędzie jest nadal w fazie rozwojowej ale już o ogromnych możliwościach. Przy wykorzystaniu skryptów istnieje możliwość wywoływania dowolnych komend (rozkazów) na magistrali w dowolnej sekwencji z zachowaniem odpowiednich opóźnień czasowych. Przykładowe zastosowanie to wszelkie niestandardowe operacje na pamięci, udokumentowane (bądź nie) w nocie katalogowej układu, np. odblokowanie urządzeń (ukryta sekwencja zapisu haseł), odczyt i zapis ukrytych rejestrów, zapis niestandardowych rejestrów (sector protection bits, rejestry OTP) itd.
W praktyce też jest to bardzo praktyczne narzędzie dla elektroników konstruktorów oraz programistów embedded. Do złącza ICSP programatora REVELPROG-IS można podłączyć się z dowolnym urządzeniem lub układem po SPI lub I2C. W programatorze można wybrać napięcie zasilania i poziom sygnałów (od 1.0 do 5.0V z rozdzielczością 0,1V) więc dodatkowe zasilanie samego układu może być zbędne.
Struktura skryptów
Każdy skrypt składa się z:
- nagłówka - informacja o wersji oprogramowania w jakiej został przygotowany skrypt
- ustawień hardware - wybór napięcia (VPP), magistralii (I2C/SPI) oraz szybkości tranmisji,
- sekwencji operacji (od 1 do n).
Każda operacja składa się z:
- ustawień parametrów, tj. liczba bajtów do zapisu, liczba bajtów do odczytu, ustawienia opóźnień
- instrukcji - sekwencji bajtów do wykonania w ramach pojedynczej instrukcji
- danych (opcjonalnie) - sekwencji bajtów do przesłania po wykonaniu instrukcji
Przykładowa struktura skryptu ze zdefiniowanym nagłówkiem (wersja 1.6.0), ustawieniami hardware (magistrala SPI, napięcie 3.3V, najwolniejsza prędkość transmisji) oraz jedną operacją z jedno-bajtową instrukcją.
Code: Select all
// przykladowa struktura skryptu
#SCRIPT HEADER;
SCRIPT:v1.6.0;
#HARDWARE SETTINGS;
HW:SPI,3.3V,SLOW;
#OPERATION;
SW:0,0,1,3,5,5,10,0,100,1000;
INSTR:9F;
Istotne elementy składni skryptu:
- znak hash "#" definiujący sekcje, np. #SCRIPT HEADER; (nagłowek), #HARDWARE SETTINGS; (ustawienia hardware), #OPERATION; (dla każdej operacji)
- średnik ";" umieszczany na końcu każdego polecenia,
- dwukropek ":" umieszczany po słowach sterujących, np. SCRIPT: (wersja skryptu), HW: (ustawienia hardware), SW: (ustawienia parametrów operacji), INSTR: (instrukcja), DATA: (dane do zapisu)
- przecinek "," oddziela parametry występujące po słowach sterujących (np. między "INSTR:" a ";" przecinek oddziela poszczególne bajty instrukcji)
- podwójny ukośnik "//" poprzedza komentarze - dane ignorowane przez interpretator skryptu
Generator skryptu
W celu ułatwienia pisania skryptów można skorzystać z narzędzia generatora skryptu, w którym istnieje możliwość wygenerowania pojedynczych operacji z różnymi parametrami.
Ustawienia software dla poszczególnych operacji:
- WREN (Write Enable) - właczenie zapisu danych + ilość bajtów danych do przesłania w pojedynczej operacji,
- RDEN (Read Enable) - włączenie odczytu danych + ilość bajtów do odczytu po wykonaniu pojedynczej operacji,
- DBO (Delay Before Operation) - dodatkowe opóźnienie w milisekundach przed wykonaniem danej operacji,
- DAI (Delay After Instruction) - dodatkowe opóźnienie w milisekundach bezpośrednio po wykonaniu instrukcji dla danej operacji,
- DAW (Delay After Write) - dodatkowe opóźnienie w milisekundach po przesłaniu bajtów danych (np. czas potrzebny na przetworzenie danych przez układ),
- DAO (Delay After Operation) - dodatkowe opóźnienie w milisekundach po wykonaniu całej operacji (przed przejściem do wykonywania kolejnej operacji),
- BSYO (Busy Operation) - maksymalny czas oczekiwania na gotowość układu (badanie flagi busy, np. tzw. Wait For Write End dla pamięci FLASH SPI czy maksymalny czas oczekiwania na ACK dla pamięci I2C)
- TOUT (Timeout) - maksymalny czas oczekiwania przez PC na wykonanie całej operacji (zaleca się aby był dłuższy niż dwukrotność sumy powyższych opóźnień).
Ustawienie powyższych parametrów zgodnie z powyższym zrzutem ekranu wygeneruje następujący kod poniższej operacji:
Code: Select all
#OPERATION;
SW:0,0,1,3,5,5,10,0,100,500;
INSTR:9F;
Jak widać ustawienia software odpowiadają kolejnym parametrom dla ustawień "SW:" z pewnymi zastrzeżeniami:
- ilość bajtów odczytu/zapisu jest wyrównana do zera, tzn. 0 oznacza 1, a 255 oznacza 256
- jeżeli zapis lub odczyt jest wyłączony (0) to ilość bajtów zapisu/odczytu jest ignorowana
Format danych:
- ustawienia SW i HW defniniuje się w formacie dziesiętnym
- instrukcje (INSTR:) oraz dane do zapisu (DATA:) definiuje się w formacie hex (szasnastkowym)
Dodatkowe uwagi
Należy przestrzegać zachowania składni skryptu, gdyż interpretator skryptu nie toleruje błędów To znaczy nie można zapominać o przecinkach, średnikach, dwukropkach ani poleceniach sterujących gdyż na tym etapie zachowanie programu może być nieprzewidywalne, jak również może nie wykonać danej operacji oraz nie poinformować o tym fakcie użytkownika.
W dodatkowych dodatkowych postach w tym temacie przedstawie kilka przykładowych skryptów realizujących różne operacje.