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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=21210&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-09-03T18:27:34+01:00</updated>
<published>2018-09-03T18:27:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211303#p211303</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211303#p211303"/>
<title type="html"><![CDATA[Re: ATMEGA 32 SPI odczyt danych z zewnętrznego flesha 2MB]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211303#p211303"><![CDATA[
Wszystko napisałem w poprzednim poście. Twój kod nadal nie realizuje prawidłowo algorytmu, który opisałem. Jestem przekonany, że kiedy to dokładnie przeczytasz, zrozumiesz i zastosujesz w swoim kodzie, to wszystko będzie działać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 3 wrz 2018, o 18:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marcin-9999]]></name></author>
<updated>2018-09-03T18:02:28+01:00</updated>
<published>2018-09-03T18:02:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211302#p211302</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211302#p211302"/>
<title type="html"><![CDATA[Re: ATMEGA 32 SPI odczyt danych z zewnętrznego flesha 2MB]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211302#p211302"><![CDATA[
dzięki za zainteresowanie, przy takiej konfiguracji:<br /><br />[syntax=c]#define PIN (1&lt;&lt;PD6)<br />#define OFF PORTD &amp;= ~PIN//ss<br />#define ON PORTD |= PIN<br /><br /><br />uint32_t a;<br /><br />void Inicjacja_spi()<br />{<br />DDRB = ( 1 &lt;&lt; PB7 ) | ( 1 &lt;&lt; PB5 ) |( 1 &lt;&lt; PB6 ) | ( 1 &lt;&lt; PB4 );<br />SPCR = ( 1 &lt;&lt; SPE ) | ( 1 &lt;&lt; MSTR ) /*| ( 1 &lt;&lt; SPR1 )*/ | ( 1 &lt;&lt; SPR0 );<br />}<br /><br />void Wyslij_spi(uint8_t bajt1, uint8_t bajt2, uint8_t bajt3, uint8_t bajt4, uint8_t bajt5, uint8_t bajt6)<br />{<br />OFF;<br />SPDR = bajt1;<br />while( ! bit_is_set( SPSR, SPIF ) );<br /><br />SPDR = bajt2;<br />while( ! bit_is_set( SPSR, SPIF ) );<br /><br />SPDR = bajt3;<br />while( ! bit_is_set( SPSR, SPIF ) );<br /><br />SPDR = bajt4;<br />while( ! bit_is_set( SPSR, SPIF ) );<br /><br /><br />SPDR = bajt5;<br />while( ! bit_is_set( SPSR, SPIF ) );<br /><br />SPDR = bajt6;<br />while( ! bit_is_set( SPSR, SPIF ) );<br />ON;<br />}<br /><br /><br />int main(void)<br />{<br />USART_Init( __UBRR );// inicjalizacja UART<br />sei();<br /><br /><br />DDRD |= PIN;//ss<br />PORTD |= PIN;<br /><br /><br /><br />Inicjacja_spi();<br />ON;//ss high<br /><br />while(1)<br />{<br /><br />//DDRB = 255; //ustawiamy port B jako wyjście<br /><br /><br />Wyslij_spi(0x3, 0x00, 0x00, 0x00,0x00,0x00);[/syntax]<br />dostaje zwrot z wartości komórki 000001 pamięci chociaz wpisana jest 000000. <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> <br />to ile dodatkowych bitów muszę wysłać z byle czym aby otrzymać wartość komórki 000000, jak wysyłam dwa to mam wartość drugiej komórki a jak jeden to wartość z kosmosu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10910">marcin-9999</a> — 3 wrz 2018, o 18:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-09-03T16:22:37+01:00</updated>
<published>2018-09-03T16:22:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211300#p211300</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211300#p211300"/>
<title type="html"><![CDATA[Re: ATMEGA 32 SPI odczyt danych z zewnętrznego flesha 2MB]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211300#p211300"><![CDATA[
Pierwszy problem w Twoim kodzie to brak obsługi pinu SS. Podczas inicjalizacji SPI powinieneś ustawić te pin jako wyjście (to masz dobrze) i ustawić je w stan wysoki (czego nie robisz). Ponadto pin ten przed rozpoczęciem transmisji powinien być ustawiony w stan niski (czego nie robisz), a po jej zakończeniu z powrotem w stan wysoki (czego też nie robisz).<br /><br />Drugi problem jest taki, że chyba nie bardzo rozumiesz zasadę działania SPI. Najpierw należy wysłać komendę (tu jest OK, wysyłasz 1 bajt o wartości 0x0B) i adres (w przypadku komendy 0x0B wymagane są <strong>4</strong> bajty, Ty wysyłasz <strong>3</strong>). Później jednak, aby cokolwiek odebrać musisz utrzymać taktowanie na linii SCK. By to zrealizować, musisz wpisać cokolwiek do rejestru SPDR, wtedy mikrokontroler utrzyma taktowanie i Twoje dane zostaną &quot;wysunięte&quot; do układu slave (w tym przypadku do pamięci - zostaną przez nią zignorowane), a do mikrokontrolera zostanie &quot;wsunięty&quot; odczytany z pamięci bajt danych.<br /><br />Reasumując algorytm jest taki:<br /><ol style="list-style-type: decimal"><li>ustawiasz pin SS w stan niski,</li><li>wpisujesz do SPDR komendę 0x0B i czekasz na zakończenie transmisji,</li><li>wpisujesz do SPDR po kolei cztery bajty adresu zaczynając od najbardziej znaczącego (z czego pierwsze 3 są adresem, ostatni bajt może być dowolny - zostanie zignorowany) za każdym razem czekając na zakończenie transmisji,</li><li>wpisujesz do SPDR dowolny bajt danych i czekasz na zakończenie transmisji,</li><li>odczytujesz z SPDR odebrany bajt danych,</li><li>powtarzasz punkty 4 i 5 tyle razy, ile bajtów chcesz odebrać,</li><li>po odebraniu potrzebnej ilości danych ustawiasz pin SS w stan wysoki.</li></ol><br />Komendy odczytu <strong>0x0B</strong> należy używać dopiero przy prędkościach transmisji powyżej 50MHz, co i tak jest w 8-bitowych AVR nieosiągalne, więc możesz spokojnie użyć komendy <strong>0x03</strong>. Wtedy wystarczy wysłać tylko <strong>3</strong> bajty adresu, co skróci czas potrzebny na odczyt (szczególnie w przypadku odczytu pojedynczych bajtów).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 3 wrz 2018, o 16:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marcin-9999]]></name></author>
<updated>2018-09-01T20:32:45+01:00</updated>
<published>2018-09-01T20:32:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211227#p211227</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211227#p211227"/>
<title type="html"><![CDATA[ATMEGA 32 SPI odczyt danych z zewnętrznego flesha 2MB]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21210&amp;p=211227#p211227"><![CDATA[
Witam według noty katalogowej mojej pamięci AT25SF161:<br /><a href="https://www.adestotech.com/wp-content/uploads/DS-AT25SF161_046.pdf"  class="postlink">https://www.adestotech.com/wp-content/uploads/DS-AT25SF161_046.pdf</a><br />powinienem najpierw wysłać 0xB a następnie adres komórki pamięci w 24bajtach np 12E631 aby uzyskać jej wartość??<br />nie do końca mi to wychodzi  <img src="https://forum.atnel.pl/images/smilies/icon_evil.gif" alt=":evil:" title="Zły" /> nie wiem jak to dokładnie wysłać by otrzymać odpowiedź<br /><br />mój kod w c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;MKUART/mkuart.h&quot;<br /><br /><br />//#define   MOSI   PB5<br />//#define   SCK      PB7<br />//#define    SS           PB4<br />//#define    MISO   PB6<br /><br />uint32_t a;<br /><br />void Inicjacja_spi()<br />{<br />DDRB = ( 1 &lt;&lt; PB7 ) | ( 1 &lt;&lt; PB5 ) | ( 1 &lt;&lt; PB4 );<br />SPCR = ( 1 &lt;&lt; SPE ) | ( 1 &lt;&lt; MSTR ) | ( 1 &lt;&lt; SPR1 ) | ( 1 &lt;&lt; SPR0 );<br />}<br /><br />void Wyslij_spi(uint8_t bajt1, uint8_t bajt2, uint8_t bajt3, uint8_t bajt4 )<br />{<br /><br />SPDR = bajt1;<br />while( ! bit_is_set( SPSR, SPIF ) );<br /><br />SPDR = bajt2;<br />while( ! bit_is_set( SPSR, SPIF ) );<br /><br />SPDR = bajt3;<br />while( ! bit_is_set( SPSR, SPIF ) );<br /><br />SPDR = bajt4;<br />while( ! bit_is_set( SPSR, SPIF ) );<br /><br />}<br /><br />int8_t Odbieraj_spi()<br />{                            //Czekamy na koniec transmisji danych<br />while ( ! bit_is_set( SPSR, SPIF ) );        // ( aż do ustawienie flagi SPIF    )<br />return SPDR;                    //Zwracamy to co dostaliśmy do SPDR<br />}<br /><br /><br /><br /><br /><br />int main(void)<br />{<br />USART_Init( __UBRR );// inicjalizacja UART<br />sei();<br />DDRB = 255; //ustawiamy port B jako wyjście<br />PORTB = 0b11101111; // ustawienie stanu niskiego na porcie B<br /><br /><br />//int8_t bajt = 11;<br />Inicjacja_spi();<br /><br /><br />while(1)<br />{<br /><br />DDRB = 255; //ustawiamy port B jako wyjście<br />PORTB = 0b11101111; // ustawienie stanu niskiego na porcie B<br /><br />Wyslij_spi(0xB, 0x00, 0x00, 0x00);<br />//Wyslij_spi(0x000005);<br /><br /><br /><br />Odbieraj_spi();<br />//DDRD = 255;<br />//PORTD = 0;<br />//DDRB = 255; //ustawiamy port B jako wyjście<br />PORTB = 0b11111111; // ustawienie stanu niskiego na porcie B<br /><br /><br />a=Odbieraj_spi();<br /><br />//a=;<br />uart_putint(a, 10);<br />uart_putc('\r');<br />_delay_ms(100);<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10910">marcin-9999</a> — 1 wrz 2018, o 20:32</p><hr />
]]></content>
</entry>
</feed>