C Verzweiflung mit SPI - ATxmega128A1 -XplainedA1

maxberbeuth

Neues Mitglied
02. Juni 2014
2
0
0
Sprachen
Hallo Zusammen,

ich sitze seit ca 2 Wochen daran den SPI (PortF) meines Xplained A1-Boards mit einem ATxmega128A1 zum laufen zu bekommen.

Der eigentliche Sinn ist, dass ich über SPI ein Ethernetmodul (ENC28J60) ansprechen will. Jedoch, bis ich dies anstecke wollte ich zunächst erstmal
Sehen, dass die CLK usw funktionieren und habe deswegen direkt ein Oszilloskop am SCLK Pin des Port F.

Nun war meine Hoffnung, dass, sofern der SPI-Port richtig konfiguriert, ich gelegentlich Taktflanken sehe.
in der main wird letztlich nur 1 Byte in einer Endlosschleife ins DATA-Register geschrieben.

Zunächst wäre es sehr Hilfreich wenn mal jemand über meine Initialisierungsseqeuenz schauen kann.
Ich selbst habe es mir vielen Quellen abgeglichen und zunächst keinen Fehler gefunden. Da meine Codequellen,
meist jedoch ursprünglich für andere (PORTs und Boards) waren.. vllt hab ich etwas übersehen..:rolleyes:

Anbei der Code des Treibers:

Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "atx_spid_treiber.h"

#define SPIF_USEINT       // Interrupt ein
#define SpiF_Busy()          while(!(SPIF.STATUS & (1<<SPI_IF_bp)))

volatile uint8_t spiFTransferComplete;

// SPI interrupt service handler
#ifdef SPIF_USEINT
ISR(SPIF_INT_vect)  //ISR(SPIF_INT_vect)
{
	PORTE_OUT=0x0F;
	spiFTransferComplete = 1;
	
}
#endif


//********************
//#include "tools.h"

//*----------------------------------------------------------------------------
// SPI-Bus ADT7301 SOT-23 Pin Configuration
//*----------------------------------------------------------------------------
//													
#define SPIF_CS      4   // PD4 (Pin 24)  	->   	PIN 5 
#define SPIF_MOSI    5   // PD5 (Pin 25) 	->		PIN 2
#define SPIF_MISO    6   // PD6 (Pin 26) 	-> 		PIN 6
#define SPIF_SCK     7   // PD7 (Pin 27) 	->		PIN 4

void spiFPort_Init(void)
{
	// === PORT-F CONFIG ===
	PORTF_DIRSET  = (1 << SPIF_MOSI) | (1 << SPIF_SCK)  | (1 << SPIF_CS);
	PORTF_DIRCLR  = (1 << SPIF_MISO);    
	PORTF_OUTSET = 	(1 << SPIF_CS);	   //SS/CS high
}


// access routines
void spiFInit()
{
	spiFPort_Init();           
	
	//max Spi-Takt 16 Mhz
	SPIF.CTRL =  SPI_MODE_0_gc | SPI_PRESCALER_DIV4_gc  | (1<< SPI_CLK2X_bp) | (1<< SPI_ENABLE_bp) | (1<< SPI_MASTER_bp);
		
    SPIF.STATUS = 0;

	spiFTransferComplete = 1;

	// enable SPI interrupt
	#ifdef SPIF_USEINT
	SPIF.INTCTRL = SPI_INTLVL_MED_gc;
	PORTF.INTCTRL |= PORT_INT0LVL_LO_gc;
	#endif
}

void spiFSendByte(uint8_t data)
{
	// send a byte over SPI and ignore reply
	#ifdef SPIF_USEINT
		while(!spiFTransferComplete);
		spiFTransferComplete = 0;
	#else
		SpiF_Busy();
	#endif
	
	SPIF_DATA=data;
}


Danke und Gruß

Max
 
Hallo Max,

willkommen im AVR-PRAXiS Forum. :)

Du nutzt ja Interrupts, sind diese denn auch global freigegeben? Für SPI nutzt du Med Level Group Interrupt und du hast einen Ext0 Low Level Group Interrupt...

Code:
PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm; // Med Level und Low Level Interrupts aktivieren.
sei();

Ich würde zunächst einfach einmal ohne SPI Interrupt probieren (also SPI_IF pollen) und aus einem Register des Ethernetmoduls einen definierten Wert lesen, um die Schnittstelle zu testen.

Dirk :ciao:
 
Danke für deine schnelle Antwort!

Ja.. Du hast natürlich Recht sei() hatte ich drin, allerdings nicht "PMIC. ..." .

Und siehe da.. Mein TAKTSIGNAAAL... SUPER! DANKE!:D

Jetzt kann ich auch getrost das Etherboard ausprobieren!:cool:

Gruß

Max:dance3:
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)