hallo zusammen,
ich versuche gerade meinen ENC29J60 zum laufen zu bekommen. Als Hardware
steht ein Selbstbau mit üblicher Beschaltung zur Verfügung. Ich gehe mal
sehr stark davon aus, dass alles funktioniert.
Mein Problem: Der Chip überträgt nichts.
Wenn ich mir das Timing auf dem Oszi anschaue scheint der Master (µC)
einwandfrei Daten an den ENC zu schicken. Doch leider kommt von diesem
nichts zurück.
Als Treiber habe ich gängige Treiber von funktionierenden Projekten, wie
dem µWebserver benutzt und lediglich das Pining geändert. Da ich als CS
einen anderen Pin als SS benutze ziehe ich diesen zusaätzlich zum SS
auch auf low, falls der ENC kontaktiert werden soll.
Wenn ich mir die Debugmeldungen im Terminal ansehen, sehe ich, dass laut
ENC28J60 Daten empfangen wurden, aber uIP diese Weder IP noch ARP
zugeordnet werden können. Dies passiert alle 100 Zyklen, also immer wenn
die zweite If-Anweisung (tick) durchlaufen wurde und zum Start.
Woran könnte das liegen?
Hier noch die while-Schleife:
1 | while (1)
|
2 | {
|
3 | uip_len = Enc28j60Receive(uip_buf);
|
4 | //Process an incomming packet. (uIP Documentation S.47)
|
5 | if (uip_len > 0)
|
6 | {
|
7 | rs232_puts_P(eth_message_rcv);
|
8 | if (((struct uip_eth_hdr *)&uip_buf[0])->type
|
9 | == htons(UIP_ETHTYPE_IP))
|
10 | {
|
11 | rs232_puts("IP Anfrage");
|
12 | //uip_arp_ipin();
|
13 | uip_input();
|
14 | /* If the above function invocation resulted in data that
|
15 | should be sent out on the network, the global variable
|
16 | uip_len is set to a value > 0. */
|
17 | if (uip_len > 0)
|
18 | {
|
19 | uip_arp_out();
|
20 | Enc28j60Transmit(uip_buf, uip_len);
|
21 | }
|
22 |
|
23 | }
|
24 | else if (((struct uip_eth_hdr *)&uip_buf[0])->type
|
25 | == htons(UIP_ETHTYPE_ARP))
|
26 | {
|
27 | rs232_puts("ARP Anfrage");
|
28 | uip_arp_arpin();
|
29 | /* If the above function invocation resulted in data that
|
30 | should be sent out on the network, the global variable
|
31 | uip_len is set to a value > 0. */
|
32 | if (uip_len > 0)
|
33 | {
|
34 | Enc28j60Transmit(uip_buf, uip_len);
|
35 | }
|
36 | }
|
37 | rs232_puts("Kein IP oder ARP");
|
38 | }
|
39 |
|
40 | if (g_nFlags.fPeriodic)
|
41 | {
|
42 | rs232_puts("tick");
|
43 | cli();
|
44 | g_nFlags.fPeriodic = 0;
|
45 | sei();
|
46 | ///Periodic processing for a connection identified by its number.
|
47 | int i= UIP_CONNS;
|
48 | while (i)
|
49 | {
|
50 | i--;
|
51 | uip_periodic(i);
|
52 | if (uip_len > 0)
|
53 | {
|
54 | uip_arp_out();
|
55 | Enc28j60Transmit(uip_buf, uip_len);
|
56 | }
|
57 | }
|
58 | g_nPrescaler--;
|
59 | if (g_nPrescaler == 0)
|
60 | {
|
61 | //Every 10 seconds
|
62 | uip_arp_timer();
|
63 | g_nPrescaler = 100;
|
64 | }
|
65 | }
|
66 | }
|