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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-02-13T16:14:01+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=9598&amp;mode</id>
<entry>
<author><name><![CDATA[jacky_cy]]></name></author>
<updated>2015-02-13T16:14:01+01:00</updated>
<published>2015-02-13T16:14:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=118778#p118778</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=118778#p118778"/>
<title type="html"><![CDATA[Re: ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=118778#p118778"><![CDATA[
Koledzy,<br /><br />Pozwolę sobie powrócić do tematu... Więc swego czasu było już ok komunikacja ze sterownikiem po sieci działała...<br />Aż tu nagle... Więc wgrałem sobie programik serwera http z BB i okazuje się, że połączenie raz działa raz nie działa.<br /><a href="http://forum.atnel.pl/_obrazki/o/4547/dd43462c1f21179b31302bc5d55a89cc.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/4547/dd43462c1f21179b31302bc5d55a89cc.png" alt="Obrazek" /></a><br />Zdarza się, że wyślę pinga do układu i na załączony obrazku widać, że odpowiedz idzie. Za drugim razem wyślę pinga... brak odpowiedzi. Dodam tylko, że połączenia na płytce sprawdzone. Czy ktoś z Was miał kiedyś podobny problem ?<br /><br /><br />Bardzo proszę o pomoc, bo zatruwa mi to kolejny dzień  <img src="https://forum.atnel.pl/images/smilies/icon_mad.gif" alt=":x" title="Wściekły" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4547">jacky_cy</a> — 13 lut 2015, o 16:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacky_cy]]></name></author>
<updated>2014-12-14T16:57:47+01:00</updated>
<published>2014-12-14T16:57:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108655#p108655</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108655#p108655"/>
<title type="html"><![CDATA[Re: ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108655#p108655"><![CDATA[
PIN SS jako wyjście i załatwione!  Dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4547">jacky_cy</a> — 14 gru 2014, o 16:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2014-12-13T01:23:15+01:00</updated>
<published>2014-12-13T01:23:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108453#p108453</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108453#p108453"/>
<title type="html"><![CDATA[Re: ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108453#p108453"><![CDATA[
<div class="quotetitle">jacky_cy napisał(a):</div><div class="quotecontent"><br />postaram się wywalić CS na SS<br /></div><br />Nie nie, trochę inaczej: nie musisz koniecznie używać tego pinu do sterowania modułem, wystarczy, że w czasie komunikacji z modułem na pinie SS będzie utrzymany stan wysoki. Tylko na czas transmisji, potem może sobie być jakikolwiek. Albo alternatywnie pin musi działać jako wyjście, wtedy już całkiem bez znaczenia co tam jest podłączone (niekoniecznie musi to być moduł eth) i jaki jest stan. <br />A co do innego ethernetu to niestety nie mogę pomóc, musisz pytać...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 13 gru 2014, o 01:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacky_cy]]></name></author>
<updated>2014-12-12T22:05:34+01:00</updated>
<published>2014-12-12T22:05:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108437#p108437</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108437#p108437"/>
<title type="html"><![CDATA[Re: ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108437#p108437"><![CDATA[
Z Twojego postu wynika że można uderzyć z inna kartą ??<br /><br />Kurczę jak nie zaradzimy z softem co by ogarnąć CS na PD0 to się dosiądę jutro do lutownicy i postaram się wywalić CS na SS ATmegi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4547">jacky_cy</a> — 12 gru 2014, o 22:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2014-12-12T21:24:50+01:00</updated>
<published>2014-12-12T21:24:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108429#p108429</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108429#p108429"/>
<title type="html"><![CDATA[Re: ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108429#p108429"><![CDATA[
Rozumiem, że wykorzystujesz SS jako wejście? No to chyba nie unikniesz przeróbki płytki. Gdyby to był jakiś mniej wymagający moduł to można by zastosować software SPI, ale ten ethernet, zdaje się, wymaga maksymalnej szybkości SPI. Nie chce Cię wprowadzać w błąd, bo nie używalem tego modulu ale z tego co czytałem, choćby na tym forum, wolny interfejs powoduje jakieś zwisy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 12 gru 2014, o 21:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacky_cy]]></name></author>
<updated>2014-12-12T20:53:51+01:00</updated>
<published>2014-12-12T20:53:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108426#p108426</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108426#p108426"/>
<title type="html"><![CDATA[Re: ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108426#p108426"><![CDATA[
Problem jest na tyle złożony, że układ zmontowany. To ma być &quot;bajer&quot; to sterownika parametrów klimatu. Jednak zależy mi, żeby to hasało. (jeśli się da)<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/4547/527bbfa48768130aacd6a3ef68a6e07a.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/4547/527bbfa48768130aacd6a3ef68a6e07a.JPG" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4547">jacky_cy</a> — 12 gru 2014, o 20:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2014-12-12T13:34:37+01:00</updated>
<published>2014-12-12T13:34:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108345#p108345</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108345#p108345"/>
<title type="html"><![CDATA[Re: ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108345#p108345"><![CDATA[
Wszedłeś na znaną (ale często zapominaną) minę z pinem SS (nie ty pierwszy, jeśli to cię pocieszy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />) Możesz oczywiście jako CS użyć innego pinu ale niestety nie możesz zostawić pinu SS samopas. Trzeba go, o ile dobrze pamiętam, ustawić jako wyjście albo zostawiając jako wejście zapewnić na nim stan HIGH. Zapoznaj się z rozdziałem w dataszicie pt. &quot;Pin SS in master mode&quot;, czy jakoś tak.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 12 gru 2014, o 13:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacky_cy]]></name></author>
<updated>2014-12-12T12:38:09+01:00</updated>
<published>2014-12-12T12:38:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108337#p108337</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108337#p108337"/>
<title type="html"><![CDATA[Re: ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=108337#p108337"><![CDATA[
Na wstępie przepraszam, że dopiero teraz odpisuję...<br /><br />Ale jeszcze raz przedstawię problem. Zacząłem mieszać ponieważ chciałbym, aby w moim projekcie linia CS od karty sieciowej była podpięta pod pin PD0 uC. Stąd moje kombinacje...<br /><br />Jeśli chodzi o podpięcie się pod pin SS ATmegi to komunikacja między kartą a uC działa bez zarzutu. Natomiast problem pojawił się gdy CS zamiast pod PB4 miałby być podpięty pod PD0 (chyba da się?).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4547">jacky_cy</a> — 12 gru 2014, o 12:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[frog]]></name></author>
<updated>2014-12-09T14:11:04+01:00</updated>
<published>2014-12-09T14:11:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=107930#p107930</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=107930#p107930"/>
<title type="html"><![CDATA[Re: ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=107930#p107930"><![CDATA[
Ja u siebie mam moduł karty sieciowej podłączony pod atmegę bezpośrednio bez żadnych buforów(używam modułu do arduino, który ma wyprowadzone gotowe piny pod atmegę). Co do przeróbek programu robisz zasadniczy błąd. Niepotrzebnie dopisujesz kolejne linijki definicji preprocesora. Zauważ, że piny interfejsu SPI są takie same jak przy twojej atmedze i atmedze 644, która jest już zdefiniowana w programie. Więc zamiast tej linijki:<br />[syntax=c]#if defined(__AVR_ATmega644__)||defined(__AVR_ATmega644P__)[/syntax]<br />Powinieneś wpisać takie coś:<br />[syntax=c]#if defined(__AVR_ATmega644__)||defined(__AVR_ATmega644P__)||defined(__AVR_ATmega32__)[/syntax]<br />Dzięki temu kompilator sam wykryje jaki masz podpięty procesor i odpowiednio Twój program zdefiniuje piny.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5970">frog</a> — 9 gru 2014, o 14:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacky_cy]]></name></author>
<updated>2014-12-08T22:09:54+01:00</updated>
<published>2014-12-08T22:09:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=107874#p107874</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=107874#p107874"/>
<title type="html"><![CDATA[ENC28J60 problem z komunikacją po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9598&amp;p=107874#p107874"><![CDATA[
Szanowni Panowie mam taki kolejny mały problem.<br /><br />Otóż z pomocą bluebooka chciałem zaprzęgnąć kartę sieciową na ENC28J60 do współpracy z moim sterownikiem. Problem pojawił się już na wstępie z komunikacją po SPI (w sumie pierwsza moja próba z komunikacją czegokolwiek po SPI). W sumie robiłem wszystko krok po kroku jak w książce (biblioteki z tuxgraphics.org), lecz zmieniłem trochę plik enc28j60.c Wstawiam oryginalny plik ze stronki:<br /><br />[syntax=c]/*********************************************<br /> * vim:sw=8:ts=8:si:et<br /> * To use the above modeline in vim you must have &quot;set modeline&quot; in your .vimrc<br /> * Author: Guido Socher <br /> * Copyright:LGPL V2<br /> * See http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html<br /> *<br /> * Based on the enc28j60.c file from the AVRlib library by Pascal Stang.<br /> * For AVRlib See http://www.procyonengineering.com/<br /> * Used with explicit permission of Pascal Stang.<br /> *<br /> * Title: Microchip ENC28J60 Ethernet Interface Driver<br /> * Chip type           : ATMEGA88/ATMEGA168/ATMEGA328/ATMEGA644 with ENC28J60<br /> *********************************************/<br />#include &lt;avr/io.h&gt;<br />#include &quot;ip_config.h&quot;<br />#include &quot;enc28j60.h&quot;<br />//<br />#ifndef F_CPU<br />#define F_CPU 12500000UL  // 12.5 MHz<br />//#else <br />//#warning &quot;F_CPU was already defined&quot; <br />#endif<br /><br />#ifndef ALIBC_OLD<br />#include &lt;util/delay_basic.h&gt;<br />#else<br />#include &lt;avr/delay.h&gt;<br />#endif<br /><br /><br />static uint8_t Enc28j60Bank;<br />static int16_t gNextPacketPtr;<br />#define ENC28J60_CONTROL_PORT   PORTB<br />#define ENC28J60_CONTROL_DDR    DDRB<br />#if defined(__AVR_ATmega88__) || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) <br />#define ENC28J60_CONTROL_CS PORTB2<br />#define ENC28J60_CONTROL_SO PORTB4<br />#define ENC28J60_CONTROL_SI PORTB3<br />#define ENC28J60_CONTROL_SCK PORTB5<br />#endif<br />#if defined(__AVR_ATmega644__)||defined(__AVR_ATmega644P__)<br />#define ENC28J60_CONTROL_CS PORTB4<br />#define ENC28J60_CONTROL_SO PORTB6<br />#define ENC28J60_CONTROL_SI PORTB5<br />#define ENC28J60_CONTROL_SCK PORTB7<br />#endif<br />// set CS to 0 = active<br />#define CSACTIVE ENC28J60_CONTROL_PORT&amp;=~(1&lt;&lt;ENC28J60_CONTROL_CS)<br />// set CS to 1 = passive<br />#define CSPASSIVE ENC28J60_CONTROL_PORT|=(1&lt;&lt;ENC28J60_CONTROL_CS)<br />//<br />#define waitspi() while(!(SPSR&amp;(1&lt;&lt;SPIF)))<br /><br />uint8_t enc28j60ReadOp(uint8_t op, uint8_t address)<br />{<br />        CSACTIVE;<br />        // issue read command<br />        SPDR = op | (address &amp; ADDR_MASK);<br />        waitspi();<br />        // read data<br />        SPDR = 0x00;<br />        waitspi();<br />        // do dummy read if needed (for mac and mii, see datasheet page 29)<br />        if(address &amp; 0x80)<br />        {<br />                SPDR = 0x00;<br />                waitspi();<br />        }<br />        // release CS<br />        CSPASSIVE;<br />        return(SPDR);<br />}<br /><br />void enc28j60WriteOp(uint8_t op, uint8_t address, uint8_t data)<br />{<br />        CSACTIVE;<br />        // issue write command<br />        SPDR = op | (address &amp; ADDR_MASK);<br />        waitspi();<br />        // write data<br />        SPDR = data;<br />        waitspi();<br />        CSPASSIVE;<br />}<br /><br />void enc28j60ReadBuffer(uint16_t len, uint8_t* data)<br />{<br />        CSACTIVE;<br />        // issue read command<br />        SPDR = ENC28J60_READ_BUF_MEM;<br />        waitspi();<br />        while(len)<br />        {<br />                len--;<br />                // read data<br />                SPDR = 0x00;<br />                waitspi();<br />                *data = SPDR;<br />                data++;<br />        }<br />        *data='\0';<br />        CSPASSIVE;<br />}<br /><br />void enc28j60WriteBuffer(uint16_t len, uint8_t* data)<br />{<br />        CSACTIVE;<br />        // issue write command<br />        SPDR = ENC28J60_WRITE_BUF_MEM;<br />        waitspi();<br />        while(len)<br />        {<br />                len--;<br />                // write data<br />                SPDR = *data;<br />                data++;<br />                waitspi();<br />        }<br />        CSPASSIVE;<br />}<br /><br />void enc28j60SetBank(uint8_t address)<br />{<br />        // set the bank (if needed)<br />        if((address &amp; BANK_MASK) != Enc28j60Bank)<br />        {<br />                // set the bank<br />                enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, (ECON1_BSEL1|ECON1_BSEL0));<br />                enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, (address &amp; BANK_MASK)&gt;&gt;5);<br />                Enc28j60Bank = (address &amp; BANK_MASK);<br />        }<br />}<br /><br />uint8_t enc28j60Read(uint8_t address)<br />{<br />        // set the bank<br />        enc28j60SetBank(address);<br />        // do the read<br />        return enc28j60ReadOp(ENC28J60_READ_CTRL_REG, address);<br />}<br /><br />// read 16 bits<br />uint16_t enc28j60PhyRead(uint8_t address)<br />{<br />// Set the right address and start the register read operation<br />enc28j60Write(MIREGADR, address);<br />enc28j60Write(MICMD, MICMD_MIIRD);<br />// wait until the PHY read completes<br />while(enc28j60Read(MISTAT) &amp; MISTAT_BUSY);<br />// reset reading bit<br />enc28j60Write(MICMD, 0x00);<br />        // get data value from MIRDL and MIRDH<br />return ((enc28j60Read(MIRDH)&lt;&lt;8)|enc28j60Read(MIRDL));<br />}<br /><br />void enc28j60Write(uint8_t address, uint8_t data)<br />{<br />        // set the bank<br />        enc28j60SetBank(address);<br />        // do the write<br />        enc28j60WriteOp(ENC28J60_WRITE_CTRL_REG, address, data);<br />}<br /><br />void enc28j60PhyWrite(uint8_t address, uint16_t data)<br />{<br />        // set the PHY register address<br />        enc28j60Write(MIREGADR, address);<br />        // write the PHY data<br />        enc28j60Write(MIWRL, data);<br />        enc28j60Write(MIWRH, data&gt;&gt;8);<br />        // wait until the PHY write completes<br />        while(enc28j60Read(MISTAT) &amp; MISTAT_BUSY){<br />                _delay_loop_1(40); // 10us<br />        }<br />}<br /><br />void enc28j60clkout(uint8_t clk)<br />{<br />        //setup clkout: 2 is 12.5MHz:<br />enc28j60Write(ECOCON, clk &amp; 0x7);<br />}<br /><br />void enc28j60Init(uint8_t* macaddr)<br />{<br />// initialize I/O<br />        // ss as output:<br />ENC28J60_CONTROL_DDR |= 1&lt;&lt;ENC28J60_CONTROL_CS;<br />CSPASSIVE; // ss=0<br />        //<br />ENC28J60_CONTROL_DDR  |= 1&lt;&lt;ENC28J60_CONTROL_SI | 1&lt;&lt;ENC28J60_CONTROL_SCK; // mosi, sck output<br />ENC28J60_CONTROL_DDR&amp;=~(1&lt;&lt;ENC28J60_CONTROL_SO); // MISO is input<br />        //<br />        ENC28J60_CONTROL_PORT&amp;=~(1&lt;&lt;ENC28J60_CONTROL_SI); // MOSI low<br />        ENC28J60_CONTROL_PORT&amp;=~(1&lt;&lt;ENC28J60_CONTROL_SCK); // SCK low<br />//<br />// initialize SPI interface<br />// master mode and Fosc/2 clock:<br />        SPCR = (1&lt;&lt;SPE)|(1&lt;&lt;MSTR);<br />        SPSR |= (1&lt;&lt;SPI2X);<br />// perform system reset<br />enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);<br />        _delay_loop_2(0); // 20ms<br />// check CLKRDY bit to see if reset is complete<br />        // The CLKRDY does not work. See Rev. B4 Silicon Errata point. Just wait.<br />//while(!(enc28j60Read(ESTAT) &amp; ESTAT_CLKRDY));<br />// do bank 0 stuff<br />// initialize receive buffer<br />// 16-bit transfers, must write low byte first<br />// set receive buffer start address<br />gNextPacketPtr = RXSTART_INIT;<br />        // Rx start<br />enc28j60Write(ERXSTL, RXSTART_INIT&amp;0xFF);<br />enc28j60Write(ERXSTH, RXSTART_INIT&gt;&gt;8);<br />// set receive pointer address<br />enc28j60Write(ERXRDPTL, RXSTART_INIT&amp;0xFF);<br />enc28j60Write(ERXRDPTH, RXSTART_INIT&gt;&gt;8);<br />// RX end<br />enc28j60Write(ERXNDL, RXSTOP_INIT&amp;0xFF);<br />enc28j60Write(ERXNDH, RXSTOP_INIT&gt;&gt;8);<br />// TX start<br />enc28j60Write(ETXSTL, TXSTART_INIT&amp;0xFF);<br />enc28j60Write(ETXSTH, TXSTART_INIT&gt;&gt;8);<br />// TX end<br />enc28j60Write(ETXNDL, TXSTOP_INIT&amp;0xFF);<br />enc28j60Write(ETXNDH, TXSTOP_INIT&gt;&gt;8);<br />// do bank 1 stuff, packet filter:<br />        // For broadcast packets we allow only ARP packtets<br />        // All other packets should be unicast only for our mac (MAADR)<br />        //<br />        // The pattern to match on is therefore<br />        // Type     ETH.DST<br />        // ARP      BROADCAST<br />        // 06 08 -- ff ff ff ff ff ff -&gt; ip checksum for theses bytes=f7f9<br />        // in binary these poitions are:11 0000 0011 1111<br />        // This is hex 303F-&gt;EPMM0=0x3f,EPMM1=0x30<br />enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);<br />enc28j60Write(EPMM0, 0x3f);<br />enc28j60Write(EPMM1, 0x30);<br />enc28j60Write(EPMCSL, 0xf9);<br />enc28j60Write(EPMCSH, 0xf7);<br />        //<br />        //<br />// do bank 2 stuff<br />// enable MAC receive<br />enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);<br />// bring MAC out of reset<br />enc28j60Write(MACON2, 0x00);<br />// enable automatic padding to 60bytes and CRC operations<br />enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);<br />// set inter-frame gap (non-back-to-back)<br />enc28j60Write(MAIPGL, 0x12);<br />enc28j60Write(MAIPGH, 0x0C);<br />// set inter-frame gap (back-to-back)<br />enc28j60Write(MABBIPG, 0x12);<br />// Set the maximum packet size which the controller will accept<br />        // Do not send packets longer than MAX_FRAMELEN:<br />enc28j60Write(MAMXFLL, MAX_FRAMELEN&amp;0xFF);<br />enc28j60Write(MAMXFLH, MAX_FRAMELEN&gt;&gt;8);<br />// do bank 3 stuff<br />        // write MAC address<br />        // NOTE: MAC address in ENC28J60 is byte-backward<br />        enc28j60Write(MAADR5, macaddr&#91;0&#93;);<br />        enc28j60Write(MAADR4, macaddr&#91;1&#93;);<br />        enc28j60Write(MAADR3, macaddr&#91;2&#93;);<br />        enc28j60Write(MAADR2, macaddr&#91;3&#93;);<br />        enc28j60Write(MAADR1, macaddr&#91;4&#93;);<br />        enc28j60Write(MAADR0, macaddr&#91;5&#93;);<br />// no loopback of transmitted frames<br />enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);<br />// switch to bank 0<br />enc28j60SetBank(ECON1);<br />// enable interrutps<br />enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);<br />// enable packet reception<br />enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);<br />}<br /><br />// read the revision of the chip:<br />uint8_t enc28j60getrev(void)<br />{<br />        uint8_t rev;<br />        rev=enc28j60Read(EREVID);<br />        // microchip forgott to step the number on the silcon when they<br />        // released the revision B7. 6 is now rev B7. We still have<br />        // to see what they do when they release B8. At the moment<br />        // there is no B8 out yet<br />        if (rev&gt;5) rev++;<br />return(rev);<br />}<br /><br />// dhcp_client.c needs general broadcast<br />#ifdef ENC28J60_BROADCAST<br />// A number of utility functions to enable/disable general broadcast (not just arp)<br />void enc28j60EnableBroadcast( void ) {<br />        enc28j60Write(ERXFCON, (uint8_t)((enc28j60Read(ERXFCON) | ERXFCON_BCEN)));<br />}<br />void enc28j60DisableBroadcast( void ) {<br />        enc28j60Write(ERXFCON, enc28j60Read(ERXFCON) &amp; (0xff ^ ERXFCON_BCEN));<br />}<br />#endif<br /><br />// link status<br />uint8_t enc28j60linkup(void)<br />{<br />        // PHSTAT1 LLSTAT (= bit 2 in lower reg), PHSTAT1_LLSTAT<br />        // LLSTAT is latching, that is: if it was down since last<br />        // calling enc28j60linkup then we get first a down indication<br />        // and only at the next call to enc28j60linkup it will come up.<br />        // This way we can detect intermittened link failures and<br />        // that might be what we want.<br />        // The non latching version is LSTAT.<br />        // PHSTAT2 LSTAT (= bit 10 in upper reg)<br />        if (enc28j60PhyRead(PHSTAT2) &amp; (1&lt;&lt;10) ){<br />        //if (enc28j60PhyRead(PHSTAT1) &amp; PHSTAT1_LLSTAT){<br />                return(1);<br />        }<br />        return(0);<br />}<br /><br />void enc28j60PacketSend(uint16_t len, uint8_t* packet)<br />{<br />        // Check no transmit in progress<br />        while (enc28j60ReadOp(ENC28J60_READ_CTRL_REG, ECON1) &amp; ECON1_TXRTS);<br />        // <br />        // Reset the transmit logic problem. Unblock stall in the transmit logic.<br />        // See Rev. B4 Silicon Errata point 12.<br />        if( (enc28j60Read(EIR) &amp; EIR_TXERIF) ) {<br />                enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRST);<br />                enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRST);<br />                enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, EIR, EIR_TXERIF); <br />                _delay_loop_2(30000); // 10ms<br />        }<br />// Set the write pointer to start of transmit buffer area<br />enc28j60Write(EWRPTL, TXSTART_INIT&amp;0xFF);<br />enc28j60Write(EWRPTH, TXSTART_INIT&gt;&gt;8);<br />// Set the TXND pointer to correspond to the packet size given<br />enc28j60Write(ETXNDL, (TXSTART_INIT+len)&amp;0xFF);<br />enc28j60Write(ETXNDH, (TXSTART_INIT+len)&gt;&gt;8);<br />// write per-packet control byte (0x00 means use macon3 settings)<br />enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);<br />// copy the packet into the transmit buffer<br />enc28j60WriteBuffer(len, packet);<br />// send the contents of the transmit buffer onto the network<br />enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS);<br />}<br /><br />// just probe if there might be a packet<br />uint8_t enc28j60hasRxPkt(void)<br />{<br />if( enc28j60Read(EPKTCNT) ==0 ){<br />return(0);<br />        }<br />        return(1);<br />}<br /><br />// Gets a packet from the network receive buffer, if one is available.<br />// The packet will by headed by an ethernet header.<br />//      maxlen  The maximum acceptable length of a retrieved packet.<br />//      packet  Pointer where packet data should be stored.<br />// Returns: Packet length in bytes if a packet was retrieved, zero otherwise.<br />uint16_t enc28j60PacketReceive(uint16_t maxlen, uint8_t* packet)<br />{<br />uint16_t rxstat;<br />uint16_t len;<br />// check if a packet has been received and buffered<br />//if( !(enc28j60Read(EIR) &amp; EIR_PKTIF) )<br />        // The above does not work. See Rev. B4 Silicon Errata point 6.<br />if( enc28j60Read(EPKTCNT) ==0 ){<br />return(0);<br />        }<br /><br />// Set the read pointer to the start of the received packet<br />enc28j60Write(ERDPTL, (gNextPacketPtr &amp;0xFF));<br />enc28j60Write(ERDPTH, (gNextPacketPtr)&gt;&gt;8);<br />// read the next packet pointer<br />gNextPacketPtr  = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);<br />gNextPacketPtr |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)&lt;&lt;8;<br />// read the packet length (see datasheet page 43)<br />len  = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);<br />len |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)&lt;&lt;8;<br />        len-=4; //remove the CRC count<br />// read the receive status (see datasheet page 43)<br />rxstat  = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);<br />rxstat |= ((uint16_t)enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0))&lt;&lt;8;<br />// limit retrieve length<br />        if (len&gt;maxlen-1){<br />                len=maxlen-1;<br />        }<br />        // check CRC and symbol errors (see datasheet page 44, table 7-3):<br />        // The ERXFCON.CRCEN is set by default. Normally we should not<br />        // need to check this.<br />        if ((rxstat &amp; 0x80)==0){<br />                // invalid<br />                len=0;<br />        }else{<br />                // copy the packet from the receive buffer<br />                enc28j60ReadBuffer(len, packet);<br />        }<br />// Move the RX read pointer to the start of the next received packet<br />// This frees the memory we just read out<br />//enc28j60Write(ERXRDPTL, (gNextPacketPtr &amp;0xFF));<br />//enc28j60Write(ERXRDPTH, (gNextPacketPtr)&gt;&gt;8);<br />        //<br />        // Move the RX read pointer to the start of the next received packet<br />        // This frees the memory we just read out. <br />        // However, compensate for the errata point 13, rev B4: never write an even address!<br />        // gNextPacketPtr is always an even address if RXSTOP_INIT is odd.<br />        if (gNextPacketPtr -1 &gt; RXSTOP_INIT){ // RXSTART_INIT is zero, no test for gNextPacketPtr less than RXSTART_INIT.<br />                enc28j60Write(ERXRDPTL, (RXSTOP_INIT)&amp;0xFF);<br />                enc28j60Write(ERXRDPTH, (RXSTOP_INIT)&gt;&gt;8);<br />        } else {<br />                enc28j60Write(ERXRDPTL, (gNextPacketPtr-1)&amp;0xFF);<br />                enc28j60Write(ERXRDPTH, (gNextPacketPtr-1)&gt;&gt;8);<br />        }<br />// decrement the packet counter indicate we are done with this packet<br />enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC);<br />return(len);<br />}[/syntax] <br /><br />A to moje modyfikacje na potrzeby ATmegi32 i linii CS podpiętej do pinu PD0:<br /><br />[syntax=c]#define ENC28J60_CONTROL_PORT   PORTB<br />#define ENC28J60_CONTROL_DDR    DDRB<br /><br />#define CS_CONTROL_PORT   PORTD<br />#define CS_CONTROL_DDR    DDRD<br /><br /><br />#define ENC28J60_CONTROL_CS PORTD0<br />#define ENC28J60_CONTROL_SO PORTB6<br />#define ENC28J60_CONTROL_SI PORTB5<br />#define ENC28J60_CONTROL_SCK PORTB7<br /><br />// set CS to 0 = active<br />#define CSACTIVE CS_CONTROL_PORT&amp;=~(1&lt;&lt;ENC28J60_CONTROL_CS)<br />// set CS to 1 = passive<br />#define CSPASSIVE CS_CONTROL_PORT|=(1&lt;&lt;ENC28J60_CONTROL_CS)[/syntax]<br />oraz<br />[syntax=c]void enc28j60Init(uint8_t* macaddr)<br />{<br />// initialize I/O<br />        // ss as output:<br />CS_CONTROL_DDR |= 1&lt;&lt;ENC28J60_CONTROL_CS;[/syntax]<br /><br />W każdym razie karta sieciowa nie komunikuje się z prockiem, więc bardzo Was proszę i naprowadzenie mnie gdzie robię jakąś gafę.<br /><br />Dopasowanie sygnałów na podstawie schematu w książce na 74AC125D. Schemat:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/4547/92c00c19c0ea5cfa86f74925b360e87b.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/4547/92c00c19c0ea5cfa86f74925b360e87b.png" alt="Obrazek" /></a><br /><br />uC taktowany zewnętrznym kwarcem 16MHz, połączenia sprawdzone.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4547">jacky_cy</a> — 8 gru 2014, o 22:09</p><hr />
]]></content>
</entry>
</feed>