Hallo allemaal..

Ik heb hier een ENC28J60 ethernet controller aan een ATmega128 hangen en daar gebeuren vreemde dingen mee..
Ik initialiseer de ethernet controller en dat gaat goed (ik laat even de link/active ledjes knipperen). De SPI interface schijnt dus goed te werken. Dan wil ik de waarde van het EREVID register uitlezen en dat doe ik zo:


uint8_t enc28j60getrev(void)
{
	return(enc28j60Read(EREVID));
}

Daar komt dan binair uit: 0111 1110 oftewel 0x7E, wat ik raar vind omdat hier een klein getal uit moet komen (1 of 4 ofzo).

Verder gaan er geen LEDs branden als ik er een netwerkkabel op aansluit (terwijl de LEDs dus wel werken en de controller ook draait).

Heeft iemand een idee wat ik verkeerd doe?

Nee, je laat wat essentiële informatie achterwege. Ik wil wel even gokken. Gebruikte compiler AVRGCC. Gebruikte library Procyon AVRlib. Ook de meeste recente versies? Heb je eigen wijzigingen aangebracht? Hoe ziet je hardware er uit? Rechstreeks uit de datasheet of anders?

De link LED zou in elk geval moeten gaan branden zodra je de netwerkkabel aansluit. Zelfs zonder SPI koppeling. Je switch/hub kan toch wel op 10Mbs?

Ik heb zelf op basis van Procyon AVRLib en een ATmega88 met de ENC28J60 gewerkt. De hardware heb ik afgeleid van http://www.tuxgraphics.org/common/src2/article06061/eth-remote-device.… waarbij ik moet opmerken dat ik C7 heb weggelaten. Met C7 kreeg ik ook geen link.

Ik gebruik CodeVisionAVR 1.24.4 als ontwikkelomgeving en de daarbij behorende libraries.

Hardware 238KB
Hier moet ik bij opmerken dat L1 naar VCC er niet in zit (is een klein 0603 SMD-spoeltje dat ik kwijt ben geraakt). Zowel doorverbinden als open laten hebben geen effect. In de datasheet staat dat dit alleen voor EMI-reductie is. Momenteel zit er een 2K32 als RBias in, vervangen door een 2K7 heeft geen zin (zoals beschreven in de errata sheet van de ENC28J60 > sommige versies van het IC moeten een andere RBias hebben).

Ik heb in mijn interrupt subroutine (die aan de /INT pin hangt) een printf gemaakt (het ding hangt aan USART), en deze wordt niet aangeroepen als ik een netwerkkabel erin stop (nog voordat er wordt gekeken of dat het packet wel voor het eigen IP bestemd is, dus zou moeten reageren op elk packet op het netwerk?)

Hub kan 10Mbit aan..

[Bericht gewijzigd door smsmonster op ]

Als je alles goed hebt aangesloten behalve de ATmega dan zou het link ledje moeten branden en de link led knipperen als er een broadcast pakketje (WOL) over het netwerk gaat. Als dat niet werkt is er wat mis met de hardware.

Ik gebruik als spoel zo'n simpel groen HF spoeltje, maar die is niet nodig om pakketjes te ontvangen.

Heb net even een andere ENC28J60 geprobeerd, gaf geen uitkomst. Condensator tussen TPOUT+ en TPOUT- verwijderen ook niet. Verder heb ik even doorgepiept en alles zit toch echt zoals het hoort. Als de SPI communicatie loopt, kan ik dan concluderen dat de klok van de ENC28J60 goed loopt?

Als de SPI communicatie werkt dan kan je concluderen dat de klok loopt, niet dat die goed loopt.

Heb je trouwens ook beide gedaan. Met spoel en zonder C11 (jou schema). De spoel kan ik zeker niet weglaten. Overigens krijg je pas een link als je kan zenden en ontvangen.

Ah yes dat was het! Die condensator eruit, spoel erin en hij werkt meteen als een tierelier.. Erg wazig.. Ik kan hem nu gewoon prima pingen en er komt ook HTTP respons uit, dus de SPI koppeling loopt goed.. Toch vind ik het raar dat die EREVID niet goed terugkomt.

Ik doe dit:

printf("- EREVID: %d \r\n",enc28j60getrev&0x1F);

Dat masker gebruik ik omdat alleen de laatste 5 bits van het register gebruikt worden.

En de microcontroller antwoordt:

- EREVID: 22

Terwijl dit dus een klein getal zou moeten zijn.

Op 2 februari 2007 00:23:46 schreef smsmonster:
Ah yes dat was het! Die condensator eruit, spoel erin en hij werkt meteen als een tierelier.. Erg wazig.. Ik kan hem nu gewoon prima pingen en er komt ook HTTP respons uit, dus de SPI koppeling loopt goed.. Toch vind ik het raar dat die EREVID niet goed terugkomt.

Ik doe dit:

printf("- EREVID: %d \r\n",enc28j60getrev&0x1F);

Dat masker gebruik ik omdat alleen de laatste 5 bits van het register gebruikt worden.

En de microcontroller antwoordt:

- EREVID: 22

Terwijl dit dus een klein getal zou moeten zijn.

Met 5 bits kun je 31 maken he...

Op 2 februari 2007 08:18:49 schreef gradtje:
[...]
Met 5 bits kun je 31 maken he...

Haha ja, snap ik.. Maar dat getal stelt de revisie ID voor, en als ik het goed gezien heb moet dat 1, 4 of 5 zijn, de laatste versie is 5 in ieder geval..

Die van mij geeft rev 4. (fab. week 9 2006) http://expand.xs4all.nl:88 (zo nu en dan online)

Dat bedoel ik .. De mijne is uit 2006, week 30.. Maakt verder ook niet uit, maar feit blijft dat die EREVID niet goed uitgelezen wordt. Hoe lees jij die uit? Ik doe dat zo:


uint8_t enc28j60getrev(void)
{
	return(enc28j60Read(EREVID));
}

Verder kan ik m dus gewoon pingen en kan ik een webpagina terugkrijgen (heb er nu gewoon een simpel tekstje instaan). Soms lijkt het alsof de ENC vastloopt, de atmega loopt dan nog wel (laat een tellertje printf'en naar de USART en die blijft lopen).. Als hij vastgelopen is, kan ik ook niet meer pingen.. Enig idee waarom?

Ik gebruikt Procyon AVRlib in combinatie met AVRGCC. Het TCP en HTTP deel heb ik zelf geschreven omdat Procyon alleen voorziet in IP en UDP. De enc28j60getrev implementatie van Procyon is overigens identiek aan die van jou.

Toen ik de ENC28J60 nog in een breadbordje had, had ik ook wel eens last van instabiliteitsproblemen. Nu zit die hele schakeling op een gaatjesprint. De AVR nog wel in een breadbord. En sindsdien is het stabiel.

Ok ik heb nog eens wat nader onderzoek gedaan want het werkt
nog steeds niet, hij 'hangt' soms.. Wat gebeurt er: na een paar keer refreshen geeft de browser een timeout, hierna kan er ook niet meer gepingd worden. Restart = opgelost. Continu pingen = geen probleem, blijft het gewoon doen. Toen maar een paar dingen uitgeprobeerd:

- printf in de while(1) met een tellertje blijft draaien, ook als we dus in de hangsituatie zitten. De ATmega128 draait dus nog.
- LED's aan en uit zetten in de while(1): ook dit blijft draaien. De SPI draait dus nog en de communicatie NAAR de ENC28J60 ook.
- printf in de interrupt subroutine

Blijft alleen de interrupt nog over lijkt me. Op de een of andere manier lijkt het erop dat de interrupt niet getriggerd wordt. Ik heb echter geen scoop dus kan het niet controleren. Heeft er iemand nog ideeën? Het geheel zit trouwens op een zelf ge-etste dubbelzijdige PCB.

Zou het iets met de buffers te maken kunnen hebben van de ECN28J60?

( Gokje, ik ben nog een enorme leek :p )

waar print je het register heen met printf?
kun je het niet naar een display sturen , of naar de uart?

Om het vastlopen te voorkomen kun je een kleiner pakketje zenden. Of het pakketje opsplitsen in meerdere sigmenten en via IP versturen. Probeer het maar eens met alleen de wachtwoord pagina.

Mzzl
Ipowere7