Hallo
Ich möchte mit einem Atmega32L und dem Wiz830mj Modul einen Webserver
bauen. Es gibt im Netz sehr viel Informationen die mir auch schon sehr
viel weitergeholfen haben. Doch leider will es noch nicht so wie ich mir
das vorstelle.
Mein erstes Ziel ist es mein Board mit dem Wiznet Modul pingen zu
können.
Ich habe folgenden Code zur Initialisierung (Ich denke der müsste soweit
in Ordnung sein):
1
voidinit_wiznet(){
2
// Hardware reset
3
WIZ_CONFIG|=RESET;
4
_delay_ms(10);
5
WIZ_CONFIG&=~RESET;
6
_delay_us(30);
7
WIZ_CONFIG|=RESET;
8
_delay_us(30);
9
// register reset
10
write_data_wiznet(MR0,0x80);
11
write_data_wiznet(MR1,0x00);
12
//Set gateway IP address
13
write_data_wiznet(GAR0,192);
14
write_data_wiznet(GAR1,168);
15
write_data_wiznet(GAR2,0);
16
write_data_wiznet(GAR3,254);
17
//Set Subnet mask
18
write_data_wiznet(SUBR0,255);
19
write_data_wiznet(SUBR1,255);
20
write_data_wiznet(SUBR2,255);
21
write_data_wiznet(SUBR3,0);
22
//Set MAC address
23
write_data_wiznet(SHAR0,0x00);
24
write_data_wiznet(SHAR1,0x10);
25
write_data_wiznet(SHAR2,0x20);
26
write_data_wiznet(SHAR3,0x30);
27
write_data_wiznet(SHAR4,0x40);
28
write_data_wiznet(SHAR5,0x50);
29
//Set own IP address
30
write_data_wiznet(SIPR0,192);
31
write_data_wiznet(SIPR1,168);
32
write_data_wiznet(SIPR2,0);
33
write_data_wiznet(SIPR3,73);
34
}
Ich denke das der Fehler schon bei der write_data_wiznet Funktion liegt.
Hier der Code:
WIZ_CONFIG|=CS;// CS high setzen -> Wiznet disabled
12
WIZ_CONFIG|=WR;// WR high setzen -> write disabled
13
_delay_us(1);
14
}
15
//Hier die defines
16
#define WIZ_CONFIG PORTD
17
#define RD _BV(PD2)
18
#define CS _BV(PD3)
19
#define RESET _BV(PD4)
20
#define WR _BV(PD5)
21
22
#define DATA_L PORTA
23
#define DATA_L_DDR DDRA
24
25
#define ADDRESS_L PORTC
26
#define ADDRESS_H PORTD
27
#define ADDRESS_L_DDR DDRC
28
#define ADDRESS_H_DDR DDRD
Für die Registernamen habe ich die Adressen aus dem Datenblatt genommen.
Immer wenn ich den Ping Befehl ausführe kommt die Meldung das die
Datenpakete nicht erfolgreich gesendet werden konnten.
Was habe ich falsch gemacht???
Hoffe mir kann jemand weiterhelfen!!
mfg
Wenn es Dich interessiert, kann ich Dir auch meinen Code schicken. Er
implementiert:
- Flash file System (primitive Variante)
- eeprom Anbindung (wegen Konfiguration)
- Webserver mit CGI
- DHCP
Was genau hast Du vor?
Ja das wäre sehr nett.
Primärziel ist einfach mal eine Verbindung zwischen PC und Board
herzustellen (Im CMD mit ping Befehl)
Wenn das mal funktioniert möchte ich Messdaten in den Controller
einlesen, die ich dann vom PC aus über den Browser abrufen kann.
Später soll dann auch vom Browser aus zum Beispiel eine LED ein bzw
ausgeschalten werden.
zu dem Bespielcode: Ich habe den Code jetzt mal grob überflogen aber ich
verstehe nicht ganz wie der die Daten vom Controller zum W5300 schickt.
Da sind ja nirgends Ports oder dergleichen definiert? oder hab ich etwas
übersehen?
Ich sehe wie jedes Register definiert wird und jedes einzelne Bit der
jeweiligen Register.
In der init Funktion wird zwar ein Softwarereset durchgeführt aber der
muss ja die Daten und die Adressen mit einem bestimmten Timing (steht im
Datenblatt vom W5300) über irgendwelche Ports vom Controller (in meinem
Fall zB Atmega32) zum W5300 bringen. Oder stehe ich da jetzt grad auf
der Leitung??
mfg
Hallo
so habe mich da jetzt mal angemeldet.
Ich bin gerade dabei den Beispielcode durchzugehen. Mich verwirrt ein
bisschen die Addressvergabe für die Register des W5300.
Es wird das Register MR (_DEF_IINCHIP_MAP_BASE_) mit dem Wert
0x08000000 definiert aber laut Datenblatt sollte das Register doch mit
dem Wert 0x08000 definiert werden oder??
Danke schon im Voraus
mfg
Daniel H. schrieb:> Es wird das Register MR (DEF_IINCHIP_MAP_BASE) mit dem Wert> 0x08000000 definiert aber laut Datenblatt sollte das Register doch mit> dem Wert 0x08000 definiert werden oder??
Wie hast Du den Chip denn angebunden? An den Adressbus? Wenn ja, dann
liegt er ja in einem bestimmten Adressbereich und nicht notwendigerweise
auf Adresse 0. Diese Adresse muss ja als Offset irgendwo definiert
werden.
Des weiteren habe ich nicht genau den gleichen Chip benutzt, wie Du. Ich
habe den W5100 im Einsatz
Ich verstehe jetzt nicht ganz was du meinst??
Das Wiz830mj hat 2 Steckerleisten(jeweils 2 20polige Stecker). Da gibt
es 10 Pins für den Adressbus und 8/16 Pins für den Datenbus. (ich
verwende nur den 8bit breiten Daten Bus). So diesen Datenbus habe ich an
den PortA des Atmega gelegt. Den 10 poligen Adressbus auf den PortC und
B.
So jetzt verstehe ich das Datenblatt folgendermaßen:
Wenn ich einen Wert in das Mode Register MR0 senden will, dann muss ich
über den Adressbus die Adresse des MR0 Registers (laut Datenblatt
0x08000) zum W5300 senden. Jetzt weiß der W5300 das ich einen WErt in
das MR0 Register senden will. ALso sende ich über den Datenbus die Daten
zum W5300.
Jetzt verstehe ich aber nicht wie der in dem Beispielcode das macht??
Im Datenblatt auf der Seite 120 sieht man das Timing Diagramm, wann man
welche Steuerpin (CS,WR,RD,RESET) schalten muss, damit der die Adresse
bzw die Daten von den jeweiligen Bus richtig einliest. Ich denke das der
Fehler irgendwo liegt.
mfg
Möglicherweise geht das auch so. Aber richtiger ist, den externen
Adress- und Datenbus des Prozessors dazu zu benutzen. Ich weiß nicht, ob
Dein Prozessor so etwas hat, aber ich habe einen atMega128 verwendet,
und der hat so etwas.
Dann liegt der Wiznet im Adressraum des Prozessors und Du kannst auf die
Register genauso zugreifen, wie auf den internen Speicher des
Prozessors.
Das wird dann auch vernünftig schnell. Wenn Du das quasi "zu Fuß" mit
Port Zugriffen "rausklickern" willst, dann dauert das ja ewig.