<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Courier;
        panose-1:2 7 4 9 2 2 5 2 4 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"Form\00E1tovan\00FD v HTML Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.FormtovanvHTMLChar
        {mso-style-name:"Form\00E1tovan\00FD v HTML Char";
        mso-style-priority:99;
        mso-style-link:"Form\00E1tovan\00FD v HTML";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=CS link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Tak slave nakonec úspěšně rozchozen. Po předělání na přerušení to skoro fungovalo. Pak pomohlo:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><a href="https://www.avrfreaks.net/forum/solved-how-use-attiny-1617-i2c-slave">https://www.avrfreaks.net/forum/solved-how-use-attiny-1617-i2c-slave</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Zajímavá je tahle část:<o:p></o:p></p><div><div style='mso-element:para-border-div;border:solid #E5EBEE 1.0pt;padding:8.0pt 8.0pt 8.0pt 8.0pt;background:#FAFAFA;margin-left:15.0pt;margin-right:15.0pt'><pre style='mso-margin-top-alt:12.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:#FAFAFA;border:none;padding:0cm'><span style='font-size:9.0pt;font-family:Courier;color:green'>If</span><span style='font-size:9.0pt;font-family:"Calibri",sans-serif;color:green'> </span><span style='font-size:9.0pt;font-family:Courier;color:green'>(TWI0.SSTATUS & TWI_DIR_bm)</span><span style='font-size:9.0pt;font-family:"Calibri",sans-serif;color:green'> </span><span style='font-size:9.0pt;font-family:Courier;color:green'>{<o:p></o:p></span></pre><pre style='mso-margin-top-alt:12.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:#FAFAFA;border:none;padding:0cm'><span style='font-size:9.0pt;font-family:Courier;color:green'>            TWI0.SDATA =++nnn; //Transmit data for Master to read<o:p></o:p></span></pre><pre style='mso-margin-top-alt:12.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:#FAFAFA;border:none;padding:0cm'><span style='font-size:9.0pt;font-family:Courier;color:green'>            TWI0_SCTRLB = TWI_SCMD_RESPONSE_gc;<o:p></o:p></span></pre><pre style='mso-margin-top-alt:12.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:#FAFAFA;border:none;padding:0cm'><span style='font-size:9.0pt;font-family:Courier;color:green'>}</span><span style='font-size:9.0pt;font-family:"Calibri",sans-serif;color:green'> </span><span style='font-size:9.0pt;font-family:Courier;color:green'>else</span><span style='font-size:9.0pt;font-family:"Calibri",sans-serif;color:green'> </span><span style='font-size:9.0pt;font-family:Courier;color:green'>{<o:p></o:p></span></pre><pre style='mso-margin-top-alt:12.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:#FAFAFA;border:none;padding:0cm'><span style='font-size:9.0pt;font-family:Courier;color:green'>            TWI0_SCTRLB = TWI_SCMD_RESPONSE_gc;<o:p></o:p></span></pre><pre style='mso-margin-top-alt:12.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:#FAFAFA;border:none;padding:0cm'><span style='font-size:9.0pt;font-family:Courier;color:green'>            nnn = TWI0.SDATA;  //Receive data written by Master<o:p></o:p></span></pre><pre style='mso-margin-top-alt:12.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:#FAFAFA;border:none;padding:0cm'><span style='font-size:9.0pt;font-family:Courier;color:green'>}<o:p></o:p></span></pre></div></div><p class=MsoNormal>Nevím z čeho plyne to pořadí, kdy pracovat s SDATA a kdy s SCTRLB, ale opačně read nechodí.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Ale nakonec zlobí ještě master: Ten komplet chodí, ale nakonec neudělá stop. U slave mám timeout, tak to zas tak nevadí, ale nelíbí se mi to:-)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Zatím je to jen pro read:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>void i2cCom(uint8_t rw, uint8_t dLen) { // =====================</p><p class=MsoNormal>                uint8_t n;</p><p class=MsoNormal>                </p><p class=MsoNormal>                TWI0_MCTRLB=TWI_FLUSH_bm; // flush, ack ano, cmd nic</p><p class=MsoNormal>                cekej(10);</p><p class=MsoNormal>                while(1) {</p><p class=MsoNormal>                               TWI0_MSTATUS=TWI_BUSSTATE_IDLE_gc; // prechod unknown-iddle</p><p class=MsoNormal>                               cekej(50);</p><p class=MsoNormal>                               if ((TWI0_MSTATUS & TWI_BUSSTATE_gm)==TWI_BUSSTATE_IDLE_gc) {PIN_led(1); break;} // vydrzelo iddle?</p><p class=MsoNormal>                               PIN_ledTgl;</p><p class=MsoNormal>                }</p><p class=MsoNormal>                do {</p><p class=MsoNormal>                               i2cTout=0; // timeout pro i2cWait</p><p class=MsoNormal>                               TWI0_MADDR=(I2C_slaveAdr<<1) | (rw & 1); // start+adr+rw</p><p class=MsoNormal>                               do {</p><p class=MsoNormal>                                               test8=TWI0_MSTATUS;</p><p class=MsoNormal>                                               PIN_led(0); PIN_led(1);</p><p class=MsoNormal>                               } while((test8 & TWI_RIF_bm)==0 && i2cWait(1)==0);</p><p class=MsoNormal>                               // 1010 0010</p><p class=MsoNormal>                               if (test8!=(TWI_RIF_bm|TWI_CLKHOLD_bm|TWI_BUSSTATE_OWNER_gc)) { // err po adr</p><p class=MsoNormal>                                               print("err adr "); printBin(test8, 8); putchar2(' ');</p><p class=MsoNormal style='margin-left:70.8pt;text-indent:35.4pt'>printN(i2cTout, 3); putchar2('\n');</p><p class=MsoNormal>                                               break;</p><p class=MsoNormal>                               }</p><p class=MsoNormal>                               // adr odeslana, ack prijato, bude read (slave->master)</p><p class=MsoNormal>                               for (n=0; n<dLen; n++) {</p><p class=MsoNormal>                                               testPole[n]=TWI0_MDATA;</p><p class=MsoNormal>                                               TWI0_MCTRLB=TWI_MCMD_RECVTRANS_gc;</p><p class=MsoNormal>                                               do {</p><p class=MsoNormal>                                                               test8=TWI0_MSTATUS;</p><p class=MsoNormal>                                                               PIN_led(0); PIN_led(1);</p><p class=MsoNormal>                                               } while((test8 & TWI_RIF_bm)==0 && i2cWait(n+2)==0);</p><p class=MsoNormal>                                               </p><p class=MsoNormal>                                               if (test8!=(TWI_RIF_bm|TWI_CLKHOLD_bm|TWI_BUSSTATE_OWNER_gc)) {// err</p><p class=MsoNormal>                                                               print("err rd B"); putchar2('0'+n); putchar2(' ');</p><p class=MsoNormal>                                                               printBin(test8, 8); putchar2(' ');</p><p class=MsoNormal>                                                               printN(i2cTout, 3); putchar2('\n');</p><p class=MsoNormal>                                                               break;</p><p class=MsoNormal>                                               }</p><p class=MsoNormal>                               }</p><p class=MsoNormal>                } while(0);</p><p class=MsoNormal>                TWI0_MCTRLB=TWI_MCMD_STOP_gc; // stop</p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>PH</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal style='border:none;padding:0cm'><b>Od: </b><a href="mailto:edizon@seznam.cz">Pavel Hudecek</a><o:p></o:p></p></div><p class=MsoNormal>Jj, vypadá to jednoduše:-)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Asi jsem se trochu ztratil v ifech a whilech, myslel jsem si, že když od toho nepožaduju nic extra (na master read odeslat 4 B), tak že to bude bez přerušení jednodušší. No není. Teď to předělávám na přerušení a zatím to vypadá kratší a přehlednější.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Vtipný je, že vždycky každýmu říkám, aby používali přerušení, že je to jednodušší:-)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>PH<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b>Od: </b><a href="mailto:konfera@efton.sk">Jan Waclawek</a><o:p></o:p></p></div><p class=MsoNormal>Precital som si tu TWI kapitolu z DS (zaujimave, ze asi 4 strany venuju<o:p></o:p></p><p class=MsoNormal>vysvetleniu standardu I2C) a mne sa to zda na prvy pohlad vcelku jasne.<o:p></o:p></p><p class=MsoNormal>Samozrejme viem, ze kde sa diabol schovava... Ale pre istotu som pozrel aj<o:p></o:p></p><p class=MsoNormal>erratu, a tam vyzera ze polozky suvisiace s TWI su vsetky len pre Master<o:p></o:p></p><p class=MsoNormal>mod a aj tie su v novsej revizii kremika odstranene.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Co presne Ti nefunguje?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>