Port WaveForms SDK na Pascal
SPI - Digital I/O i obsługa protokołów

część 5

podstawowe informacje o urządzeniu i sterowanie zasilaczem
cykliczna akwizycja danych i histereza triggera
UART - Digital I/O i obsługa protokołów
I2C - Digital I/O i obsługa protokołów
SPI - Digital I/O i obsługa protokołów (mostek Wheatstone'a)
SPI - Digital I/O i obsługa protokołów (pomiar Iadj w LM317)
Digital I/O - ROM Mode, przerzutnik RS i dekoder do rosyjskiej VFD
Digital I/O - bezpośredni dostęp, wyświetlacz HDSP-2111 i termometr MCP9700
Analog OUT - woltomierz True RMS z przetwarzaniem sygnału

☘☘☘☘☘
magistrala SPI i mostek Wheatstone'a

Kolejny bardzo popularny sposób komunikacji to tytułowe SPI (Serial Peripheral Interface), oczywiście i ta magistrala ma swoje miejsce w oknie Protocol, na swojej dedykowanej zakładce. Ma także pełne wsparcie od strony WaveForms SDK, choć nie ukrywam - w porównaniu z UART czy I2C - tam trzeba się nieco nagłówkować.

Chcąc przygotować demko napotkałam pewien drobny kłopot - co by tu wybrać na głównego bohatera odcinka?

Wszelkie rejestry przesuwne typu 74LS165 (in) czy 74HC595 (out) były już eksploatowane do znudzenia wręcz, przetwornik TLC591 też był chyba przerabiany jak i termopara MAX6675, no scalaki do SPI się normalnie kończą. Szczęściem przypomniała mi się bardzo ciekawa kostka, kolejny próbkowy gifcik od moich milusińskich z firmy Microchip Technology, a mianowicie - sterowany via SPI cyfrowy potencjometr. Tak więc, z układowego punktu widzenia, w roli głównej wystąpi kostka MCP41HV51103 (rodzinka MCP41HVX1) czyli wysokonapięciowy potencjometr 10kΩ.



Wszelkie dane katalogowe i opisy znajdziemy w lokalizacji: ➮ http://ww1.microchip.com/downloads/en/devicedoc/20005207b.pdf

Mistrzami drugiego planu zostaną zgodnie: maleńkie źródło napięcia wzorcowego 10.0V typu LT1031: ➮ https://www.analog.com/media/en/technical-documentation/data-sheets/1031fb.pdf i oczywiście niezawodne i wszędobylskie Meratroniki V640 oraz V543. To lecimy...



gałka to przeżytek

Wstępne eksperymenty z komunikacją SPI przeprowadziłam oczywiście przy pomocy okienkowej aplikacji WaveForms, chwilę trwało dogadanie się z wszelkimi opcjami, ale finalnie udało mi się porozumieć z kostką potencjometru, okienka i pomiary rezystancji dla trzech skrajnych ustawień (0, 50%, max) przedstawia rysunek poniżej.



Jak widzimy zakładka SPI okna Protocol kompleksowo obsługuje komunikację i jest w miarę intuicyjna, ale na kilka rzeczy należy zwrócić uwagę. Po pierwsze, listy wyboru Polarity i Phase określają tak zwane SPI Mode, co tam ma być ustawione - narzuca nam dokumentacja układu, z którym będziemy się komunikować. Po drugie - rozdzielono logicznie bloki polecenia i danych w ramce SPI, tak więc przy komunikacji z girlandą kostek typu np. 74HC595 trzeba się mentalnie przestawić na taki sposób podawania danych.

Wstępne testy kostki potencjometru polegały na pomiarze rezystancji dolna końcówka (B)-suwak(W) i to widzimy na obrazku. Ciekawą natomiast okazała się zmiana rezystancji potencjometru przy zmianie napięcia zasilającego układ, pomiary dla ±10V i ±15V:

 pomiary
Ucc     ±10V        ±15V  
data Rab kΩ Rab kΩ
FF 10.144 10.117
80 5.162 5.133
00 0.135 0.106

Podobnie jest z rezystancją mierzoną na skrajnych zaciskach A-B potencjometru, widzimy to na obrazku poniżej dla zasilania 10 i 15V.



Tak w ogóle, to temat tego potencjometru jest megaciekawy sam w sobie, ale jednak wracamy do zastosowania.

pan Charles Wheatstone i SPI

Skoro mamy element zmieniający rezystancję według danych z interfejsu SPI to czemu by nie zbudować, choćby próbnego, modelowego układu mostka, jaki drzewiej wymyślił pan Wheatstone ➮ https://pl.wikipedia.org/wiki/Mostek_(elektronika)

Zatem proszę, na rysunku poniżej schemat mojego układu do eksperymentów:



Realizacja na płytce stykowej:



No i oczywiście aspekty programowe. Do obsługi SPI w WaveForms SDK mamy oddelegowany specjalny zestaw funkcji, etap typowej inicjalizacji interfejsu przedstawia fragment listingu:

//main.pas
procedure TMainForm.SetupSPI;
begin
    FDwfDigitalSpiFrequencySet( hAd2, 1E3 );     // 1kHz
    FDwfDigitalSpiClockSet( hAd2, DIO_1 );       // CLK = DIO_1
    FDwfDigitalSpiDataSet ( hAd2,  FUNC_DQ0_MOSI_SISO (* idxDQ *), DIO_2 );   // DQ0 (MOSI) = DIO_2
    FDwfDigitalSpiDataSet ( hAd2,  FUNC_DQ1_MISO (* idxD1 *), DIO_3 );        // DQ1 (MISO) = DIO_3
    FDwfDigitalSpiModeSet ( hAd2, 0 ); // SPI w 0 - Mode 0,0 , 3-Mode 1,1
    FDwfDigitalSpiOrderSet ( hAd2, 1 );  // MSB first
    FDwfDigitalSpiSelect ( hAd2, DIO_0, SPI_SEL_HIGH );   // /SEL = DIO_0, wymuś H
end;

a cała aplikacja w lokalizacji: ➮ https://github.com/bienata/AnalogDiscovery2/tree/master/spi_41hv51_bridge_1

Nie ma tu wielkich czarów, ale proszę zauważyć, że w wywołaniach funkcji posługuję się odpowiednio nazwanymi stałymi, co poprawia czytelność całości, taką mam przynajmniej nadzieję. Dla porównania kawałek kodu, który powstał bezpośrednio na bazie przykładów Digilenta: ➮ https://github.com/bienata/AnalogDiscovery2/tree/master/spi_41hv51_1

Samo wysyłanie ramek danych przez skonfigurowane łącze jest banalnie proste:

 main.pas
 FDwfDigitalSpiSelect ( hAd2, DIO_0, SPI_SEL_LOW );
 FDwfDigitalSpiWrite16 ( hAd2, DQ_MOSI_MISO , 16, @spiTx, 1 );
 FDwfDigitalSpiSelect ( hAd2, DIO_0, SPI_SEL_HIGH );

gdzie spiTx to zmienna typu smallint (16 bit), niosąca zawartość do nadania. Całość daje nam aplikację do obsługi testowego mostka Wheatstone'a, okienko jak poniżej:



Przygotowania do pamiątkowego filmiku:



I na koniec - efekt pracy zabawowego mostka Wheatstone'a, który w sumie całkiem sensownie działa:



Prezentowane wartości są as-is, bez zaokrągleń - tu chodzi o demo funkcjonalne, a nie o urealnienie odczytów. A w formie dygresji - widać jak przydatny w warsztacie jest V640, tym razem ze względu na możliwość wystąpienia w roli wskaźnika zera. Na cyfrowym mierniku z Biedronki nie byłoby takiego efektu wizualnego.

epilog tymczasowy

Krótka opowiastka o SPI kończy niniejszym Tryptyk Protokolarny. Podobnie jak dla UART czy I2C - zestaw funkcji kompleksowo obsługuje większość życiowych przypadków, nawet jeżeli spotkamy się z rozwiązaniem sprzętowym typu domowa samoróbka na rejestrach TTL - będziemy w stanie nawiązać z tym łączność, to pewnik. Uwaga na temat przykładów od Digilent obowiązuje - trzeba się nieco pozastanawiać, ale gdy zaskoczymy jak to pracuje - droga do własnych eksperymentów stoi otwarta.

Tak wiem, pozostała jeszcze magistrala CAN, ale to już by się zrobił poliptyk to po raz, a po dwa - musiałabym siedzieć z laptopem w zimnym samochodzie. No i w moim Passatku pełny CAN nie jest raczej dostępny na złączu pod hamulcem ręcznym (tam jest afaik OBD-2), a majstrowanie przy wiązkach to mi się raczej nie uśmiecha, auto wolę mieć sprawne. póki co.


#slowanawiatr, grudzień 2018

Natasza Biecek 2004-2019/~, e-mail