Forum: Mikrocontroller und Digitale Elektronik Problem mit Wiz830MJ


von asdf (Gast)


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

von Thomas S. (klegom)


Lesenswert?

Ich habe den Beispielcode von Wiznet verwendet, das hat mir geholfen. 
Der Code findet sich hier: 
http://www.wiznet.co.kr/UpLoad_Files/ReferenceFiles/W5300_Drv_V1.2.1.zip

von asdffdsa (Gast)


Lesenswert?

Hallo

Super danke ich werde mir das gleich mal anschauen!!

mfg

von Thomas S. (klegom)


Lesenswert?

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?

von asdffdsa (Gast)


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

von asdffdsa (Gast)


Lesenswert?

Aja und einen EEprom (I2C) möchte ich auch an den Atmega anschließen.

von Daniel H. (dewy)


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

von Thomas S. (klegom)


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

von Daniel H. (dewy)


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

von Thomas S. (klegom)


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.

von Daniel H. (dewy)


Lesenswert?

Jaaa alles klar jetzt verstehe ich was du meinst. Aber der Atmega32 hat 
soetwas leider nicht.

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.