itoutline.me

 

Rigol 1054Z i dekodowanie SPI

Ciągnie mnie do “podsłuchiwania”, tym razem padło na protokół SPI. W moim wypadku jest tak, że podejrzenie pakietów czy przebiegu prądu w czasie i zobaczenie jak to wygląda od środka daje olbrzymią satysfakcję. A skoro oscyloskop, który umożliwia to drugie kosztuje ok. 1500 zł nie było na co czekać.

Źródło sygnału SPI

Źródłem sygnału jest Arduino UNO, bez podłączonego żadnego odbiornika SPI. Wyjścia MOSI i MISO są po prostu ze sobą połączone co tworzy lokalną pętlę (loopback).

Program, który będzie generował ciąg znaków “itoutline.me”:

spi_test.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <SPI.h>

char outByte [13] = "itoutline.me";
int i = 0;
const int slaveSelectPin = 10;

void setup()
{
  pinMode (slaveSelectPin, OUTPUT);
  SPI.begin();
  delay(100);
}

void loop()
{
  digitalWrite(slaveSelectPin,LOW);
  for(i = 0; outByte [i] != '\0'; i ++)
  {
    SPI.transfer(outByte [i]);
  }
  digitalWrite(slaveSelectPin,HIGH);
  delay(1000);
}

Nazewnictwo portów w SPI zbyt mocno regulowane nie jest (jak podaje Wikipedia):

“Oficjalnie” Można spotkać
SCLK SCK, CLK
MOSI SIMO, SDO (for master devices), SDI(for slave devices), DO, DOUT, SI, MTSR
MISO SOMI, SDO (for slave devices ), SDI(for master devices), DI, DIN, SO, MRST
SS nCS, CS, CSB, CSN, nSS, STE, SYNC


Konfiguracja pinów jest następująca:

  • pin 10 - SS (Slave Select) - CH2 (CS) niebieski
  • pin 11 (MOSI) i 12 (MISO) są ze sobą połączone - CH1 (DATA) żółty
  • pin 13 - SCK (Serial Clock) - CH3 (CLK) różowy

Podłączone sondy do Arduino:

Jak to widać ?

Piękny oscylogram, ze zdekodowanym SPI. Widać cykle zegara, dane które są wysyłane tylko w cyklach i zmianę stanu SS/CS podczas transmisji:

Widok “EventTable”:

“EventTable” niestety wyświetla tylko to co jest widoczne na ekranie. Jeśli mamy dużo danych w pojedynczym komunikacie to niekoniecznie rozciągniemy go na ekranie tak, żeby zadziałał dekoder SPI (potrzebna jest do tego zmiana stanu SS/CS widoczna na ekranie). Np. wysyłając 25 bajtów (“itoutline.me_itoutline.me”).

Zobaczymy za mało miejsca, żeby wyświetlić na zielonej linii dekodera dane. Niestety tabela raczej nie podaje ich do końca poprawnie bo widać, że w trzecim bajcie mamy “.” zamiast “o”.

Wracając do tego, że jest potrzebna widoczna zmiana SS/CS na ekranie w celu zdekodowania SPI. Mamy długi komunikat, widać tylko jego 15 bajtów i zmianę SS/CS:

Gdybyśmy chcieli zobaczyć co jest dalej i przesunęli przebieg w lewo, tracąc jednocześnie zmianę SS/CS z pola widzenia:

Jest problem.

Na poniższym zrzucie zamieściłem wszystkie ustawienia dekodera SPI jakie zastosowałem do jego wykonania:

No i najważniejsze rozłożenie pojedynczego bajtu na bity :) 0b01101001 = 0x69 = “i” ASCII

Ostateczna kontrola ołówkiem:

Wykorzystuje oscyloskop bardzo mocno amatorsko ale potencjał tego urządzenia jest naprawdę imponujący. Oczywiście zakup oscyloskopu tylko dla dekodowania SPI to bardzo średni pomysł zważywszy na obecność analizatorów logicznych za 30 zł, no ale to dopiero początek :)

Comments