SPI

SPI Slave

Funktion

Das SPI Slave-Modul bietet die Möglichkeit, mit einem SPI Master zu kommunizieren. Die Parameter CPOL und CPHA können frei programmiert werden. Ist das SPI Enable-Bit gesetzt, reagiert das Modul auf vom Master ausgelöste Datenübertragungen. Nach dem Beenden der Übertragung kann das Modul ein Interruptsignal auslösen. Das Signal wird zurückgesetzt durch einen Zugriff auf eines der Datenregister. Wird das Register mit den empfangenen Daten nicht vor dem Eintreffen des nächsten Datenwortes gelesen, wird es überschrieben.

Register

OffsetRegisterFunktionZugriff
0SPI_S_CTRLSteuerregisterread/write
1SPI_S_DATOSendedatenread/write
2SPI_S_DATIempfangene Datenread
3SPI_S_STATStatusbits des Interfaceread

Das Steuerregister SPI_S_CTRL enthält alle zur Steuerung der Funktionen des SPI Slaves nötigen Bits. Bei einem Reset werden alle Bits mit Null initialisiert bis auf die Bitanzahl. Die Bitanzahl wird auf 8 gesetzt. Auf das Register kann lesend und schreibend zugegriffen werden.

In das Datenregister SPI_S_DATO wird das zu sendende Datenwort geschrieben. Bei einem Reset werden alle Bits mit Null initialisiert. Auf das Register kann lesend und schreibend zugegriffen werden.

Das Datenregister SPI_S_DATI enthält das empfangene Datenwort. Bei einem Reset werden alle Bits mit Null initialisiert. Auf das Register kann nur lesend zugegriffen werden.

Das Statusregister SPI_S_STAT enthält alle Bereitschafts- und Besetzt-Signale. Auf das Register kann nur lesend zugegriffen werden.

SPI_CTRLFunktionReset
Bit 0: SPI enable: 0 = disable, 1 = enable0
Bit 1: Int enable: 0 = disable, 1 = enable0
Bit 2: cpol: cpol stellt den Idle-Pegel des Taktsignals ein0
Bit 3: cpha: 0 = Flanke von activ zu idle, 1 = Flanke von idle zu activ0
Bit 4 bis 7: nicht benutzt
Bit 8 bis 12: Bit Anzahl 01000
00001: 1 Bit
00010: 2 Bit
00011: 3 Bit
00100: 4 Bit
00101: 5 Bit
00110: 6 Bit
00111: 7 Bit
01000: 8 Bit
01001: 9 Bit
01010: 10 Bit
01011: 11 Bit
01100: 12 Bit
01101: 13 Bit
01110: 14 Bit
01111: 15 Bit
10000: 16 Bit
10001: 17 Bit
10010: 18 Bit
Bit 13 bis 17: nicht benutzt


SPI_STATFunktion
Bit 0: done ist 0 solange wie Daten empfangen werden
Bit 1: Interrupt Flag

Konfiguration und Instanziierung

Die Interruptleitung des Moduls muss an den gewünschten Eingang des Interruptkontrollers angeschlossen werden, die Input-Pins für MOSI, Slave-Select und SCLK an den Eingang des Top Level Moduls sowie der Pin für MISO an den Ausgang. Die Ports des Top Level Moduls müssen dann noch den Pins des FPGA im jConfig zugeordnet werden.

1. #include <spi.h>

... muss in der C-Quelle geladen werden, wenn man die Funktionen verwenden will.
#ifndef __SPI_H
#define __SPI_H

#include <peripherals/spi_master.h>
#include <peripherals/spi_slave.h>

// the following lines is kept for compatibility with older projects and
// may be removed in the future 

// master and slave regs are identical, so we just pick one to emulate the
// old spi_t type
typedef spi_slave_regs_t spi_t;

// end compatibility section

#include <bitmagic.h>

unsigned int spi_slave_read(spi_t *spi);
unsigned int spi_slave_readwrite(spi_t *spi, unsigned int data);
unsigned int spi_readwrite(spi_t *spi, unsigned int data);
void spi_write(spi_t *spi, unsigned int data);
void spi_activate(spi_t *spi,unsigned int device);
void spi_deactivate(spi_t *spi);
void spi_enable(spi_t *spi);     
void spi_disable(spi_t *spi);     
void spi_enable_irq(spi_t *spi);     
void spi_disable_irq(spi_t *spi);     
void spi_set_cpol(spi_t *spi, unsigned int cpol);     
void spi_set_cpah(spi_t *spi, unsigned int cpah);     
int  spi_set_bitcnt(spi_t *spi, unsigned int bitcnt);
void spi_set_div(spi_t *spi, unsigned int div);

#endif

2. #include <periperals/spi-slave.h>

... wird immer automatisch vom SpartanMC System geladen. Der Include muss nicht in der C-Quelle erfolgen.
#ifndef __SPI_SLAVE_H
#define __SPI_SLAVE_H

//Control register
#define SPI_SLAVE_CTRL_EN           0x00001  // 00 0000 0000 0000 0001
#define SPI_SLAVE_CTRL_INT_EN       0x00002  // 00 0000 0000 0000 0010
#define SPI_SLAVE_CTRL_CPOL         0x00004  // 00 0000 0000 0000 0100
#define SPI_SLAVE_CTRL_CPHA         0x00008  // 00 0000 0000 0000 1000
#define SPI_SLAVE_CTRL_BITCNT       0x01F00  // 00 0001 1111 0000 0000

//Status register
#define SPI_SLAVE_STAT_DONE         0x00001  // 00 0000 0000 0000 0001
#define SPI_SLAVE_STAT_INT          0x00002  // 00 0000 0000 0000 0010

typedef volatile struct {
    volatile unsigned int spi_control;
    volatile unsigned int spi_data_out;
    volatile unsigned int spi_data_in;
    volatile unsigned int spi_status;
} spi_slave_regs_t;

#endif




SpartanMC