♫ ♩ ♪ The Birthday Massacre ⚡ ☘ ⚡ Looking Glass ♪ ♩ ♫
https://youtu.be/m6HAFYi8-sY
Tryptyk Protokolarny
☘
część trzecia - SPI
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/d ... 05207b.pdf
Mistrzami drugiego planu zostaną zgodnie: maleńkie źródło napięcia wzorcowego 10.0V typu LT1031: https://www.analog.com/media/en/technic ... 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:
Kod: Zaznacz cały
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 pisze:Kod: Zaznacz cały
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/AnalogDiscov ... 1_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/AnalogDiscov ... i_41hv51_1
Samo wysyłanie ramek danych przez skonfigurowane łącze jest banalnie proste:
main.pas pisze:Kod: Zaznacz cały
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:
https://youtu.be/GZBMYBv-DaM
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