Forum: Mikrocontroller und Digitale Elektronik Atmega644 und enc28j60 Problem bei SPI-Verbindung


von Dennis K. (dennisk)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin sozusagen neu auf dem Themengebiet der Atmel-Programmierung, 
also habt bitte Nachsicht.

Verwendete Soft-/Hardware:
- Atmega644A (ext. clock 16MHz)
- enc28j60 (anzusprechen über SPI)
- AtmelStudio 6


Gewünscht ist erst einmal eine Verbidnung zwischen Atmega und enc28j60 
über SPI herzustellen.
Mit dem 8-bit Timer des Atmega möchte ich die Clock für die SPI-Einheit 
generieren.
Hierzu nutze ich den 'Clear Timer on Compare Match' mode.
In der damit getriggerten Interrupt-Service-Routine toggle ich dann den 
entsprechenden Ausgangspin (clock für SPI).

Soweit tut auch alles (mit Oszi überprüft).

Sobald ich aber nun meine SPI-Einheit initialisiere - genauer, das 
Registerbit SPE=1 setze - verschwindet mein clock signal.

Ich werde daraus nicht schlau. Meinen Code habe ich angehängt.

Eine Vermutung von mir: Der pin B3 (OC0A) liegt bei mir eigentlich auf 
dem reset des enc28j60. Allerdings benutze ich ihn nicht im counter. 
Führt das zu Problemen?

Wäre super wenn mir jemand weiterhelfen könnte, das Problem treibt mich 
noch in den Wahnsinn.

von spess53 (Gast)


Lesenswert?

Hi

>Mit dem 8-bit Timer des Atmega möchte ich die Clock für die SPI-Einheit
>generieren.

Den Takt für das SPI des ATMega644?

MfG Spess

von Dennis K. (dennisk)


Lesenswert?

Ja so hatte ich es vor, oder habe ich da etwas falsch verstanden?

Mfg
Dennis

von spess53 (Gast)


Lesenswert?

Hi

>Ja so hatte ich es vor, oder habe ich da etwas falsch verstanden?

Ja. PB7 ist der Clock vom SPI, der von der SPI-Einheit selbst erzeugt 
wird.
Wenn du mit SPE das SPI einschaltest hast du keine Portfunktion mehr.

Du brauchr dich um die Takterzeugung überhaupt nicht selbst kümmern, das 
übernimmt das SPI.

MfG Spess

von Dennis K. (dennisk)


Lesenswert?

Vielen Dank, jetzt kann ich immerhin schon einmal etwas senden.

Wenn ich nun versuche das ESTAT Register des enc28j80 auszulesen, um zu 
prüfen ob die clock eingeschwungen ist, kann ich das ganze senden, 
bekomme aber als Antwort NIE ein CLKRDY bekomme.

Hier mein code:
1
while ((Enc28j60ReadReg(BANKX_ESTAT) & (1<<BANKX_ESTAT_CLKRDY)) == 0)
2
  { NOP();}
3
4
uint8_t Enc28j60ReadReg(uint8_t nRegister)
5
{
6
  uint8_t nByte;
7
  
8
  PORTB &= ~(1<<PINB4); //SELECT();
9
  ENC28J60_SPIWRITEBYTE(0x1D);     
10
  nByte = ENC28J60_SPIREADBYTE();
11
  PORTB |= (1<<PINB4);  //DESELECT();
12
  
13
  return nByte;
14
}

von Dennis K. (dennisk)


Lesenswert?

Nachtrag: Das Senden von Nachrichten funktioniert doch noch nicht. Ich 
habe meinen MOSI port nun mit einem Oszi beobachtet und leider ist der 
port dauerthaft auf 0V, abgesehen von kleinen Störungen von der clock.

von spess53 (Gast)


Lesenswert?

Hi

>Ich
>habe meinen MOSI port nun mit einem Oszi beobachtet und leider ist der
>port dauerthaft auf 0V, abgesehen von kleinen Störungen von der clock.

DDRB für die SPI-Pins richtig eingestellt?

SS-Pin als Ausgang oder auf H?

MfG Spess

von J.-u. G. (juwe)


Lesenswert?

Ist beim ATMega644 nicht PB6 MISO und PB5 MOSI? In Deiner geposteten 
Init-Routine steht es genau andersrum.

von Dennis K. (dennisk)


Lesenswert?

Danke für die schnellen Antworten!

Tatsächlich waren der MISO und MOSI port schon in der Hardware 
vertauscht.

Also,zur vorhanden Hardware eigentlich richtig initialisiert, was aber 
natürlich trotzdem nicht funktioniert hat (da Hardware falsch) ;-)

von Dennis K. (dennisk)


Angehängte Dateien:

Lesenswert?

So, das Senden funktioniert nun, leider habe ich immernoch Probleme.

Zum Ablauf (auslesen des ESTAT Registers des enc28j60):
- das CS wird 0
- MOSI sendet 0x1D
- clk gibt Takt für 8 Sende-bits

Anschließend möchte ich dann natürlich auch den Wert des Registers 
lesen.
Wenn ich das Datenblatt richtig verstanden habe, müsste dieser 
automatisch gesendet werden, sofern die clk weiterläuft. Richtig?

Leider läuft das clk-Signal der PSI nicht weiter (mit Oszi beobachtet), 
obwohl ich versuche das SPDR register auszulesen.

Funktionen und Initialisierungen sind im file im Anhang.

Danke für eure Hilfe!

von spess53 (Gast)


Lesenswert?

Hi

>Leider läuft das clk-Signal der PSI nicht weiter (mit Oszi beobachtet),
>obwohl ich versuche das SPDR register auszulesen.

Um das ENC-Register auszulesen musst du noch ein Dummy-Byte senden. Erst 
danach kannst du SPDR lesen.

MfG Spess

von Dennis K. (dennisk)


Lesenswert?

Danke für die schnelle Antwort Spess53. Habe nun versucht ein Dummy-byte 
mit 0x00 nach bzw. vor meinem Daten-Byte zu senden (alles klar erkennbar 
auf dem Oszi) und dann auf eine Antwort zu warten. Leider passiert 
nichts.

Hat noch jemand eine Idee?

von spess53 (Gast)


Lesenswert?

Hi

>Danke für die schnelle Antwort Spess53. Habe nun versucht ein Dummy-byte
>mit 0x00 nach bzw. vor meinem Daten-Byte zu senden (alles klar erkennbar
>auf dem Oszi) und dann auf eine Antwort zu warten. Leider passiert
>nichts.

Wie warten? Du sendest das Dummy-Byte ab und wartest dann bis in SPSR 
das SPIF-Bit wieder gesetzt ist. Danach liest du SPDR aus. Fertig.

MfG Spess

von J.-u. G. (juwe)


Lesenswert?

Dennis K. schrieb:
> Leider läuft das clk-Signal der PSI nicht weiter (mit Oszi beobachtet),
> obwohl ich versuche das SPDR register auszulesen.

Um ein clk-Takt zu erzeugen musst Du das SPDR beschreiben und nicht 
auslesen. Also, wie von Spess vorgeschlagen:
1. dummy-byte ins SPDR schreiben (es werden dann automatisch 8 ckl-Takte 
erzeugt)
2. warten bis SPIF gestzt ist.
3. jetzt kann die Antwort des ENC aus dem SPDR ausgelesen werden.

Gemäß Seite 27 des Datenblatts, benötigt der ENC für einige Register 
mehr Zeit, so dass ein zusätzliches Dummy-byte gesendet werden muß.

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.