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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-05-31T15:39:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=15471&amp;mode</id>
<entry>
<author><name><![CDATA[jnk0le]]></name></author>
<updated>2016-05-31T15:39:49+01:00</updated>
<published>2016-05-31T15:39:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161406#p161406</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161406#p161406"/>
<title type="html"><![CDATA[Re: Zapis do pamięci EEPROM 24C32 i odczyt w trybie page wri]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161406#p161406"><![CDATA[
Funkcja ta wczytuje ostatni bajt do buforu, jako że `while( --len )` kończy się o jedno przejście szybciej niż `while( len-- )`.<br />A jak bardzo zdefiniowane jest kończenie odczytu po wysłaniu ACK to przewidzieć nie mogę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8491">jnk0le</a> — 31 maja 2016, o 15:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirek1968]]></name></author>
<updated>2016-05-30T23:12:30+01:00</updated>
<published>2016-05-30T23:12:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161362#p161362</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161362#p161362"/>
<title type="html"><![CDATA[Re: Zapis do pamięci EEPROM 24C32 i odczyt w trybie page wri]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161362#p161362"><![CDATA[
W przypadku odczyty w trybie read page mam pytanko.<br />Jaką rolę pełni ta linijka kodu skoro na nic nie wpływa praktycznie.<br />[syntax=c]*buf = twiread_NACK(); //jak ją zakomentuję to nic się nie zmienia i nadal działa odczyt poprawnie[/syntax]<br /><br />A oto cały kod dla odczytu proszę o sprawdzenie ew. komentarz.<br />[syntax=c]// odczyt danych z pamięci EEPROM 24C32 tryb read page<br />void EI2C_page_read_buf(uint8_t device, uint16_t subAddr, uint16_t len, uint8_t *buf) {<br /><br />while (1) {<br />TWI_start();               // wysłanie sekwencji START<br />TWI_write( device );       // wysłanie bajtu adresu układu pamięci na magistrali<br />if ( (TWSR &amp; 0xF8) != 0x20) break; //Wyjdź z pętli pamięć odpowiada (ACK), czyli skończony zapis<br />TWI_stop(); // wysłanie sekwencji STOP<br />}<br />        TWI_write( subAddr&gt;&gt;8 );   // wysłanie starszego bajtu adresu komórki pamięci, spod której nastąpi odczyt<br />        TWI_write( subAddr );      // wysłanie młodszego bajtu adresu komórki pamięci, spod której nastąpi odczyt<br />        TWI_start();               // wysłanie sygnału start<br />        TWI_write( device + 1 );   // wysłanie bajtu adresu układu pamięci na magistrali z bitem R/W w stanie wysokim (odczyt)<br /><br />        while( --len ) *buf++ = TWI_read(ACK); // odebranie bajtu danych + ACK<br />        *buf = twiread_NACK();<br />        TWI_stop(); // wysłanie sekwencji STOP<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=922">mirek1968</a> — 30 maja 2016, o 23:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jnk0le]]></name></author>
<updated>2016-05-30T15:00:25+01:00</updated>
<published>2016-05-30T15:00:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161336#p161336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161336#p161336"/>
<title type="html"><![CDATA[Re: Zapis do pamięci EEPROM 24C32 i odczyt w trybie page wri]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161336#p161336"><![CDATA[
Właśnie zajrzałem do znalezionego datasheetu (jakiś obsolete Microchip 24C32) i wychodzi na to że niektóre pamięci mogą przyjąć do 64 bajtów. (podczas gdy AT24C32 pozwala tylko na 32 bajty)<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />4.3 Page Write <br />The write control byte, word address and the first data<br />byte are transmitted to the 24C32 in the same way as<br />in a byte write. But instead of generating a stop condi-<br />tion,  <strong>the  master  transmits  up  to  eight  pages  of  eight<br />data bytes each (64 bytes total)</strong> which are temporarily<br />stored in the on-chip page cache of the 24C32. They<br />will be written from cache into the EEPROM array after<br />the master has transmitted a stop condition.<br /></div><br /><br />Być może masz którąś z nich.<br /><br />A te delaye są już nie potrzebne jeśli masz pętle czekająca na zakończenie zapisu. (szczególnie że zapis może trwać 8x5ms dla wyżej wspomnianego 24c32)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8491">jnk0le</a> — 30 maja 2016, o 15:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirek1968]]></name></author>
<updated>2016-05-29T22:02:36+01:00</updated>
<published>2016-05-29T22:02:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161308#p161308</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161308#p161308"/>
<title type="html"><![CDATA[Re: Zapis do pamięci EEPROM 24C32 i odczyt w trybie page wri]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161308#p161308"><![CDATA[
Czyli tak jak zapiszę wszystkie bajty do eepromu to pamięć wystawi ack i wyjdę z pętli while ,po czym realizowany jest dalsza część programu.Wysłałem do pamięci bajt 32 i zapisało mi do drugiej strony ten bajt ale nie rozumiem w jaki sposób.<br />[syntax=c]// zapis danych do pamięci EEPROM 24C32 tryb page write<br />void EI2C_page_write_buf(uint8_t device, uint16_t subAddr, uint16_t len, uint8_t *buf) {<br /><br />while (1) {<br />TWI_start();               // wysłanie sekwencji START<br />TWI_write( device );       // wysłanie bajtu adresu układu pamięci na magistrali<br />if ( (TWSR &amp; 0xF8) != 0x20) break;<br />TWI_stop();<br />_delay_ms(5);<br />}<br /><br />TWI_write( subAddr&gt;&gt;8 );   // wysłanie starszego bajtu adresu komórki pamięci, spod której nastąpi odczyt<br />TWI_write( subAddr );      // wysłanie młodszego bajtu adresu komórki pamięci, spod której nastąpi odczyt<br />while(len--) TWI_write(*buf++); // wysłanie bajtu danych przeznaczonego do zapisu<br />TWI_stop();                // wysłanie sekwencji STOP<br />    _delay_ms(10);              // oczekiwanie na zapis<br /><br />}[/syntax]<br /><br />Wykorzystując ten kod zadziałało to ale nie rozumiem w jaki sposób następuje przejście do zapisu do drugiej strony po przekroczeniu 32 bajtu podczas zapisu (mam na myśli inkrementację po zapisie pierszej pełnej strony (0---- 31)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=922">mirek1968</a> — 29 maja 2016, o 22:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jnk0le]]></name></author>
<updated>2016-05-29T17:55:16+01:00</updated>
<published>2016-05-29T17:55:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161292#p161292</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161292#p161292"/>
<title type="html"><![CDATA[Re: Zapis do pamięci EEPROM 24C32 i odczyt w trybie page wri]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161292#p161292"><![CDATA[
TW_MT_SLA_NACK jest to po prostu makro z &lt;util/twi.h&gt; (właśnie zauważyłem że brakowało jednego includa)<br />Pętla ta się wykonuje do momentu aż pamięć zacznie odpowiadać (ACK), czyli skończy zapis.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8491">jnk0le</a> — 29 maja 2016, o 17:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirek1968]]></name></author>
<updated>2016-05-28T20:06:17+01:00</updated>
<published>2016-05-28T20:06:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161260#p161260</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161260#p161260"/>
<title type="html"><![CDATA[Re: Zapis do pamięci EEPROM 24C32 i odczyt w trybie page wri]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161260#p161260"><![CDATA[
W tym linku który mi dałeś z bibliotekami jest jakaś zmienna TW_MT_SLA_NACK co się pod nią kryje?,bo nie mogę znaleźć deklaracji.<br />[syntax=c]if ( (TWSR &amp; 0xF8) != TW_MT_SLA_NACK) break;[/syntax]<br />Wiem że tutaj sprawdzany jest warune czy ta zmienna jest różna z tym co jest po TWI wysyłane (sprawdzanie statusu) czyli jeśli status TWI jest różny od tej zmiennej to wyjdź z pętli (właśnie ale na co wskazuje ta zmienna?-bo nie jest nigdzie zdeklarowana.<br />W chwili wolnej przećwiczę te bibioteki i zobaczę czy zadziałają.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=922">mirek1968</a> — 28 maja 2016, o 20:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jnk0le]]></name></author>
<updated>2016-05-28T21:09:09+01:00</updated>
<published>2016-05-27T22:26:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161222#p161222</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161222#p161222"/>
<title type="html"><![CDATA[Re: Zapis do pamięci EEPROM 24C32 i odczyt w trybie page wri]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161222#p161222"><![CDATA[
Brakuje pętli do wysyłania bajtów (buf++, addr++ nic nie dają), a przy przeskakiwaniu stron należy rozpocząć cały cykl od nowa, więc najlepiej zorganizowac to w kodzie wywołującym.  <br />Warto też jakoś ograniczyć tą funkcję tylko do tego co chcesz wysłać,a nie że ciągnie z niezdefiniownej przestrzeni.<br /><br />A tu takie <a href="https://github.com/jnk0le/AVR-I2C-libs/blob/master/24C32.c#L113"  class="postlink">cuś</a> co ostatnio popełniłem, może się przyda  <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=8491">jnk0le</a> — 27 maja 2016, o 22:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirek1968]]></name></author>
<updated>2016-05-27T21:13:23+01:00</updated>
<published>2016-05-27T21:13:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161211#p161211</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161211#p161211"/>
<title type="html"><![CDATA[Zapis do pamięci EEPROM 24C32 i odczyt w trybie page write]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15471&amp;p=161211#p161211"><![CDATA[
Posiadam popularną pamięć eeprom 24C32 i chciałbym nauczyć się i zrozumieć sposoby zapisu i odczytu w trybie page write.<br />Zapis i odczyt pojedyńczych bajtów już znam i rozumiem ale w trybie zapisu strony mam z tym problem.<br />Powiem od razu że nie chodzi mi o jakiś gotowy kod ale o rzeczowe wytłumaczenie,naprowadzenie w celu stworzenia sobie funkcji zapisu i odczytu strony w C avr (procesor Atmega32).<br />Zacznę o początku załóżmy że napiszę taką funkcję do zapisu dwóch stron.<br /><br />[syntax=c]// zapis danych do pamięci EEPROM 24C32 w trybie page write<br />void EI2C_write_buf(uint8_t device, uint16_t subAddr, uint8_t *buf) {<br /><br />TWI_start();               // wysłanie sekwencji START<br />TWI_write( device );       // wysłanie adresu pamięci<br />TWI_write( subAddr&gt;&gt;8 );   // wysłanie starszego bajtu adresu komórki pamięci<br />TWI_write( subAddr );      // wysłanie młodszego bajtu adresu komórki pamięci<br />TWI_write(*buf++);         // wysłanie bajtu danych <br />                if(subAddr==31) //ponieważ jedna cała strona ma 32 bajty (0-31)<br />               {<br />TWI_stop();                // sekwencja STOP<br />    _delay_ms(10);              // oczekiwanie na zapis strony<br />                }<br />                if(subAddr==63) //ponieważ druga strona (32-63)<br />               {<br />TWI_stop();                // sekwencja STOP<br />    _delay_ms(10);              // oczekiwanie na zapis strony<br />                }<br />subAddr++;<br />}[/syntax]<br /><br />I tak dalej.<br />Czy mogę sobie pozwolić na taki sposób zapisu w trybie page write po TWI?<br />czy może błądzę.<br />Proszę o konkretną pomoc w zrozumieniu tematu.Czekam na posty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=922">mirek1968</a> — 27 maja 2016, o 21:13</p><hr />
]]></content>
</entry>
</feed>