Hallo zusammen
ich habe vor einer Woche das AVR-NET-IO-Board von Pollin bekommen und jetzt angefangen mit der Programmierung des µC für eigene Zwecke. Allerdings scheitert es schon an der Kommunikation zwischen dem Atmega32 und dem ENC28J60. Wenn ich versuche über SPI einen Befehl an den ENC28J60 zu senden stehen permanent falsche Werte im Register SPDR.
Eigentlich versuche ich nur das Regster ECON1 auszulesen.
Der Atmega wird mit folgenden Werten initialisiert:
und die aufgerufenen ENC-Funktionen sehen wie folgt aus:
In der Main-Funktion erfolgt dann der Aufruf
Der Code stammt übrigens von triplay.de. Die Zeile die mir jetzt Probleme bereitet ist das Bitweise ODER von ENCMD_RRCR und reg. Eigentlich sollte 0x1F rauskommen aber in SPDR steht 0xFF (laut Ausgabe auf den COM-Port) oder 0x00 laut AVRStudio drin.
Entferne ich den ENC klappt es und die richten Werte stehen drin. Hat vlt. jemand eine Idee wieso, weshalb oder warum der Wert nicht in das Register übernommen wird?
ich habe vor einer Woche das AVR-NET-IO-Board von Pollin bekommen und jetzt angefangen mit der Programmierung des µC für eigene Zwecke. Allerdings scheitert es schon an der Kommunikation zwischen dem Atmega32 und dem ENC28J60. Wenn ich versuche über SPI einen Befehl an den ENC28J60 zu senden stehen permanent falsche Werte im Register SPDR.
Eigentlich versuche ich nur das Regster ECON1 auszulesen.
Der Atmega wird mit folgenden Werten initialisiert:
Code:
PORTB = 0x00;
DDRB = 0xB0;
SPCR = 0x50;
SPDR = 0x00;
und die aufgerufenen ENC-Funktionen sehen wie folgt aus:
Code:
void enc_start(){
ENC_CSPORT = (1<<ENC_CSPIN); // ENC_CSPIN = 4
}
void enc_stop(){
ENC_CSPORT = (0<<ENC_CSPIN); // ENC_CSPIN = 4
}
unsigned char enc_rcr(unsigned char reg, unsigned char method) {
enc_start();
SPDR = ENCMD_RRCR | reg; // 0x00 | 0x1F -> 0x1F
while(!(SPSR & (1 << SPIF)));
SPDR = 0;
while(!(SPSR & (1 << SPIF)));
if(method) { // zum lesen von PHY-Registern
SPDR = 0;
while(!(SPSR & (1 << SPIF)));
}
enc_stop();
return(SPDR);
}
In der Main-Funktion erfolgt dann der Aufruf
Code:
unsigned char reg_econ1;
reg_econ1 = enc_rcr(ECON1, 0); // ECON1 = 0x1f;
Der Code stammt übrigens von triplay.de. Die Zeile die mir jetzt Probleme bereitet ist das Bitweise ODER von ENCMD_RRCR und reg. Eigentlich sollte 0x1F rauskommen aber in SPDR steht 0xFF (laut Ausgabe auf den COM-Port) oder 0x00 laut AVRStudio drin.
Entferne ich den ENC klappt es und die richten Werte stehen drin. Hat vlt. jemand eine Idee wieso, weshalb oder warum der Wert nicht in das Register übernommen wird?