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.
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
Ja so hatte ich es vor, oder habe ich da etwas falsch verstanden? Mfg Dennis
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
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 | } |
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.
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
Ist beim ATMega644 nicht PB6 MISO und PB5 MOSI? In Deiner geposteten Init-Routine steht es genau andersrum.
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) ;-)
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!
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
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.