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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-08-03T09:57:51+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7996&amp;mode</id>
<entry>
<author><name><![CDATA[t__d]]></name></author>
<updated>2014-08-03T09:57:51+01:00</updated>
<published>2014-08-03T09:57:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7996&amp;p=89994#p89994</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7996&amp;p=89994#p89994"/>
<title type="html"><![CDATA[[xmega128a3u][AT24C164] - działa tylko połowa pamięci EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7996&amp;p=89994#p89994"><![CDATA[
Witam.<br /><br />Mam problem z zapisem do zewnętrznej pamięci EEPROM AT24C164. Działa mi zapis tylko w zakresie 0-1023 a powyżej 1023 nie działa poprawnie.<br /><br />Podłączyłem EEPROM do portu E.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1066/4dbe4f5ed4dd243139948440af50ed5a.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1066/4dbe4f5ed4dd243139948440af50ed5a.png" alt="Obrazek" /></a><br /><br />Mam 3 funkcje odpowiedzialne za obsługę TWI.<br /><br />Inicjalizacja:<br /><br />[syntax=c]void TWI_init(void){<br />TWIE.MASTER.BAUD = 5;<br />TWIE.MASTER.CTRLA = TWI_MASTER_ENABLE_bm;<br />TWIE.MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;<br />}[/syntax]<br /><br />Zapis:<br /><br />[syntax=c]uint8_t TWI_EEPROM_write(uint8_t slave_address, uint16_t register_address, char *data, uint16_t msg_length){<br />if((TWIE.MASTER.STATUS &amp; TWI_MASTER_BUSSTATE_gm) != TWI_MASTER_BUSSTATE_IDLE_gc)<br />return 1;<br /><br />TWIE.MASTER.ADDR = slave_address | ((register_address&gt;&gt;8)&lt;&lt;1) | TWI_WRITE;<br /><br />while((TWIE.MASTER.STATUS &amp; TWI_MASTER_WIF_bm) == 0) ;      <br />if(TWIE.MASTER.STATUS &amp; TWI_MASTER_RXACK_bm) <br />{<br />TWIE.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc; <br />return 2;<br />}<br /><br />TWIE.MASTER.DATA = register_address;<br />while((TWIE.MASTER.STATUS &amp; TWI_MASTER_WIF_bm) == 0) ;        <br /><br />if(TWIE.MASTER.STATUS &amp; TWI_MASTER_RXACK_bm){<br />TWIE.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc; <br />return 3;<br />}<br /><br />for(uint16_t i = 0; i &lt; msg_length; i++)<br />{<br />TWIE.MASTER.DATA = *(data + i);<br />while((TWIE.MASTER.STATUS &amp; TWI_MASTER_WIF_bm) == 0) ;      <br />if(TWIE.MASTER.STATUS &amp; TWI_MASTER_RXACK_bm) <br />{<br />TWIE.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc; <br />return (3 + i);<br />}<br />}<br /><br />TWIE.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc; <br />_delay_ms(5);<br />return 0;<br />}[/syntax]<br /><br />i odczyt:<br /><br />[syntax=c]uint8_t TWI_EEPROM_read(uint8_t slave_address, uint16_t register_address, char *data, uint16_t msg_length){<br /><br />if((TWIE.MASTER.STATUS &amp; TWI_MASTER_BUSSTATE_gm) != TWI_MASTER_BUSSTATE_IDLE_gc) return 1;<br /><br />TWIE.MASTER.ADDR = slave_address | ((register_address&gt;&gt;8)&lt;&lt;1) | TWI_WRITE;<br /><br />while((TWIE.MASTER.STATUS &amp; TWI_MASTER_WIF_bm) == 0) ;<br />if(TWIE.MASTER.STATUS &amp; TWI_MASTER_RXACK_bm){<br />TWIE.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;<br />return 2;<br />}<br /><br />TWIE.MASTER.DATA = register_address ;<br />while((TWIE.MASTER.STATUS &amp; TWI_MASTER_WIF_bm) == 0) ;<br /><br />if(TWIE.MASTER.STATUS &amp; TWI_MASTER_RXACK_bm){<br />TWIE.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;<br />return 3;<br />}<br /><br />TWIE.MASTER.ADDR = slave_address | ((register_address&gt;&gt;8)&lt;&lt;1) | TWI_READ;<br /><br /><br />while((TWIE.MASTER.STATUS &amp; TWI_MASTER_RIF_bm) == 0){}<br /><br />if(TWIE.MASTER.STATUS &amp; TWI_MASTER_RXACK_bm)<br />{<br />TWIE.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;<br />return 4;<br />}<br /><br />for(uint16_t i = 0; i &lt; (msg_length - 1); i++)<br />{<br />while((TWIE.MASTER.STATUS &amp; TWI_MASTER_RIF_bm) == 0){}<br />*(data + i) = TWIE.MASTER.DATA;<br />TWIE.MASTER.CTRLC = TWI_MASTER_CMD_RECVTRANS_gc;<br />}<br /><br /><br />while((TWIE.MASTER.STATUS &amp; TWI_MASTER_RIF_bm) == 0){}<br />*(data + (msg_length - 1)) = TWIE.MASTER.DATA;<br />TWIE.MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;<br /><br />return 0;<br />}[/syntax]<br /><br />Adres urządzenia zawiera też adres bloku pamięci.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1066/c276e330c27348d0984baf3de70c5375.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1066/c276e330c27348d0984baf3de70c5375.png" alt="Obrazek" /></a><br /><br />Piny A1 i A2 są podłączone do VCC a A2 do GND więc urządzenie ma adres 0xF0 czyli 11110000<br /><br />bity 2,3,4 od prawej (1111xxx0) to adres bloku. Ustawiam go więc tak  ((register_address&gt;&gt;8)&lt;&lt;1), gdzie register_address to 16 bitów.<br /><br />Wszystko działa dobrze jak zapisuję do wartości 1023. Poniżej przykład.<br /><br />[syntax=c]char a&#91;1&#93;;<br />char b&#91;1&#93;;<br /><br />a&#91;0&#93;=1;<br />TWI_EEPROM_write(TWI_AT24C16_ADDR, 0, a, 1);<br />a&#91;0&#93;=2;<br />TWI_EEPROM_write(TWI_AT24C16_ADDR, 1023, a, 1);<br />a&#91;0&#93;=3;<br />TWI_EEPROM_write(TWI_AT24C16_ADDR, 1024, a, 1);<br /><br /><br />TWI_EEPROM_read(TWI_AT24C16_ADDR, 0, b, 1);<br />USART_send_int(b&#91;0&#93;);<br />USART_send_string_pgm(PSTR(&quot;\n\r&quot;));<br />TWI_EEPROM_read(TWI_AT24C16_ADDR, 1023, b, 1);<br />USART_send_int(b&#91;0&#93;);<br />USART_send_string_pgm(PSTR(&quot;\n\r&quot;));<br />TWI_EEPROM_read(TWI_AT24C16_ADDR, 1024, b, 1);<br />USART_send_int(b&#91;0&#93;);<br />USART_send_string_pgm(PSTR(&quot;\n\r&quot;));[/syntax]<br /><br />Na terminalu powinien być wynik: 1, 2, 3 a otrzymuję 1,2, 255.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1066/bd85e75d6012e605ba9792bb8b1da5b4.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1066/bd85e75d6012e605ba9792bb8b1da5b4.png" alt="Obrazek" /></a><br /><br />Co robię źle ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1066">t__d</a> — 3 sie 2014, o 09:57</p><hr />
]]></content>
</entry>
</feed>