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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-06-30T17:42:38+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=15667&amp;mode</id>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2016-06-30T17:42:38+01:00</updated>
<published>2016-06-30T17:42:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163157#p163157</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163157#p163157"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163157#p163157"><![CDATA[
Dodanie opóźnienia pomogło <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Dzięki wielkie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 30 cze 2016, o 17:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-06-30T17:40:03+01:00</updated>
<published>2016-06-30T17:40:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163155#p163155</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163155#p163155"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163155#p163155"><![CDATA[
<div class="quotetitle">xamrex napisał(a):</div><div class="quotecontent"><br />[syntax=c]...<br />            WriteMemory(3);<br />            lcd_locate(1,0);<br />            zmienna2=ReadMemory();<br />...[/syntax]Spodziewałem się ujrzeć 3 na wyświetlaczu, ale zamiast tego wyświetla się 255.<br /></div><br />Write time = 4ms.<br />Podejrzewam, że Twoja funkcja <em>lcd_locate(1,0);</em> nie wykonuje się tak długo.<br />Daj jakieś opóźnienie przed odczytem lub czytaj bajt statusowy i czekaj na wyzerowanie bitu WIP.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 30 cze 2016, o 17:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2016-06-30T17:17:59+01:00</updated>
<published>2016-06-30T17:17:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163152#p163152</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163152#p163152"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163152#p163152"><![CDATA[
<div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />xamrex napisał(a):<br />Wyświetla 0 na wyświetlaczu ;-(<br />Co nie oznacza, że jest to wartość niepoprawna.<br /></div><br />Masz rację,<br />Wartość ta jest jak najbardziej prawidłowa <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Zrobiłem sobie małą funkcję WE, która wysyła instrukcję WriteEnable.<br /><br /><br />[syntax=c]void WE (void){<br />  PORTB &amp;= ~(1&lt;&lt;CS);<br />  SPDR = 6; //instrukcja<br />  while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />  PORTB |= (1&lt;&lt;CS);<br />  }[/syntax]<br /><br />Funkcja ta, powoje również ustalenie się bitu1 (WEL) w rejestrze Status Register.<br />Teraz po odcztaniu wartości rejestru Status Register otrzymuję na wyświetlaczu wartość 2 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Czyli wszystko ok<br />[syntax=c]#include &lt;avr/io.h&gt;<br />    #include &quot;LCD/lcd44780.h&quot;<br />    #include &quot;util/delay.h&quot;<br /><br />    #define RDSR 0x05 // komenda odczytania statusu<br />    /* hardware SPI */<br />    #define MOSI PB5        //   &lt;---- A (SER IN)<br />    #define SCK PB7         //   &lt;---- SHIFT CLOCK (SC)<br />    #define CS PB4          //       &lt;---- LATCH CLOCK (LC)<br />    uint8_t ReadStatus( uint8_t bajt  ) ;<br />    uint8_t ReadMemory( void );<br />    void WriteMemory(uint8_t bajt);<br />    void WE (void);<br />    void InitSpi(void);<br /><br />    int main(void){<br /><br />    uint8_t zmienna1;<br />    uint8_t zmienna2;<br /><br />            lcd_init();<br />            InitSpi();<br /><br />            lcd_locate(0,0);<br />            lcd_str(&quot;Read status&quot;);<br /><br />            WE();<br /><br />            zmienna1=ReadStatus(5); <br />            lcd_int(zmienna1);<br /><br /><br />            while(1);<br /><br /><br /><br />    }<br /><br /><br />    void InitSpi(void) {<br />            /* ustawienie kierunku wyjściowego dla linii MOSI, SCK i CS */<br />            DDRB |= (1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />            /* aktywacja  SPI, tryb pracy Master, prędkość zegara Fosc/64 */<br />            SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1);<br />        PORTB |= (1&lt;&lt;CS); //usatwiamy na 1.<br /><br />    }<br /><br /><br />    uint8_t ReadStatus( uint8_t bajt ) {<br />            /* chip select */<br />            PORTB &amp;= ~(1&lt;&lt;CS);<br />            /* wysyłamy bajt do układu Slave */<br />            SPDR = bajt;<br />            /* czekamy aż zostanie wysłany ostatni bit */<br />            while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />            /* wysyłamy pusty bajt w celu odebrania bajtu statusowego */<br />            SPDR = 0;<br />            /* czekamy aż zostanie odebrany ostatni bit */<br />            while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />            /* deselect chip */<br />            PORTB |= (1&lt;&lt;CS);<br /><br />            return SPDR;<br />    }<br /><br />   <br />  void WriteMemory(uint8_t bajt){<br />     /* chip select */<br />    /* chip select */<br />                PORTB &amp;= ~(1&lt;&lt;CS);<br />                /* wysyłamy bajt do układu Slave */<br />                SPDR = 2; //instrukcja<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                SPDR = 0; //adres 01<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />                SPDR = 1;<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                SPDR = bajt; //zawartosc<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br /><br />                /* deselect chip */<br />                PORTB |= (1&lt;&lt;CS);<br /><br /><br />    }<br /><br /><br />  void WE (void){<br />  PORTB &amp;= ~(1&lt;&lt;CS);<br />  SPDR = 6; //instrukcja<br />  while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />  PORTB |= (1&lt;&lt;CS);<br />  }[/syntax]<br /><br />Teraz chciałbym w końcu zapisać coś do pamięcii EEPROM.<br />Stworzyłem sobie taką funkcję:<br />[syntax=c]void WriteMemory(uint8_t bajt){<br /><br />                PORTB &amp;= ~(1&lt;&lt;CS);<br />                /* wysyłamy bajt do układu Slave */<br />                SPDR = 2; //instrukcja<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                SPDR = 0; //adres 01<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />                SPDR = 1;<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                SPDR = bajt; //zawartosc<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                /* deselect chip */<br />                PORTB |= (1&lt;&lt;CS);<br />}[/syntax]<br />i podobną do odbioru, i chciałbym zobaczyć na wyświetlaczu wartość którą zapisałem do pamięci eeprom<br />#################################################################################<br />Tutaj cały mój kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />    #include &quot;LCD/lcd44780.h&quot;<br />    #include &quot;util/delay.h&quot;<br /><br />    #define RDSR 0x05 // komenda odczytania statusu<br />    /* hardware SPI */<br />    #define MOSI PB5        //   &lt;---- A (SER IN)<br />    #define SCK PB7         //   &lt;---- SHIFT CLOCK (SC)<br />    #define CS PB4          //       &lt;---- LATCH CLOCK (LC)<br />    uint8_t ReadStatus( uint8_t bajt  ) ;<br />    uint8_t ReadMemory( void );<br />    void WriteMemory(uint8_t bajt);<br />    void WE (void);<br />    void InitSpi(void);<br /><br />    int main(void){<br /><br />    uint8_t zmienna1;<br />    uint8_t zmienna2;<br /><br />            lcd_init();<br />            InitSpi();<br /><br />            lcd_locate(0,0);<br />            lcd_str(&quot;Read status&quot;);<br /><br />            WE();<br />            zmienna1=ReadStatus(5);//tutaj ładnie wyświetla '2'<br />            lcd_int(zmienna1);<br /><br />            WriteMemory(3);<br /><br />            lcd_locate(1,0);<br />            zmienna2=ReadMemory();<br />            lcd_int(zmienna2);//tutaj nieładnie wyświetla 255 zamiast 3<br /><br />            while(1);<br /><br /><br /><br />    }<br /><br /><br />    void InitSpi(void) {<br />            /* ustawienie kierunku wyjściowego dla linii MOSI, SCK i CS */<br />            DDRB |= (1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />            /* aktywacja  SPI, tryb pracy Master, prędkość zegara Fosc/64 */<br />            SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1);<br />        PORTB |= (1&lt;&lt;CS); //usatwiamy na 1.<br /><br />    }<br /><br /><br />    uint8_t ReadStatus( uint8_t bajt ) {<br />            /* chip select */<br />            PORTB &amp;= ~(1&lt;&lt;CS);<br />            /* wysyłamy bajt do układu Slave */<br />            SPDR = bajt;<br />            /* czekamy aż zostanie wysłany ostatni bit */<br />            while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />            /* wysyłamy pusty bajt w celu odebrania bajtu statusowego */<br />            SPDR = 0;<br />            /* czekamy aż zostanie odebrany ostatni bit */<br />            while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />            /* deselect chip */<br />            PORTB |= (1&lt;&lt;CS);<br /><br />            return SPDR;<br />    }<br /><br /><br />  void WriteMemory(uint8_t bajt){<br /><br />                PORTB &amp;= ~(1&lt;&lt;CS);<br />                /* wysyłamy bajt do układu Slave */<br />                SPDR = 2; //instrukcja<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                SPDR = 0; //adres 01<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />                SPDR = 1;<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                SPDR = bajt; //zawartosc<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                /* deselect chip */<br />                PORTB |= (1&lt;&lt;CS);<br />}<br />  uint8_t ReadMemory( void ){<br />          PORTB &amp;= ~(1&lt;&lt;CS);<br />                /* wysyłamy bajt do układu Slave */<br />                SPDR = 3; //instrukcja<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                SPDR = 0; //adres 01<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />                SPDR = 1;<br />                while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />                /* wysyłamy pusty bajt w celu odebrania bajtu statusowego */<br />                 SPDR = 0;<br />                /* czekamy aż zostanie odebrany ostatni bit */<br />                 while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />                 /* deselect chip */<br />                 PORTB |= (1&lt;&lt;CS);<br />                        return SPDR;<br /><br /><br />  }<br /><br /><br />  void WE (void){<br />  PORTB &amp;= ~(1&lt;&lt;CS);<br />  SPDR = 6; //instrukcja<br />  while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />  PORTB |= (1&lt;&lt;CS);<br />  }[/syntax]<br />Spodziewałem się ujrzeć<strong> 3 </strong>na wyświetlaczu, ale zamiast tego wyświetla się 255.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 30 cze 2016, o 17:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-06-29T16:27:01+01:00</updated>
<published>2016-06-29T16:27:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163098#p163098</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163098#p163098"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163098#p163098"><![CDATA[
Instrukcję <strong><em>PORTB |= (1&lt;&lt;CS);</em></strong> daj na początku funkcji <strong><em>InitSpi()</em></strong>, nie na końcu, bo tak jak teraz to masz niepotrzebnie krótki impuls na linii CS.<br /><br />Czy dałeś rezystor pull-up na linii CS, tak jak dopisałem na końcu mojego poprzedniego posta?<br /><br /><div class="quotetitle">xamrex napisał(a):</div><div class="quotecontent"><br />Wyświetla 0 na wyświetlaczu ;-(<br /></div>Co nie oznacza, że jest to wartość niepoprawna.<br />Bity WEL i WIP są zerowane po włączeniu zasilania, natomiast bity SRWD, BP1 i BP0 są fabrycznie ustawione na 0.<br />Poczytaj może wreszcie trochę tę dokumentację <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />PS. Drugi kod jest nieprawidłowy. Po wysłaniu komendy odczytu rejestru statusowego MUSISZ wysłać dodatkowy bajt, aby wartość tego rejestru znalazła się w SPDR.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 29 cze 2016, o 16:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2016-06-29T15:52:36+01:00</updated>
<published>2016-06-29T15:52:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163094#p163094</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163094#p163094"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163094#p163094"><![CDATA[
taki kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;util/delay.h&quot;<br /><br />#define RDSR 0x05 // komenda odczytania statusu<br />/* hardware SPI */<br />#define MOSI PB5//   &lt;---- A (SER IN)<br />#define SCK PB7//   &lt;---- SHIFT CLOCK (SC)<br />#define CS PB4// &lt;---- LATCH CLOCK (LC)<br />uint8_t ReadStatus( void ) ;<br />void InitSpi(void);<br /><br />int main(void){<br /><br />uint8_t zmienna1;<br /><br />lcd_init();<br />InitSpi();<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;Read status&quot;);<br /><br />lcd_locate(1,0);<br /><br />zmienna1=ReadStatus();<br />lcd_int(zmienna1);<br /><br />while(1);<br /><br /><br /><br />}<br /><br /><br />void InitSpi(void) {<br />/* ustawienie kierunku wyjściowego dla linii MOSI, SCK i CS */<br />DDRB |= (1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />/* aktywacja  SPI, tryb pracy Master, prędkość zegara Fosc/64 */<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1);<br />    PORTB |= (1&lt;&lt;CS); //usatwiamy na 1.<br /><br />}<br /><br /><br />uint8_t ReadStatus( void ) {<br />        /* chip select */<br />        PORTB &amp;= ~(1&lt;&lt;CS);<br />        /* wysyłamy bajt do układu Slave */<br />        SPDR = RDSR;<br />        /* czekamy aż zostanie wysłany ostatni bit */<br />        while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />        /* wysyłamy pusty bajt w celu odebrania bajtu statusowego */<br />        SPDR = 0;<br />        /* czekamy aż zostanie odebrany ostatni bit */<br />        while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />        /* deselect chip */<br />        PORTB |= (1&lt;&lt;CS);<br /><br />        return SPDR;<br />}[/syntax]<br /><br />Wyświetla 0 na wyświetlaczu ;-(<br /><br />Nastomiast taki kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;util/delay.h&quot;<br /><br /><br />/* hardware SPI */<br />#define MOSI PB5//   &lt;---- A (SER IN)<br />#define SCK PB7//   &lt;---- SHIFT CLOCK (SC)<br />#define CS PB4// &lt;---- LATCH CLOCK (LC)<br />uint8_t TransferSPI( uint8_t bajt ) ;<br />void InitSpi(void);<br /><br />int main(void){<br />uint8_t zmienna1=222; //przykladowa zawartosc<br />uint8_t zmienna2=223; //przykladowa zawartosc<br />uint8_t zmienna3=224; //przykladowa zawartosc<br /><br /><br />lcd_init();<br />InitSpi();<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;Read status&quot;);<br /><br />zmienna1=TransferSPI(5); //<br />zmienna2=TransferSPI(0);//odczyt<br />zmienna3=TransferSPI(0);//odczyt<br /><br /><br />lcd_locate(1,0);<br />lcd_int(zmienna1);<br /><br />lcd_locate(1,4);<br />lcd_int(zmienna2);<br /><br />lcd_locate(1,8);<br />lcd_int(zmienna3);<br /><br /><br /><br />while(1);<br /><br /><br /><br />}<br /><br /><br />void InitSpi(void) {<br />/* ustawienie kierunku wyjściowego dla linii MOSI, SCK i CS */<br />DDRB |= (1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />/* aktywacja  SPI, tryb pracy Master, prędkość zegara Fosc/64 */<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1);<br />    PORTB |= (1&lt;&lt;CS); //usatwiamy na 1.<br /><br />}<br /><br /><br /><br />uint8_t TransferSPI( uint8_t bajt ) {<br />/* chip select */<br /> PORTB &amp;= ~(1&lt;&lt;CS);<br />/* wysyłamy bajt do układu Slave */<br />SPDR = bajt;<br />/* czekamy aż zostanie wysłany ostatni bit */<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />    PORTB |= (1&lt;&lt;CS);<br /><br />return SPDR;<br />}[/syntax]<br />wyświetla  255...127...255<br /><br />Niemniej jednak wartość 127 jest niepoprawna, bowiem Status Register bit 6,5i 4 powinien wynosić 0<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 29 cze 2016, o 15:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2016-06-28T07:50:17+01:00</updated>
<published>2016-06-28T07:50:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163022#p163022</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163022#p163022"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163022#p163022"><![CDATA[
ok dzięki za rady, jturo do tego siądę i dam znać jak poszło <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=74">xamrex</a> — 28 cze 2016, o 07:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-06-28T07:21:45+01:00</updated>
<published>2016-06-28T07:21:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163021#p163021</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163021#p163021"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163021#p163021"><![CDATA[
<div class="quotetitle">xamrex napisał(a):</div><div class="quotecontent"><br />        PORTB|=(1&lt;&lt;CS);<br />        _delay_ms(1);<br />        PORTB&amp;=~(1&lt;&lt;CS);<br /></div><br />To wprawdzie nie rozwiąże twojego problemu ale wywal stąd tego delay_ms(1) bo w książce pisałem, że to tylko tak dla przykładu - w ogóle w praktyce nie trzeba stosować tego delaya<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 28 cze 2016, o 07:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-06-28T05:57:00+01:00</updated>
<published>2016-06-28T05:57:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163020#p163020</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163020#p163020"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163020#p163020"><![CDATA[
<div class="quotetitle">xamrex napisał(a):</div><div class="quotecontent"><br />Zmieniłem kod na;<br /></div><br />Kod zmieniłeś, ale nie napisałeś, czy połączyłeś pin CS (PB4) mikrokontrolera z pinem S pamięci?<br /><br /><div class="quotetitle">xamrex napisał(a):</div><div class="quotecontent"><br />[syntax=c]uint8_t TransferSPI( uint8_t bajt ) {<br />        /* wysyłamy bajt do układu Slave */<br />        SPDR = bajt;<br />        /* czekamy aż zostanie wysłany ostatni bit */<br />        while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /> <br />        PORTB|=(1&lt;&lt;CS);<br />        _delay_ms(1);<br />        PORTB&amp;=~(1&lt;&lt;CS);<br /> <br />        return SPDR;<br />}[/syntax]<br /><br />Chyba robie dokładnie tak jak jest napisane<br /></div>Niestety nie robisz.<br />Przede wszystkim <strong>na początku funkcji InitSpi()</strong> należy wstępnie ustawić pin CS w stan wysoki:[syntax=c]PORTB |= (1&lt;&lt;CS);[/syntax]<br />Po drugie, masz w dokumentacji napisane, że pin CS musi przejść w stan NISKI PRZED ROZPOCZĘCIEM transmisji i powrócić do stanu WYSOKIEGO PO ZAKOŃCZENIU transmisji WSZYSTKICH DANYCH na nią się składających (takich jak komenda, adres, odczytywane lub zapisywane dane), czyli do odczytania statusu powinieneś mieć:<br />[syntax=c]#define RDSR 0x05 // komenda odczytania statusu<br /><br />uint8_t ReadStatus( ) {<br />        /* chip select */<br />        PORTB &amp;= ~(1&lt;&lt;CS);<br />        /* wysyłamy bajt do układu Slave */<br />        SPDR = RDSR;<br />        /* czekamy aż zostanie wysłany ostatni bit */<br />        while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />        /* wysyłamy pusty bajt w celu odebrania bajtu statusowego */<br />        SPDR = 0;<br />        /* czekamy aż zostanie odebrany ostatni bit */<br />        while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />        /* deselect chip */<br />        PORTB |= (1&lt;&lt;CS);<br /> <br />        return SPDR;<br />}[/syntax]<br />Nie dosyć, że zrobiłeś to w odwrotnej kolejności, to jeszcze w dodatku wcale nie w trakcie transmisji, która przecież rozpoczyna się wpisaniem bajtu do SPDR i kończy ustawieniem flagi SPIF po transmisji ostatniego odebranego/wysłanego bajtu.<br />Masz przecież w dokumentacji dokładne przebiegi i opisy, jak to powinno wyglądać. Wystarczy poświęcić trochę czasu, żeby to uważnie przeczytać, przeanalizować i zastosować <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />EDIT:<br />Proponuję zwrócić uwagę również na to:<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br /><strong>5.1.2 Power-up conditions</strong><br />When the power supply is turned on, VCC continuously rises from VSS to VCC. During this<br />time, the Chip Select (S) line is not allowed to float but should follow the VCC voltage. It is<br />therefore recommended to <strong><span style="color: #8000FF">connect the S line to VCC via a suitable pull-up resistor</span></strong> (see<br />Figure 16).<br /></div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 28 cze 2016, o 05:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2016-06-27T21:43:31+01:00</updated>
<published>2016-06-27T21:43:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163015#p163015</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163015#p163015"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163015#p163015"><![CDATA[
Zmieniłem kod na;<br />[syntax=c]uint8_t TransferSPI( uint8_t bajt ) {<br />/* wysyłamy bajt do układu Slave */<br />SPDR = bajt;<br />/* czekamy aż zostanie wysłany ostatni bit */<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />PORTB|=(1&lt;&lt;CS);<br />_delay_ms(1);<br />PORTB&amp;=~(1&lt;&lt;CS);<br /><br />return SPDR;<br />}[/syntax]<br /><br />Ale niewiele to pomogło ;-(<br /><br />Chyba robie dokładnie tak jak jest napisane:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />To execute Read commands (READ, RDSR, RDID, RDLS), the device must decode:<br />•a falling edge and a low level on Chip Select (S) during the whole command<br />•instruction and address as multiples of eight bits (byte)<br />From this step, data bits are shifted out until the rising edge on Chip Select (S)<br /></div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 27 cze 2016, o 21:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-06-27T19:31:45+01:00</updated>
<published>2016-06-27T19:31:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163005#p163005</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163005#p163005"/>
<title type="html"><![CDATA[Re: Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=163005#p163005"><![CDATA[
<div class="quotetitle">xamrex napisał(a):</div><div class="quotecontent"><br />i moje podłączenia pin scalaka i do czego podłączyłem:<br />S-&gt;GND<br />...<br />...<br /><br />[syntax=c]#define CS PB4          //       &lt;---- LATCH CLOCK (LC)[/syntax]<br /></div><br /><br />Biorąc pod uwagę fragment z dokumentacji (<strong>3.4.1 Protocol control</strong>):<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />The Chip Select (S) input offers a built-in safety feature, as the S input is edge-sensitive as<br />well as level-sensitive: <strong><span style="color: #8040FF">after power-up, the device is not selected until a falling edge has first<br />been detected on Chip Select (S).</span></strong> This ensures that Chip Select (S) <strong><span style="color: #8040FF">must have been high<br />prior to going low, in order to start the first operation.</span></strong><br /></div>to chyba jednak powinieneś połączyć:<br />S-&gt;CS(PB4)<br />i odpowiednio sterować tym pinem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 27 cze 2016, o 19:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2016-06-26T18:21:50+01:00</updated>
<published>2016-06-26T18:21:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=162974#p162974</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=162974#p162974"/>
<title type="html"><![CDATA[Pamięć eeprom M95160 - SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15667&amp;p=162974#p162974"><![CDATA[
Witam,<br />Mam problem z odczytem czegokolwiek  z pamięci M95160.<br />Tutaj pdf do niej:<br /><!-- m --><a class="postlink" href="http://www.st.com/content/ccc/resource/technical/document/datasheet/17/54/e9/f8/75/a7/40/74/DM00066376.pdf/files/DM00066376.pdf/jcr:content/translations/en.DM00066376.pdf" >http://www.st.com/content/ccc/resource/ ... 066376.pdf</a><!-- m --><br /><br />Używam ATB 1.01 i Megi32<br />i moje podłączenia pin scalaka i do czego podłączyłem:<br />S-&gt;GND<br />Q-&gt;PB6<br />W-&gt;VCC<br />HOLD-&gt;VCC<br />C-&gt;PB7<br />D-&gt;PB5<br /><br />i mój kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;util/delay.h&quot;<br /><br /><br />/* hardware SPI */<br />#define MOSI PB5//   &lt;---- A (SER IN)<br />#define SCK PB7//   &lt;---- SHIFT CLOCK (SC)<br />#define CS PB4// &lt;---- LATCH CLOCK (LC)<br />uint8_t TransferSPI( uint8_t bajt ) ;<br />void InitSpi(void);<br /><br />int main(void){<br />uint8_t zmienna1=222; //przykladowa zawartosc<br />uint8_t zmienna2=223; //przykladowa zawartosc<br />uint8_t zmienna3=224; //przykladowa zawartosc<br /><br />lcd_init();<br />InitSpi();<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;Read status&quot;);<br />zmienna1=TransferSPI(5);<br /><br /><br />zmienna2=TransferSPI(0);//odczyt<br />zmienna3=TransferSPI(0);//odczyt<br /><br />lcd_locate(1,0);<br />lcd_int(zmienna1);<br /><br />lcd_locate(1,5);<br />lcd_int(zmienna2);<br /><br />lcd_locate(1,10);<br />lcd_int(zmienna3);<br /><br /><br />while(1);<br /><br /><br />}<br /><br /><br />void InitSpi(void) {<br />/* ustawienie kierunku wyjściowego dla linii MOSI, SCK i CS */<br />DDRB |= (1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />/* aktywacja  SPI, tryb pracy Master, prędkość zegara Fosc/64 */<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1);<br />}<br /><br /><br /><br />uint8_t TransferSPI( uint8_t bajt ) {<br />/* wysyłamy bajt do układu Slave */<br />SPDR = bajt;<br />/* czekamy aż zostanie wysłany ostatni bit */<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />return SPDR;<br />}[/syntax]<br />Po wgraniu tego do Uc na wyświetlaczy otrzymuje wartości zmiennych 255, 255, 255<br />Chciałem odczytać sobie z tego scalaka na początek Status Register, niestety coś nie idzie po mojej myśli.<br />Ktoś wie w czym może tkwić problem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 26 cze 2016, o 18:21</p><hr />
]]></content>
</entry>
</feed>