♪ ♬ ☘ Moja muzyka do kodowania ☘ ♬ ♪
♫ ♩ ♪ Death ⚡ ☘ ⚡ Voice of the Soul ♪ ♩ ♫
https://youtu.be/j3OPOYG6XIQ
W temacie Chiński Moduł LED & Key pozwoliłam sobie na stwierdzenie, że ręczna konfiguracja ustawień analizatora SPI jest w tym oscyloskopie cokolwiek upierdliwa. Opinię ową podtrzymuje, ale aby nie poprzestać na pustej krytyce - poniżej mały przydaś, który wstępnie konfiguruje nam Rigola do tego zadania. Główne parametry to:
* DATA = CHANNEL1
* CLK = CHANNEL2, dane na narastającym zboczu
* CS = CHANNEL3, aktywny stan niski
* 8 bitów danych
* format szesnastkowy
* kolejność bitów - LSB - od najmłodszego
Powyższe zostało ubrane w niewielki skrypt, który po pierwsze konfiguruje do pracy trzy kanały oscyloskopu (DC, 5V/div, 1x, T:200us), następnie woła sekwencje ustawiającą parametry parsera SPI, oto on:
rigspi.sh pisze:Kod: Zaznacz cały
#!/bin/bash
declare -a scpiCommands=(
":channel1:probe 1"
":channel1:scale 5"
":channel1:range 40"
":channel1:coupling DC"
":channel1:display 1"
":channel2:probe 1"
":channel2:scale 5"
":channel2:range 40"
":channel2:coupling DC"
":channel2:display 1"
":channel3:probe 1"
":channel3:scale 5"
":channel3:range 40"
":channel3:coupling DC"
":channel3:display 1"
":trigger:mode edge"
":trigger:edge:level 1"
":timebase:scale 0.0002" # T = 200 us/div
":decoder1:mode SPI"
":decoder1:spi:clk channel2"
":decoder1:spi:mosi channel1"
":decoder1:spi:cs channel3"
":decoder1:format hex"
":decoder1:spi:mode CS"
":decoder1:spi:endian LSB"
":decoder1:spi:width 8"
":decoder1:spi:edge RISE"
":decoder1:spi:polarity POS"
":decoder1:spi:select NCS"
":decoder1:format hex"
":decoder1:display 1"
)
echo "SPI setup"
for cmd in "${scpiCommands[@]}"
do
echo "$cmd"
echo "$cmd" | netcat -w 20 cukierek 5555
sleep 0.5
done
Oczywiście przed uruchomieniem tego skryptu warto Rigola zresetować komendą SCPI '*RST'.
Dalsza prezentacja na układzie jak we wzmiankowanym wyżej temacie, real-life chińskiej kostki TM1638 a nie akademickie dywagacje, dodatkowo pokażę jak to samo obsługuje Analog Discovery 2.
Do obserwacji mamy w sumie trzy przypadki
prosty transfer ośmiobitowy na przykład sterowanie jasnością wyświetlacza
Kod: Zaznacz cały
.loop lda #$89
jsr tm1638_command
lda #$8A
jsr tm1638_command
lda #$8B
jsr tm1638_command
lda #$8C
jsr tm1638_command
jmp .loop
AD2 - WaveForms
Rigol, gdy wszystko mu odpowiada w bitowych ramkach
Tu się deko pogubił w interpretacji, więc te pakiety oznacza.
transfer szesnastobitowy zapis danej pod wskazany adres
Kod: Zaznacz cały
.loop lda #DIG_0
ldb #0
jsr tm1638_writeat
jmp .loop
AD2
Rigol, rozmiar pakietu 8 bitów
Tu widzimy, a raczej nie widzimy wprost, gdzie jest starszy a gdzie młodszy bajt, trzeba zerkać na przebiegi aby złapać kontekst
Rigol, rozmiar pakietu 16 bitów
Tu całe słowo jest sensownie poskładane.
transfer mieszany 8/16 bit np. komenda sterująca, potem zapis do pamięci
Kod: Zaznacz cały
.loop lda #$89
jsr tm1638_command
lda #DIG_0
ldb #0
jsr tm1638_writeat
jmp .loop
AD2
Rigol w trybie 16 bit
Wnioski moje, będące subiektywną dość opinią są takie:
* jeżeli chodzi o komfort pracy z analizatorem - AD2 robi z Rigola miazgę
* odzwierciedlenie tego, co naprawdę pomyka przez SPI (a wiem, bo sama dziergałam ten kod) - jest porównywalne, ale do Rigolowej interpretacji trzeba się odrobinę przyzwyczaić, najlepiej testując analizator na znanych sobie sekwencjach i z różnymi ustawieniami.
Pozostała na koniec sprawa triggera wzorcem, czyli rozpoczęcia analizy gdy wpadnie nam określony bajt rozpoczynający jakąś większą sekwencję. Tego nie udało mi się póki co przećwiczyć, ale jeszcze pokombinuję w wolnej chwili.