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..
Anbei der Code des Treibers:
Danke und Gruß
Max
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..
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