Atmega644 und enc28j60 Problem bei SPI-Verbindung

OP #2698426
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
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
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
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 #2698818
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) ;-)
OP #2702177
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
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
OP #2702285
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?
Gast #2702307
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.