<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=8169&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-09-03T12:49:34+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=8169&amp;mode</id>
<entry>
<author><name><![CDATA[Unter]]></name></author>
<updated>2014-08-31T19:29:08+01:00</updated>
<published>2014-08-31T19:29:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=93757#p93757</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=93757#p93757"/>
<title type="html"><![CDATA[Re: SPI wysyłanie/odbieranie własnej ramki danych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=93757#p93757"><![CDATA[
Zgodnie z radami użytkownika atmel poradziłem sobie z transmisją przy użyciu interfejsu SPI.<br />Ogromne podziękowania za pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Powstały kod wklejam poniżej, niestety jest on &quot;wyrwany&quot; z mojego projektu więc jeżeli czegoś brakuje, lub coś jest źle proszę dać znać. <br />Ramki zapisywane są w dwóch uniach, jedna zawiera dane wysyłane, a druga odbierane. Do uni można już w prosty sposób &quot;dobrać się&quot; za pomocą : <em>uniaramka2.ramka.zmienna1</em><br />Callback-i i Eventy na razie zostawiam na później, zaraz po tym jak zdobędę greenbook-a <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Rozwiązanie wklejam również od pierwszego posta<br />Pozdrawiam serdecznie<br />Przemek<br /><br />[syntax=c]// SPI.h<br />typedef struct{<br />uint8_t zmienna1;<br />uint8_t zmienna2;<br />uint16_t wartosc1;<br />uint16_t wartosc2;<br />uint16_t wartosc3;<br />uint8_t parametr1;<br />uint8_t parametr2;<br />char znak1;<br />char znak2;<br />}t_RAMKA;<br />typedef union{<br />uint8_t idx&#91;25&#93;;<br />t_RAMKA ramka;<br />}t_UNIARAMKA;<br /><br />void SPI_byte_send(uint8_t u8Data);<br />uint8_t SPI_byte_transmission(uint8_t u8Data);<br />void SPI_transmission(uint8_t *data_send,uint8_t *data_receiv,uint8_t bajts);<br /><br />#ifndef SPI_SLAVE<br />void SPI_Master_init(void);<br />#else<br />void SPI_Slave_init(void);<br />#endif[/syntax]<br /><br />[syntax=c]SPI.c<br />#include &quot;spi.h&quot;<br /><br />//-------------------------------------------------------------------------------------------------<br />//Transmisja danych dla trybu pracy Master<br />//-------------------------------------------------------------------------------------------------<br />void SPI_byte_send(uint8_t u8Data)<br />{<br />//Rozpoczęcie transmisji<br />SPDR = u8Data;<br />//Oczekiwanie na zakończenie transmisji<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br />}<br />//-------------------------------------------------------------------------------------------------<br /><br />uint8_t SPI_byte_transmission(uint8_t u8Data){<br />SPI_byte_send(u8Data);<br />return SPDR;<br />}<br /><br />void SPI_transmission(uint8_t *data_send,uint8_t *date_receiv,uint8_t bajts){<br />static uint8_t i;<br />bajts--;<br />for (i=0;i&lt;=bajts;i++)<br />{<br />*date_receiv=SPI_byte_transmission(*data_send);<br />data_send++;<br />date_receiv++;<br />}<br />}<br /><br />#ifndef SPI_SLAVE<br /><br />//-------------------------------------------------------------------------------------------------<br />//Inicjalizacja interfejsu SPI dla trybu pracy Master<br />//-------------------------------------------------------------------------------------------------<br />void SPI_Master_init(void)<br />{<br />//Ustawienie MOSI i SCK jako wyjścia,a resztę jako wejścia<br />DDR_SPI |= (1&lt;&lt;DD_MOSI)|(1&lt;&lt;DD_SCK|(1&lt;&lt;DD_SS));<br />DDR_SPI &amp;= ~(1&lt;&lt;DD_MISO);<br />//Aktywuj SPI w trybie Master, ustaw zegar fck/64<br />SPCR = (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR0);<br />PORTB |= (1&lt;&lt;PB4);<br />PORTB &amp;= ~(1&lt;&lt;PB6);<br />//char *wsk=SPI_Send;<br />//wsk=&quot;40123456789&quot;;<br /><br />}<br />//-------------------------------------------------------------------------------------------------<br /><br />#else<br /><br />//-------------------------------------------------------------------------------------------------<br />//Inicjalizacja interfejsu SPI dla trybu pracy Slave<br />//-------------------------------------------------------------------------------------------------<br />void SPI_Slave_init(void)<br />{<br />//Ustaw MISO jako wyjście,a resztę jako wejścia<br />DDR_SPI = (1&lt;&lt;DD_MISO);<br />//Aktywuj SPI<br />SPCR = (1&lt;&lt;SPE);<br />}<br />//-------------------------------------------------------------------------------------------------<br /><br />#endif[/syntax]<br /><br />[syntax=c]//main.c<br /><br />#include &quot;SPI.h&quot;<br /><br />int main(void)<br />{<br />t_UNIARAMKA uniaramka;<br />t_UNIARAMKA uniaramka2;<br />uniaramka.ramka.zmienna1=1;<br />uniaramka.ramka.zmienna2=2;<br />uniaramka.ramka.wartosc1=300;<br />uniaramka.ramka.wartosc2=1000;<br />uniaramka.ramka.wartosc3=15000;<br />uniaramka.ramka.parametr1=6;<br />uniaramka.ramka.parametr2=7;<br />uniaramka.ramka.znak1=13;<br />uniaramka.ramka.znak2=14;<br /><br />while(1){<br />PORTB &amp;=~(1&lt;&lt;DD_SS);<br />SPI_transmission(uniaramka.idx,uniaramka2.idx,12);<br />PORTB |=(1&lt;&lt;DD_SS);<br />}<br />}[/syntax]<br /><br />A oto otrzymany rezultat:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/5491/b85a6ebab09a33381567838723a3c8d3.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5491/b85a6ebab09a33381567838723a3c8d3.jpg" alt="Obrazek" /></a><br /><br /><a href="http://forum.atnel.pl/_obrazki/o/5491/06e16ffe6911fa639953a9f147dcfacf.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5491/06e16ffe6911fa639953a9f147dcfacf.jpg" alt="Obrazek" /></a><br /><br />Przebiegi otrzymałem przy pomocy analizatora stanów logicznych <em>Saleae logic</em> , który polecam początkującym takim jak ja, aby na własne oczy zobaczyć &quot;co w trawie piszczy&quot; (oczywiście zdaję sobie sprawę, że to nie oscyloskop i należy o tym pamiętać).<br /><br /><span style="color: #FF0000">[ panie szanowny kolego unter - bardzo proszę wstawiać miniaturki obrazków jeśli są TAK DUŻE bo rozjeżdża się forum .... jeśli kolega tego nie poprawi to będę zmuszony usunąć obrazki <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> - mirekk36 ]</span><br /><br /><span style="color: #40BF40">Edit:</span> Wysyłałem oba obrazki przez forum i za każdym razem do tej grafiki nie tworzyło miniaturki<br />Przyznam szczerze, że nie mam pojęcia dlaczego... pomogło wklejenie obrazka do pliku który &quot;dostawał&quot; miniaturkę i wysłanie go na forum.<br />Za problemy przepraszam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5491">Unter</a> — 31 sie 2014, o 19:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2014-08-18T00:49:25+01:00</updated>
<published>2014-08-18T00:49:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91857#p91857</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91857#p91857"/>
<title type="html"><![CDATA[Re: SPI wysyłanie/odbieranie własnej ramki danych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91857#p91857"><![CDATA[
Dokładnie o to chodziło. Mamy tutaj przykład typowej maszyny stanów (dwóch <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ).<br />Takie rozwiązanie doskonale ujednolica kod i w prosty sposób umożliwia dowolne modyfikowanie ramki.<br /><br />Rozwiązaniem uniwersalnej funkcji do wysyłki/odbioru danych są oczywiście &quot;callback'i&quot; tzn. wskaźniki na funkcje (dedykowane dla każdego z interfejsów). Prościej mówiąc, każdy z interfejsów wywołuje funkcję w identyczny sposób, ale dla każdego jej działanie (źródło danych) jest inne.<br /><br />Tego tematu jednak nie śmiem powielać po tak doskonałych poradniach Mirka, do których serdecznie odsyłam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 18 sie 2014, o 00:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Unter]]></name></author>
<updated>2014-08-17T23:37:54+01:00</updated>
<published>2014-08-17T23:37:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91852#p91852</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91852#p91852"/>
<title type="html"><![CDATA[Re: SPI wysyłanie/odbieranie własnej ramki danych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91852#p91852"><![CDATA[
Ilość zmiennych jak i ich kolejność w moim przypadku będzie znana po obu stronach więc przychylę się do rezygnacji z separatorów. Funkcja którą próbuję stworzyć będzie miała za zadanie odebrane dane wysłane w jednym ciągu przypisać do odpowiednich zmiennych.<br />Gdy powstanie swego rodzaju &quot;ramka danych&quot; będzie ona uniwersalna bo jej obróbka dla różnych interfejsów będzie taka sama, dlatego własnie mi na tym zależy.<br />Oczywiście dziękuję za dotychczasową pomoc atmel <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><br />Edit:<br />W temacie &quot;Odbieranie danych z RS232 i dekodowanie&quot; chyba znalazłem sposób o który chodziło <br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Wysyłaj komunikaty o stałej długości, czyli (preambuła, cyfra1, cyfra2, ...cyfraN).<br />Po stronie odbiornika czekasz na bajt o wartości preambuły.<br />Jeżeli przyjdzie, to wiesz że jest to początek komunikatu i zaraz nadejdzie znana liczba bajtów.<br />Czyli (w pseudokodzie):<br /><br />przerwanie_od_zdarzenia_rx_complete:<br />Rx_data = Udr0<br />select case stan_odbioru<br />case czekam_na_preambule<br />if rx_data=preambula then stan_odbioru=poczatek_komunikatu; licznik=0<br /><br />case poczatek_komunikatu<br />bufor(licznik)=rx_data<br />incr licznik<br />if licznik=dlugosc_komunikatu then stan_odbioru=koniec<br /><br />end select<br /><br />W petli glownej sprawdzasz czy stan_odbioru=koniec i robisz z wynikiem co tam chcesz, potem ustawiasz stan_odbioru=czekam_na_preambule<br />Można obudować to potem jakąś sumą kontrolną, timeoutem, etc...<br /></div><br />Teraz jeszcze ubrać to w kod ... dzisiaj już nie dam rady ale jak tylko mi się uda postaram się to wrzucić<br />Nie mam jeszcze koncepcji jak napisać funkcję do wysyłania danych w ten sposób by pasowała do różnych interfejsów (UART, SPI, Ethernet(UDP))<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5491">Unter</a> — 17 sie 2014, o 23:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2014-08-17T22:49:20+01:00</updated>
<published>2014-08-17T22:49:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91851#p91851</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91851#p91851"/>
<title type="html"><![CDATA[Re: SPI wysyłanie/odbieranie własnej ramki danych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91851#p91851"><![CDATA[
Zgadza się, jednak nie do końca się do tego tak podchodzi. Separatory zdecydowanie zmniejszają prędkość transmisji i nie ma sensu ich implementować. Jeśli znane są typy oraz ilość wysyłanych danych to zarówno nadawca jak i odbiorca utrzyma prawidłową łączność. Ważne są jedynie nagłówki i ewentualnie znaki terminatora (prefix, suffix) np.: [d1d2d3...].<br />Jeśli ilość/długość danych jest nieznana to tutaj w grę wchodzi jakiś własny &quot;protokół&quot;, który powiedzmy w pierwszym swoim bajcie przechowuje taką informacje.<br /><br />Identycznie sprawa się ma odnośnie wysyłania 0. Po prostu nie analizujemy danych jako ciągi znakowe, a jako sekwencje danych do których 0 się również zalicza.  W takim wypadku odpadają oczywiście wszystkie metody analizy tekstu, a w grę wchodzi właśnie automat lub pętla odbiorcza, która jest niejako jego prostszą wersją (zmienna licznikowa jest informacją o aktualnym stanie automatu).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 17 sie 2014, o 22:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Unter]]></name></author>
<updated>2014-08-17T22:31:23+01:00</updated>
<published>2014-08-17T22:31:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91848#p91848</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91848#p91848"/>
<title type="html"><![CDATA[Re: SPI wysyłanie/odbieranie własnej ramki danych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91848#p91848"><![CDATA[
Rozumiem ale wydawało mi się, że jeżeli tak zrobię przy wysłaniu wartości zmiennej typu uint8_t równej 124<br />funkcja odpowiedzialna za dzielenie odebranego z SPI ciągu znaków odczyta go jako separator &quot;|&quot; (kod ASCII) [ponieważ jakiś ten separator musi być <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ]... to samo wydaje mi się że tyczy się wysyłania zera ... która odpowiada według ASCII NULL i może być błędnie odczytane jako koniec ciągu znaków ??<br />Jeżeli mylę się to proszę o wyprowadzenie mnie z błędu (na dokładnie tą chwilę nie posiadam drugiego mikrokontrolera aby wykonać test)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5491">Unter</a> — 17 sie 2014, o 22:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2014-08-17T22:40:03+01:00</updated>
<published>2014-08-17T22:18:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91843#p91843</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91843#p91843"/>
<title type="html"><![CDATA[Re: SPI wysyłanie/odbieranie własnej ramki danych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91843#p91843"><![CDATA[
Najlepszym rozwiązaniem jest oczywiście transmisja danych w sposób bezpośredni (bez użycia niepotrzebnych konwersji). Lepiej wysyłać bajty tzn. zamiast '%X' dać '%c' i w razie typów większych od 1B stosować przesunięcia bitowe.<br /><br />Parsowanie otrzymanych danych można dokonywać na wiele różnych sposobów, począwszy od FSM (skończonej maszyny stanów) aż po analityczną analizę łańcuchów znakowych.<br /><br />Pierwszej metody opisywał nie będę, mimo iż jest ona podstawą wszystkich protokołów komunikacyjnych, ponieważ jest tego mnóstwo wszędzie. Natomiast odnośnie drugiej, można użyć funkcji &quot;strchr&quot; do wyszukania separatora (znaku '|'), który defacto nie ma sensu w przypadku transmisji &quot;bajtowej&quot;. Następnie wyszukany fragment można skonwertować przy użyciu funkcji &quot;strtol&quot;.<br /><br />Parsowanie kolejnych danych może wyglądać w ten sposób (dodatkowo niezbędna pętla):<br /><br />[syntax=c]uint8_t Data = strtol(strchr(str, '|') + 1, (char**) NULL, 16);[/syntax]<br />Jednak zdecydowanie lepiej nie dokonywać żadnych konwersji, jeżeli urządzenie odbiorcze tego nie wymaga.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 17 sie 2014, o 22:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Unter]]></name></author>
<updated>2014-09-03T12:49:34+01:00</updated>
<published>2014-08-17T19:06:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91804#p91804</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91804#p91804"/>
<title type="html"><![CDATA[SPI wysyłanie/odbieranie własnej ramki danych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8169&amp;p=91804#p91804"><![CDATA[
To mój pierwszy post na Forum więc:<br />Witam wszystkich serdecznie <br />Jestem szczęśliwym posiadaczem <span style="color: #0040FF">BlueBooka </span> i zestawu firmy Gotronik na ATmegę16/32 ver2<br />Mój problem dotyczy transmisji danych przez SPI ale kod ten może bez problemu zostać zaadoptowany do innych interfejsów.<br />Opis stanowiska:<br />mikrokontrolery ATmega32 (w układzie 1 Master wiele Slave) <br />Sprzętowe SPI<br />Dane dla zaoszczędzenia wysyłanych bajtów wysyłane będą w postaci szesnastkowej (uint8_t w postaci dziesiętnej potrzebuje do 3 bajtów, w postaci hex do dwóch bajtów analogicznie uint16_t 5 bajtów w dec, a 4 w hex). Jest to mój pomysł na to jak &quot;zmniejszyć&quot; troszkę wysyłane zmienne, jeżeli sposób ten jest nieoptymalny/ niepotrzebny nie będę się go trzymał <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br />Ramka danych tworzona jest przy pomocy funckji <em>sprintf</em> a oto przykładowa ramka:<br /><br />[syntax=c]char str&#91;25&#93;; // ramka danych<br />// przykładowe zmienne<br />uint8_t zmienna1;<br />uint8_t zmienna2;<br />uint16_t wartosc1;<br />uint16_t wartosc2;<br />uint16_t wartosc3;<br />uint8_t parametr1;<br />uint8_t parametr2;<br />char znak1;<br />char znak2;<br /><br />// &quot;|&quot; jako separator kolejnych zmiennych<br />sprintf(str,&quot;%X|%X|%X|%X|%X|%X|%X|%s|%s&quot;,zmienna1,zmienna2,wartosc1,wartosc2,wartosc3,parametr1,parametr2,znak1,znak2);[/syntax]<br />Następnie wysyłamy ramkę &quot;<em>str</em>&quot; i gotowe ... po stronie nadawcy, ale problem pojawił się po stronie odbiorcy <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br />Oczywiście w <span style="color: #0040FF">BlueBook</span>-u w Rozdziale z UDP jest super wyjaśnione jak sobie poradzić z podziałem ramki.<br />Pozwala na to (w przykładzie z książki) funkcja np. <em>prase_set_led();</em> której działanie opiera się na funkcji <em>strtok_r()</em><br />Jednak problem mam z przejścia z np.  ciągu znaków <strong>A4C1 </strong> uzyskanych przy pomocy <em>strtok_r()</em> na wartość uint16_t = <strong>42177 </strong><br />Jakiego narzędzia/ funkcji użyć ? Gdzie szukać odpowiedzi ? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jeżeli ktoś ogólnie ma inny lepszy sposób na transmisję danych po SPI proszę o pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />i z góry dziękuję za wszelkie uwagi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><br /><strong><span style="color: #BF0000">ROZWIĄZANIE:</span></strong><br /><br />[syntax=c]// SPI.h<br />typedef struct{<br />uint8_t zmienna1;<br />uint8_t zmienna2;<br />uint16_t wartosc1;<br />uint16_t wartosc2;<br />uint16_t wartosc3;<br />uint8_t parametr1;<br />uint8_t parametr2;<br />char znak1;<br />char znak2;<br />}t_RAMKA;<br />typedef union{<br />uint8_t idx&#91;25&#93;;<br />t_RAMKA ramka;<br />}t_UNIARAMKA;<br /><br />void SPI_byte_send(uint8_t u8Data);<br />uint8_t SPI_byte_transmission(uint8_t u8Data);<br />void SPI_transmission(uint8_t *data_send,uint8_t *data_receiv,uint8_t bajts);<br /><br />#ifndef SPI_SLAVE<br />void SPI_Master_init(void);<br />#else<br />void SPI_Slave_init(void);<br />#endif[/syntax]<br /><br />[syntax=c]SPI.c<br />#include &quot;spi.h&quot;<br /><br />//-------------------------------------------------------------------------------------------------<br />//Transmisja danych dla trybu pracy Master<br />//-------------------------------------------------------------------------------------------------<br />void SPI_byte_send(uint8_t u8Data)<br />{<br />//Rozpoczęcie transmisji<br />SPDR = u8Data;<br />//Oczekiwanie na zakończenie transmisji<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br />}<br />//-------------------------------------------------------------------------------------------------<br /><br />uint8_t SPI_byte_transmission(uint8_t u8Data){<br />SPI_byte_send(u8Data);<br />return SPDR;<br />}<br /><br />void SPI_transmission(uint8_t *data_send,uint8_t *date_receiv,uint8_t bajts){<br />static uint8_t i;<br />bajts--;<br />for (i=0;i&lt;=bajts;i++)<br />{<br />*date_receiv=SPI_byte_transmission(*data_send);<br />data_send++;<br />date_receiv++;<br />}<br />}<br /><br />#ifndef SPI_SLAVE<br /><br />//-------------------------------------------------------------------------------------------------<br />//Inicjalizacja interfejsu SPI dla trybu pracy Master<br />//-------------------------------------------------------------------------------------------------<br />void SPI_Master_init(void)<br />{<br />//Ustawienie MOSI i SCK jako wyjścia,a resztę jako wejścia<br />DDR_SPI |= (1&lt;&lt;DD_MOSI)|(1&lt;&lt;DD_SCK|(1&lt;&lt;DD_SS));<br />DDR_SPI &amp;= ~(1&lt;&lt;DD_MISO);<br />//Aktywuj SPI w trybie Master, ustaw zegar fck/64<br />SPCR = (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR0);<br />PORTB |= (1&lt;&lt;PB4);<br />PORTB &amp;= ~(1&lt;&lt;PB6);<br />//char *wsk=SPI_Send;<br />//wsk=&quot;40123456789&quot;;<br /><br />}<br />//-------------------------------------------------------------------------------------------------<br /><br />#else<br /><br />//-------------------------------------------------------------------------------------------------<br />//Inicjalizacja interfejsu SPI dla trybu pracy Slave<br />//-------------------------------------------------------------------------------------------------<br />void SPI_Slave_init(void)<br />{<br />//Ustaw MISO jako wyjście,a resztę jako wejścia<br />DDR_SPI = (1&lt;&lt;DD_MISO);<br />//Aktywuj SPI<br />SPCR = (1&lt;&lt;SPE);<br />}<br />//-------------------------------------------------------------------------------------------------<br /><br />#endif[/syntax]<br /><br />[syntax=c]//main.c<br /><br />#include &quot;SPI.h&quot;<br /><br />int main(void)<br />{<br />t_UNIARAMKA uniaramka;<br />t_UNIARAMKA uniaramka2;<br />uniaramka.ramka.zmienna1=1;<br />uniaramka.ramka.zmienna2=2;<br />uniaramka.ramka.wartosc1=300;<br />uniaramka.ramka.wartosc2=1000;<br />uniaramka.ramka.wartosc3=15000;<br />uniaramka.ramka.parametr1=6;<br />uniaramka.ramka.parametr2=7;<br />uniaramka.ramka.znak1=13;<br />uniaramka.ramka.znak2=14;<br /><br />while(1){<br />PORTB &amp;=~(1&lt;&lt;DD_SS);<br />SPI_transmission(uniaramka.idx,uniaramka2.idx,12);<br />PORTB |=(1&lt;&lt;DD_SS);<br />}<br />}[/syntax]<br /><br />A oto otrzymany rezultat:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/5491/b85a6ebab09a33381567838723a3c8d3.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5491/b85a6ebab09a33381567838723a3c8d3.jpg" alt="Obrazek" /></a><br />x<br /><a href="http://forum.atnel.pl/_obrazki/o/5491/06e16ffe6911fa639953a9f147dcfacf.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5491/06e16ffe6911fa639953a9f147dcfacf.jpg" alt="Obrazek" /></a><br /><br />Przebiegi otrzymałem przy pomocy analizatora stanów logicznych <em>Saleae logic</em> , który polecam początkującym takim jak ja, aby na własne oczy zobaczyć &quot;co w trawie piszczy&quot; (oczywiście zdaję sobie sprawę, że to nie oscyloskop i należy o tym pamiętać).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5491">Unter</a> — 17 sie 2014, o 19:06</p><hr />
]]></content>
</entry>
</feed>