Problem mit Wiz830MJ

Gast #1682715
Lesenswert?

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
void init_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:
1
void write_data_wiznet(int registers, int value) {
2
   DATA_L_DDR = 0xFF;   //setting as outputs
3
   
4
   ADDRESS_H |= getHighAddress(registers);
5
   ADDRESS_L = getLowAddress(registers);
6
   WIZ_CONFIG |=  RD;  // RD high setzen -> read disabled
7
   _delay_us(1);
8
   WIZ_CONFIG &= ~CS; // CS low setzen -> Wiznet enabled
9
   WIZ_CONFIG &= ~WR;  // WR low setzen -> write enabled
10
   DATA_L = value;
11
   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
Gast #1685360
Lesenswert?

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
#1685610
Lesenswert?

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
#1685637
Lesenswert?

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
#1685680
Lesenswert?

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
#1685710
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren