Forum: Mikrocontroller und Digitale Elektronik ENC28J60 PC reagiert nicht


von Dirk (Gast)


Lesenswert?

Habe die Standardschaltung von Microchip aufgebaut mit einem MagJack.
Die eine LED ist so programmiert, dasss sie beim Senden oder Empfangen
blinkt. Die andere zeigt den Linkstatus an. Nur leider bleibt die LED
vom Linkstatus aus. Wenn ich eine ARP-Message sende, blingt die eine
für Senden. Nur jetzt werden keine weiteren Packete mehr verschickt.
Mach die Initialisierung wie im Datenblatt beschrieben.

von Profi (Gast)


Lesenswert?

Bei einem MagJack mit integriertem Übertrager ist die Pin-Belegung
anders als bei Std-RJ45-Buchsen. Suche hier im Forum, hatten wir schon
mal.

von Dirk (Gast)


Lesenswert?

Ich habe mir schon das Datenblatt von dem SI-40138 (MagJack)
runtergeladen und danach die Buchse angeschlossen.

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal der aktuelle Quelltext. überall wo im Quelltext ENC_ sind die
Register und Bits gemeint von dem Ethernet-Controller. Ich frage das
ENC_TXIF-Bit ab und weiss daher, das er Packete sendet. Nur leider
blinkt die LED nicht dazu. Ausserdem wird kein Link hergestellt
zwischen PC und Controller. Ich vermute, dass ich irgendwass bei der
Initialisierung vergessen habe

von Profi (Gast)


Lesenswert?

Auch ohne Initialisierung sind die Defaults so, dass die connect-LED
leuchtet, wenn die Buchse mit einer Gegenstelle passend (PC:
gedrehtes Kabel, Switch/Hub: gerades Kabel) verbunden ist.

Es liegt also an der Hardware.

von Dirk (Gast)


Lesenswert?

Anhand der Datenblätter dürfte es stimmen. Zurzeit ist die Schaltung auf
einem Steckbrett aufgebaut und ich benutze einen RBIAS von 2k statt 2k7.
Könnte dort der Fehler liegen?

von Ssss S. (sssssss)


Lesenswert?

Poste doch mal deine Schaltung. Ich hatte mal den Ferrit falsch
angeschlossen.
Im Datasheet genau hingucken, bei mir im acrobat sah auf 100% Zoom eine
Kreuzung wie eine verbindung mit Punkt aus... Erst bei >150% sah man es
:-X

Bye, Simon

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Okay, es lag an den zu langen Leitungen. Sobald ich den Router
anschließe, bekomme ich einen Link. Nur mit dem PC zu PC mit dem
gekreuzten Kabel ging es noch nicht. Die Schaltung ist im Anhang.

von Dirk (Gast)


Lesenswert?

Also, ein Router kann einen Link aufbauen (aber ein Interrupt wird
trotzdem nich ausgelöst obwohl ich das PHY-Register beachtet habe). Der
andere Router kann keinen Link aufbauen und der PC auch nicht.

von Profi (Gast)


Lesenswert?

Mach bitte mal ein Foto Deines Aufbaus.

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Ich werde bald eine Platine ätzen und hoffen, dass es dann besser geht.
Der MagJack ist mit Fädeltechnik mit der Steckerleiste verbunden.

von Ssss S. (sssssss)


Lesenswert?

Hi!

Pack mal an jeden (!) Versorgungsspannungspin nen 100nF gegen masse
hin.
Aber wirklich jeden, nicht zwei Vdd als einen interpretieren ;)
Ob es bei deinem speziellen Problem hilft kann ich nicht versprechen,
ohne ausreichende Cs
macht der aber mal gerne was er will ;)

Bye, Simon

von Ssss S. (sssssss)


Lesenswert?

dem avr auch immer einen verpassen ;)

von Schoasch (Gast)


Lesenswert?

Dem PIC eher ;-)

von Dirk (Gast)


Lesenswert?

Leider hat das nicht viel gebracht, aber ich werde den Schaltplan noch
ergänzen.

von crazy horse (Gast)


Lesenswert?

sowas funktioniert auf dem Steckbrett nicht, schon gar nicht auf einem
von Conrad....

von Ssss S. (sssssss)


Lesenswert?

Aber sicherlich funktioniert das aufm Steckbrett...
Mein Prototyp lief wochenlang auf nem Steckbrett und bei mir
war es sehr viel Chaotischer verkabelt (teils mit 10cm langen
Kabeln)...

Bye, Simon

von Dirk (Gast)


Lesenswert?

Platine ist schon fertig. Ich werde noch ein zweites Controllerboard
aufbauen und dann werden wir schon sehen wie es reagiert. Ich vermute
die Verkabelung unter dem MagJack mit Fädeldraht ist der Grund.

von Dirk (Gast)


Lesenswert?

So, neue Erkenntnis. Nachdem ich ein weiteres ENC28j60-Board aufgebaut
habe und mit einem gekreuzten Kabel die beiden Schaltungen verbunden
habe, kann ich sagen: Es war sofort ein Link da. Nur mein PC und der
zweite Router schaffen es nicht, einen Link herzustellen zum ENC28j60.
Als Spule habe ich dei SMCC von Reichelt drinnen.

von Ssss S. (sssssss)


Lesenswert?

Steht der PC evtl fest auf 100MBit ?
Der enc macht nur 10, also auf autosense stellen ;)

Bye, Simon

von Dirk (Gast)


Lesenswert?

Nein, das hat leider auch nichts geholfen. Muß ich vom Controller aus
einen Link aufbauen?

von Dirk (Gast)


Lesenswert?

Seh ich das richtig, dass kein Interrupt ausgelöst wird, wenn ein Packet
empfangen wurde?

von Dirk (Gast)


Lesenswert?

@ Simon
Was muss ich für den Empfang von Packeten Initialisieren. Senden kann
ich von einem ENC zum anderen ENC. Im Errata steht, dass man das
EPKTCNT lesen muss und dann vergleichen, ob es sich geändert hat. Nur
leider funktioniert das auch nicht.

von Ssss S. (sssssss)


Lesenswert?

Hi!
init:
1
#define ENC28J60_RX_BUFFER_START ((unsigned int)0x0000)
2
#define ENC28J60_RX_BUFFER_END   ((unsigned int)0x19FF)
3
#define ENC28J60_TX_BUFFER_START ((unsigned int)0x1A00)
4
#define ENC28J60_TX_BUFFER_LEN   ((unsigned int)0x0600)
5
#define ENC28J60_TX_BUFFER_END   ((unsigned int)0x1FFF)
6
7
  ENC28J60_REG_ETXSTL, lo8(ENC28J60_TX_BUFFER_START), //start lo
8
  ENC28J60_REG_ETXSTH, hi8(ENC28J60_TX_BUFFER_START), //start hi
9
  ENC28J60_REG_ETXNDL, lo8(ENC28J60_TX_BUFFER_END  ), //end lo
10
  ENC28J60_REG_ETXNDH, hi8(ENC28J60_TX_BUFFER_END  ), //end hi
11
  //rx buffer
12
  ENC28J60_REG_ERXSTL, lo8(ENC28J60_RX_BUFFER_START), //start lo
13
  ENC28J60_REG_ERXSTH, hi8(ENC28J60_RX_BUFFER_START), //start hi
14
  ENC28J60_REG_ERXNDL, lo8(ENC28J60_RX_BUFFER_END  ), //end lo
15
  ENC28J60_REG_ERXNDH, hi8(ENC28J60_RX_BUFFER_END  ), //end hi
16
  //rx ptr:
17
  //ENC28J60_REG_ERDPTL, lo8(ENC28J60_RX_BUFFER_START+1),
18
  //ENC28J60_REG_ERDPTH, hi8(ENC28J60_RX_BUFFER_START+1),
19
20
  //setup bank2: (see microchip datasheet p.36)
21
  //1.) clear the MARST bit in MACON2.
22
  ENC28J60_REG_MACON2,   0x00,
23
  //2.) mac rx enable, activate pause control frame support
24
  ENC28J60_REG_MACON1,
25
  ((1<<ENC28J60_BIT_MARXEN)|(1<<ENC28J60_BIT_RXPAUS)|(1<<ENC28J60_BIT_TXPAUS)),
26
  //3.) setup MACON3: auto padding of small packets, add crc, enable
27
frame length check:
28
  ENC28J60_REG_MACON3,
29
  ((1<<ENC28J60_BIT_PADCFG0)|(1<<ENC28J60_BIT_TXCRCEN)|(1<<ENC28J60_BIT_FRMLNEN)),
30
  //4.) dont set up MACON4 (use default)
31
  //5.) setup maximum framelenght to 1518:
32
  ENC28J60_REG_MAMXFLL, lo8(1518),
33
  ENC28J60_REG_MAMXFLH, hi8(1518),
34
  //6.) set up back-to-back gap: 0x15 for full duplex / 0x12 for half
35
duplex
36
  ENC28J60_REG_MABBIPG, 0x12, //half duplex
37
  //7.) setup non-back-to-back gap: use 0x12
38
  ENC28J60_REG_MAIPGL,   0x12,
39
  //8.) setup non-back-to-back gap high byte: 0x0C for half duplex:
40
  ENC28J60_REG_MAIPGH,   0x0C, //half duplex
41
  //9.) dont change MACLCON1+2 / MACLCON2 might be changed for networks
42
with long wires !
43
44
  //setup bank3:
45
  //10.) programm mac address: BYTE BACKWARD !
46
  ENC28J60_REG_MAADR5, NIC_MAC0,
47
  ENC28J60_REG_MAADR4, NIC_MAC1,
48
  ENC28J60_REG_MAADR3, NIC_MAC2,
49
  ENC28J60_REG_MAADR2, NIC_MAC3,
50
  ENC28J60_REG_MAADR1, NIC_MAC4,
51
  ENC28J60_REG_MAADR0, NIC_MAC5
52
  };
(der erste wert ist immer das zielregister, der zweite wert ist der
zuzuweisende wert)

senden:
1
//setup write pointer:
2
  enc28j60_write_address(ENC28J60_REG_EWRPTL,
3
(ENC28J60_TX_BUFFER_START&0xFF));
4
  enc28j60_write_address(ENC28J60_REG_EWRPTH,
5
(ENC28J60_TX_BUFFER_START)>>8);
6
  
7
  //set tx end pointer to [start+len]:
8
  enc28j60_write_address(ENC28J60_REG_ETXNDL,
9
(ENC28J60_TX_BUFFER_START+len)&0xFF);
10
  enc28j60_write_address(ENC28J60_REG_ETXNDH,
11
(ENC28J60_TX_BUFFER_START+len)>>8);
12
13
  //start buffer write command
14
  enc28j60_spi_write_word(ENC28J60_OP_WRITE_BUF_MEM, 0x00);
15
16
  //copy buffer to enc28j60:
17
  enc28j60_write_buffer(buffer, len);
18
19
  //bad silicon workaround:
20
  //reset tx logic:
21
  enc28j60_spi_write_word(ENC28J60_OP_BFS | ENC28J60_REG_ECON1,
22
(1<<ENC28J60_BIT_TXRST));
23
  enc28j60_spi_write_word(ENC28J60_OP_BFC | ENC28J60_REG_ECON1,
24
(1<<ENC28J60_BIT_TXRST));
25
26
  //activate transmission
27
  enc28j60_spi_write_word(ENC28J60_OP_BFS | ENC28J60_REG_ECON1,
28
(1<<ENC28J60_BIT_TXRTS)|(1<<ENC28J60_BIT_RXEN));

empfang:
1
  unsigned int rxstat;
2
  unsigned int len;
3
4
  //packet in buffer ?  
5
  if ((enc28j60_read_address(ENC28J60_REG_EIR) &
6
(1<<ENC28J60_BIT_PKTIF)) == 0){
7
    //double check!  
8
    //errata says that PKTIF does not work as it should 
9
    //->check packetcount too:
10
    if (enc28j60_read_address(ENC28J60_REG_EPKTCNT) == 0)
11
      return 0;
12
  }
13
14
  //set read pointer to next packet;
15
  enc28j60_write_address(ENC28J60_REG_ERDPTL,
16
(enc28j60_next_packet_ptr));
17
  enc28j60_write_address(ENC28J60_REG_ERDPTH,
18
(enc28j60_next_packet_ptr)>>8);
19
20
  //now read the transmit status vector
21
  //read next packet ptr
22
  enc28j60_next_packet_ptr  =
23
enc28j60_spi_read_byte(ENC28J60_OP_READ_BUF_MEM, 0);
24
  enc28j60_next_packet_ptr |=
25
enc28j60_spi_read_byte(ENC28J60_OP_READ_BUF_MEM, 0)<<8;
26
27
28
  //read packet length
29
  len  = enc28j60_spi_read_byte(ENC28J60_OP_READ_BUF_MEM, 0);
30
  len |= enc28j60_spi_read_byte(ENC28J60_OP_READ_BUF_MEM, 0)<<8;
31
  
32
  //read rx stat
33
  rxstat  = enc28j60_spi_read_byte(ENC28J60_OP_READ_BUF_MEM, 0);
34
  rxstat |= enc28j60_spi_read_byte(ENC28J60_OP_READ_BUF_MEM, 0)<<8;
35
36
  //limit read bytecount
37
  if (len>maxlen)
38
    len = maxlen;
39
40
  //tranfer packet from enc28j60 to our buffer
41
  enc28j60_read_buffer(buffer,len);
42
43
  //mark packet as processed (free mem)
44
45
  //ERRATA says we need to check packet pointer:
46
  if ((enc28j60_next_packet_ptr- 1 < ENC28J60_RX_BUFFER_START) ||
47
(enc28j60_next_packet_ptr- 1 > ENC28J60_RX_BUFFER_END)){
48
    enc28j60_write_address(ENC28J60_REG_ERXRDPTL,
49
lo8(ENC28J60_RX_BUFFER_END));
50
    enc28j60_write_address(ENC28J60_REG_ERXRDPTH,
51
hi8(ENC28J60_RX_BUFFER_END));
52
  }else{
53
    enc28j60_write_address(ENC28J60_REG_ERXRDPTL,
54
lo8(enc28j60_next_packet_ptr- 1));
55
    enc28j60_write_address(ENC28J60_REG_ERXRDPTH,
56
hi8(enc28j60_next_packet_ptr- 1));
57
  }
58
59
  //decrement packet counter:
60
  enc28j60_spi_write_word(ENC28J60_OP_BFS|ENC28J60_REG_ECON2,
61
(1<<ENC28J60_BIT_PKTDEC));
62
63
  //return length - <crc>
64
  return (len-4);

Bye, Simon

von As B. (b-a)


Lesenswert?

Danke. Ich hoffe das bringt mich weiter.

von As B. (b-a)


Angehängte Dateien:

Lesenswert?

Das Programm soll nur auf ein Packet warten und daraufhin eine LED ein
oder ausschalten. Nur leider geht es nicht. Hab ich irgendwas
vergessen?

von As B. (b-a)


Lesenswert?

RX_START und RX_END sind wie oben definiert. So sieht die
Initialisierung zum empfangen aus. Nur der EPKTCNT verändert sich
nicht, wenn ich ein Packet verschicke.

  bcf  SPI_PORT,CS            ENC_WCR  ENC_ERXSTL            call  send 
movlw  low
RX_START            call  send              movlw  high
RX_START            call  send              bsf  SPI_PORT,CS

  bcf  SPI_PORT,CS            ENC_WCR  ENC_ERXWRPTL            call 
send              movlw  low
RX_START            call  send              movlw  high
RX_START            call  send              bsf  SPI_PORT,CS
                  bcf  SPI_PORT,CS            ENC_WCR  ENC_ERXRDPTL 
call  send              movlw  low
RX_START+1            call  send              movlw  high
RX_START            call  send              bsf  SPI_PORT,CS

  bcf  SPI_PORT,CS            ENC_WCR  ENC_ERXNDL            call  send 
movlw  low
RX_END            call  send              movlw  high
RX_END            call  send              bsf  SPI_PORT,CS
  bcf  SPI_PORT,CS
  ENC_BFS  ENC_ECON1
  call  send
  movlw  (1<<ENC_RXEN)
  call  send
  bsf  SPI_PORT,CS

von As B. (b-a)


Angehängte Dateien:

Lesenswert?

Entschuldigung, da ist was schiefgelaufen, daher noch mal die
Initialisierung als Datei

von As B. (b-a)


Angehängte Dateien:

Lesenswert?

Ab und zu wird EPKTCNT inkrementiert. Aber nur von einem Packet was der
Controller selber abgeschickt hat. Ich erkenne jetzt einen Link und
schicke erst dann die Packete. Nur der Empfang haut nicht so ganz hin.
Die Schaltung habe ich schon überprüft. Der PC baut immer noch keinen
Link auf. Ein abgeschicktes Packte kommt nicht beim PC an (das Packet
geht über einen Switch).

von Ssss S. (sssssss)


Lesenswert?

Evtl stimmt die ziel mac adresse nicht ?
Wenns über nen Switch zum PC wird das paket dort evtl verworfen wenn
die mac nicht stimmt.

Drauf achten dass die enc quell mac richtig rum ist, ich meine man
musste sie drehen
010203ABCDEF -> EFCDAB030201

Bye, Simon

von As B. (b-a)


Lesenswert?

Also wenn die MAC 00-11-22-33-44-55 (So steht sie bei den
Netzwerkverbindungsdetails) ist muß ich 55-44-33-22-11 schicken?
Ich schätze ich benötige für den RBIAS doch einen 2,7k Widerstand.

von Ssss S. (sssssss)


Lesenswert?

nein, in den ethernet paketen musst du es normal lassen.
Nur bei der initialisierung der enc config musst du die mac des enc
drehen.

Rbias: da ging bei mir 2k und auch 2k7 ohne Probleme...

Bye, Simon

von As B. (b-a)


Lesenswert?

Okay, aber wenn ich ein Broadcast (FF-FF-FF-FF-FF-FF) schicke, muß er
trotzdem reagieren, da ich ERXFCON nicht verändere. Ich habe beide so
programmiert, dass die Packete, die kleiner 60 bytes sind aufgefüllt
werden und dann ein CRC angehängt wird. Für ARP schicke ich erst die
MAC-Destination dann die MAC-Source und dann den Type 0x0806 und dann
was mir Ethereal anzeigt (Halt nur angepasst). Nur der PC bekommt das
Pakte nicht. IP-Adresse hab ich vom PC angegeben.

von As B. (b-a)


Lesenswert?

Okay, der Empfang von einem ENC28j60 zum anderen ENC28j60 funktioniert.
Aber leider empfängt der ENC28j60 immer dass, was er selber gesendet
hat. Auf jedenfall wartet einer der beiden auf einen Empfang, bevor er
etwas sendet. Wie kann ich das Echo ausschalten?

von As B. (b-a)


Lesenswert?

So dass Echo habe ich ausgeschaltet, indem ich während ich etwas sende
einfach RXEN auf 0 setze. Nur ein Packet vom PC wird noch nicht erkannt
und der ENC28j60 reagiert dann nicht darauf.

von As B. (b-a)


Lesenswert?

Bin immer noch nicht weiter gekommen.
Verbinde ich 2 ENC28j60 (mit MagJack SI-40138) über ein gekreuztes
Kabel, kann ich Packete empfangen. Schließe ich nun ein ENC29j60 mit
MagJack an den PC an (über das gekreuzte Kabel), wird noch nichteinmal
ein Link aufgebaut (Der PC ist auf Automatische Erkennung eingestellt).
Schließe ich das Modul mit dem ENC28j60 an einen Router an (über ein 1:1
Kabel) wird zwar ein Link aufgebaut, aber ein Packet vom Router zum
ENC28j60 wird nicht erkannt. Desweiteren wenn ich etwas schicke, kommt
es auch nicht am PC an.
Wer kann mir helfen?

von Ssss S. (sssssss)


Angehängte Dateien:

Lesenswert?

vielleicht irgendein Systematischer Verkabelungsfehler ?
Sprich bei den beiden encs heben die sich auf und es geht, beim PC
klappts nicht...

Wär nur so eine idee...
Ich mein in der errata stand auch irgendwas vonwegen das irgendein
autosense nicht klappt und man evtl die tx oder rx  +/- leitungen
drehen sollte (irgendwie sowas)

Hab mir grad mal das pdf von deinem magjack angesehen.
Was ist das denn für eine komische Verkabelung ?
Da hängen 75ohm zwischen den Mittelabgriffen der Übertrager ?!

Hab dir mal nen screenshot von meiner Verkabelung mit normer RJ45
buchse und
Übertrager angehängt
(kannst du ja zum testen mal von ner alten isa Karte ablöten oder so)

Bye, Simon

von As B. (b-a)


Lesenswert?

Gestern kam ein neues Errata B5 raus, aber für mich gilt B4 (laut
EREVID).
Der ENC28j60 soll laut Datenblatt eine falsche Verkabelung der TPIN+
und TPIN- Anschlüsse feststellen können. Im Errata heißt es nur, dass
dieses Modul nicht funktioniert und man selber darauf achten muß.
Im neuen Datenblatt sind diese 75 Ohm Widerstände eingezeichnet.
Als Ferrit Beat habe ich einfach eine Festinduktivität von Reichelt
genommen (SMCC 47).

von Ssss S. (sssssss)


Lesenswert?

TPIN+/-: ja genau, ich meinte das so dass du mal checkst ob du die
richtig verkabelt hast.

Errata: ist diesmal was neues drin ? B1 und B4 waren ja exakt (?)
gleich :-X

neues Datenblatt: Interessant, das kannte ich noch gar nicht :)

Ich hab leider auch keine ideen mehr woran es liegen könnte :-\

Bye, Simon

von As B. (b-a)


Lesenswert?

Zum Errata:
Der Interrupt PKTIF geht immer noch nicht. Der RBIAS ändert sich
wieder. Und es gibt immer noch insgesamt 13 Punkte.
Am besten selber reinschaun.

Ich werde mir in den nächste zwei Wochen mal eine Platine ätzen und das
ganze dann darauf aufbauen. Vielleicht liegt es an der
Blankdrahtverdrahtung des MagJack zum Steckboard.
Bevor das mit dem PC nicht funktioniert, kann ich eh nicht weiter den
TCP-Stack machen.
Auf ARP und ICMP wird schon geantwortet.

von As B. (b-a)


Lesenswert?

Wenn ich TPOUT- mit TPIN- und TPOUT+ mit TPIN+ verbinde, baut der PC
einen Link auf. Nur leider kann ich dann keine Daten empfangen.

von Dirk (Gast)


Lesenswert?

Ich habe jetzt ein Platine aufgebaut und es entsteht immer noch kein
Link zwischen PC und Platine. Aber Zwischen zwei Platinen entsteht ein
Link und ich kann Daten verschicken. Was mache ich falsch?
Ich habe den MagJack SI-40138. Verbinde ich TPOUT- mit TPIN- und TPOUT+
mit TPIN+ baut der PC einen Link auf.

von Thomas B. (thomasb)


Lesenswert?

Hast du vielleicht eine Firewall an deinem PC laufen ?
Ich falle da immer wieder drauf rein - hatte ich erst vor ein paar
Tagen, dass mein PC eine Verbindung von meiner Hardware ohne
irgendeiner Meldung von der Firewall verweigerte (obwohl an sich im
Lernmodus); hatte mich gewundert wieso da keine Pakete im Etherreal
ankommen. Firewall händisch nachkonfiguriert und lief wieder.

von Dirk (Gast)


Lesenswert?

Er müsste auch ohne Firewall einen Link aufbauen können. Es muss
irgendwas Hardwaretechnisches sein.

von As B. (b-a)


Lesenswert?

So, da ich in diesem Forum den Tipp bekommen habe, dass die 
Kondensatoren raus sollten, bin ich schon weiter. ARP, ICMP und ein 
TCP-Aufbau funktioniert schon.

von Dirk (Gast)


Lesenswert?

Ich habe mir ein Modul geätzt mit einem ENC28j60 als DIP und Leitungen 
für ein Steckboard. Alles hat funktioniert und ich konnte die Software 
entwickeln.
Jetzt habe ich mir ein Modul mit einem PIC geätzt, damit ich wegen der 
Verbindungsleitungen kein Problem bekomme. Der ENC28j60 ist hier ein SO 
Type.
Jetzt sendet das Modul allerdings nicht, der PIC kann aber mit dem Modul 
kommunizieren. Beide haben die REV. 5.
Wo könnte das Problem liegen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.