<?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=8829&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-10-16T15:37:24+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=8829&amp;mode</id>
<entry>
<author><name><![CDATA[kiel]]></name></author>
<updated>2014-10-16T15:37:24+01:00</updated>
<published>2014-10-16T15:37:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8829&amp;p=99306#p99306</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8829&amp;p=99306#p99306"/>
<title type="html"><![CDATA[Re: [ATXmega] Powolne SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8829&amp;p=99306#p99306"><![CDATA[
<div class="quotetitle">Federerer napisał(a):</div><div class="quotecontent"><br />nie wyłączasz przerwania od SPI i co bajt sprawdzasz warunek<br /></div><br />Tak, ponieważ w pierwszej wersji robiłem tak jak proponujesz i moment włączenia SPI powodował zakłócenia - zgubienie lub przekłamanie na pierwszym znaku po zakończeniu transferu DMA.<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Tak z ciekawości, ten xor jest do sprawdzania poprawności transmisji?<br /></div><br />Tak właściwie to chciałem podzielić transmisję na dwa etapy - pierwszy &quot;sterujący&quot; w którym ustalane są parametry transmisji - ten obsługuję przerwaniem, a drugi to dane - ten obsługuję DMA. CRC dla transferu DMA liczy się &quot;w locie&quot;, do sprawdzania poprawności pierwszego planowałem użyć XOR.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Widzę, że kolega pisze coś do dcc <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Gdzie tam się używa SPI do transmisji sygnałów?<br /></div><br />Tak, to będzie centralka DCC. I masz rację, w DCC nie używa się SPI <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Ale jakoś te dane, trzeba do niej dostarczyć.<br /><br />Aktualnie porzuciłem ten pomysł i eksperymentuję z innym. Plan jest taki, żeby w całości do transmisji użyć DMA i przesyłać całe &quot;bloki pamięci&quot;. Problem polega na tym, że taki blok stanowi niepodzielną jednostkę dla programu. Trochę się obawiam, co się stanie jeśli w trakcie transmisji &quot;zgubię&quot; bajt lub dwa. DMA czeka na ściśle określoną ilość bajtów i może to doprowadzić do sytuacji że bloki przesuną się względem siebie. Próbuję teraz określić czy mógłbym poprzez sprawdzanie zmian pinu SS określić czy transmisja nie zakończyła się wcześniej niż się tego spodziewa DMA. <br />Czy ktoś z was może wie, czy linuksowy driver SPI może podzielić transmisję SPI na mniejsze elementy ? <br />Czy na przykład wysyłając 100 bajtów zostaną one dostarczone jako całość w trakcie jednej zmiany SS ? Czy też możliwa jest sytuacja, że zostaną podzielone np na dwa bloki po 50 bajtów i przesłane w dwóch zmianach SS.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5390">kiel</a> — 16 paź 2014, o 15:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Federerer]]></name></author>
<updated>2014-10-15T17:14:11+01:00</updated>
<published>2014-10-15T17:14:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8829&amp;p=99163#p99163</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8829&amp;p=99163#p99163"/>
<title type="html"><![CDATA[Re: [ATXmega] Powolne SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8829&amp;p=99163#p99163"><![CDATA[
Tak patrzę i używasz do odbioru danych DMA, ale nie wyłączasz przerwania od SPI i co bajt sprawdzasz warunek:<br />[syntax=c]case 3:<br />if (--count&gt;0) return;[/syntax]<br />Można wyłączyć przerwanie od SPI i w przerwaniu od zakończenia transferu od DMA załączyć je ponownie i sobie sprawdzać crc czy co tam dalej robisz.<br />[syntax=c]if (d != (count ^ 120))<br />                        {<br />                                state = 0;<br />                        }[/syntax]<br />Tak z ciekawości, ten xor jest do sprawdzania poprawności transmisji? Widzę, że kolega pisze coś do dcc <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Gdzie tam się używa SPI do transmisji sygnałów?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4440">Federerer</a> — 15 paź 2014, o 17:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kiel]]></name></author>
<updated>2014-10-15T08:39:19+01:00</updated>
<published>2014-10-15T08:39:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8829&amp;p=99065#p99065</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8829&amp;p=99065#p99065"/>
<title type="html"><![CDATA[[ATXmega] Powolne SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8829&amp;p=99065#p99065"><![CDATA[
Cześć !<br />Wczoraj siedziałem nad optymalizacją funkcji przerwania SPI i maksimum co mi się udało wycisnąć to poprawna transmisja przy zegarze ustawionym na 500kHz. Powyżej tej prędkości z niewiadomych powodów nie jestem w stanie przesłać odpowiedzi. Mikrokontroler ustawiony jako slave, zegar 32Mhz, i jak widać na załączonym obrazku za wiele to się w funkcji przerwania nie dzieje.<br /><br />[syntax=c]ISR(SPIC_INT_vect)<br />{<br />uint8_t d = SPIC_DATA;<br /><br />switch (state)<br />{<br />case 0:<br />if (d==120) state = 1;<br />break;<br />case 1:<br />count = d;<br />state = 2;<br />break;<br />case 2:<br />if (d != (count ^ 120)) <br />{<br />state = 0;<br />}<br />else <br />{<br />DMA.CH0.DESTADDR0 = (uintptr_t)&amp;(dcc_buffer&#91;nextBuffer&#93;.data);<br />DMA.CH0.DESTADDR1 = (uintptr_t)&amp;(dcc_buffer&#91;nextBuffer&#93;.data)&gt;&gt;8;<br />DMA.CH0.DESTADDR2 = 0;<br /><br />dcc_buffer&#91;nextBuffer&#93;.write_flag = 1;<br />dcc_buffer&#91;nextBuffer&#93;.size = count;<br />if (d==0)<br />{<br />DMA_CH0_TRFCNT = 256;<br />DMA_CH1_TRFCNT = 256;<br />}<br />else<br />{<br />DMA_CH0_TRFCNT = (uint16_t)count;<br />DMA_CH1_TRFCNT = (uint16_t)count;<br />}<br />DMA_CH0_CTRLA |= DMA_CH_ENABLE_bm;<br />DMA_CH1_CTRLA |= DMA_CH_ENABLE_bm;<br /><br />state = 3;<br />}<br />break;<br />case 3:<br />if (--count&gt;0) return;<br />SPIC_DATA = CRC_CHECKSUM0;<br />dcc_buffer&#91;nextBuffer&#93;.crc = d;<br />state = 4;<br />break;<br />case 4:<br />SPIC_DATA = CRC_CHECKSUM1;<br />dcc_buffer&#91;nextBuffer&#93;.crc += d&lt;&lt;8;<br />dcc_buffer&#91;nextBuffer&#93;.write_flag = 0;<br />if (dcc_buffer&#91;nextBuffer&#93;.crc == CRC_CHECKSUM0+(CRC_CHECKSUM1&lt;&lt;8))<br />nextBuffer = (nextBuffer+1) % 3;<br />CRC_CTRL = CRC_RESET_RESET0_gc;<br />CRC_CTRL = CRC_SOURCE_DMAC1_gc;<br />state = 0;<br />break;<br />}<br />}[/syntax]<br />Gdybym chciał przyspieszyć to tylko asembler, czy jestem już ślepy i przeoczyłem jakąś oczywistość ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5390">kiel</a> — 15 paź 2014, o 08:39</p><hr />
]]></content>
</entry>
</feed>