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.
Bei einem MagJack mit integriertem Übertrager ist die Pin-Belegung anders als bei Std-RJ45-Buchsen. Suche hier im Forum, hatten wir schon mal.
Ich habe mir schon das Datenblatt von dem SI-40138 (MagJack) runtergeladen und danach die Buchse angeschlossen.
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
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.
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?
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
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.
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.
Ich werde bald eine Platine ätzen und hoffen, dass es dann besser geht. Der MagJack ist mit Fädeltechnik mit der Steckerleiste verbunden.
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
Leider hat das nicht viel gebracht, aber ich werde den Schaltplan noch ergänzen.
sowas funktioniert auf dem Steckbrett nicht, schon gar nicht auf einem von Conrad....
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
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.
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.
Steht der PC evtl fest auf 100MBit ? Der enc macht nur 10, also auf autosense stellen ;) Bye, Simon
Nein, das hat leider auch nichts geholfen. Muß ich vom Controller aus einen Link aufbauen?
Seh ich das richtig, dass kein Interrupt ausgelöst wird, wenn ein Packet empfangen wurde?
@ 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.
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
Das Programm soll nur auf ein Packet warten und daraufhin eine LED ein oder ausschalten. Nur leider geht es nicht. Hab ich irgendwas vergessen?
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
Entschuldigung, da ist was schiefgelaufen, daher noch mal die Initialisierung als Datei
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).
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
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.
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
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.
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?
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.
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?
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
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).
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
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.
Wenn ich TPOUT- mit TPIN- und TPOUT+ mit TPIN+ verbinde, baut der PC einen Link auf. Nur leider kann ich dann keine Daten empfangen.
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.
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.
Er müsste auch ohne Firewall einen Link aufbauen können. Es muss irgendwas Hardwaretechnisches sein.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.