Atmega644 und enc28j60 Problem bei SPI-Verbindung

OP #2698426
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.
Angehängte Dateien:
Gast #2698448
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
OP #2698594
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
}
Gast #2698711
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
OP #2702177
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!
Angehängte Dateien:
Gast #2702209
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
Gast #2702307
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
#2702345
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ß.

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