Port WaveForms SDK na Pascal SPI - Digital I/O i obsługa protokołów część 5 |
|
||||
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:
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:
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:
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 |
![]() |
![]() |
![]() |