UARTlight

Die UARTlight ist eine Version mit minimalem Hardware Aufwand. Die Datenlänge sind immer 8 Bit und die Datenrate kann nur als Parameter bei der Implementierung eingestellt werden. Die Datenrate kann zur Laufzeit nicht mehr verändert werden. In der Standard Implementierung ist auch keine Interrupt Arbeit möglich. Sie kann aber mit einem weiteren Parameter freigegeben werden. Eine Paritätskontrolle ist grundsätzlich nicht vorhanden und es wird auch immer mit nur einem STOP-Bit gearbeitet.

Register

Offset Register Zugriff
0 UART_Status (RESET Tx Interrupt bei write) read/write
1 UART_FIFO_READ (RESET Rx Interrupt) read
2 UART_FIFO_WRITE write

Bitbelegung UART_Status

Bit Maske Hex Bedeutung Zugriff reset
0 0x00001 rx FIFO leer r 1
1 0x00002 rx FIFO voll r 0
2 0x00004 tx FIFO leer r 1
3 0x00008 tx FIFO voll r 0
4 0x00010 tx FIFO wurde geschrieben r 1
5 0x00020 tx Interrupt r 0
6-8 frei
9 0x00200 Freigabe des Rx Interrupt r/w 0
10 0x00400 Freigabe des Tx Interrupt r/w 0
11-17 frei

include <periperals/uart_light.h>

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

#include <stdint.h>

// Status Signale
#define UART_LIGHT_RX_EMPTY     (1<<0)
#define UART_LIGHT_RX_FULL      (1<<1)
#define UART_LIGHT_TX_EMPTY     (1<<2)
#define UART_LIGHT_TX_FULL      (1<<3)
#define UART_LIGHT_TX_IRQ_PRE   (1<<4)
#define	UART_LIGHT_TX_IRQ_FLAG	(1<<5)

// Interruptfreigabe fuer UART light
#define UART_LIGHT_RXIE         (1<<9)
#define UART_LIGHT_TXIE         (1<<10)

// Rueckgabewerte fuer non blocking read
#define UART_LIGHT_OK           0
#define UART_LIGHT_NO_DATA      1

typedef struct {
    volatile uint18_t   status;		// read/write = Reset Tx Interrupt
    volatile uint18_t   rx_data;	// read = Reset Rx Interrupt
    volatile uint18_t   tx_data;	// write
} uart_light_regs_t;

void uart_light_send (uart_light_regs_t *uart, unsigned char value);
unsigned char uart_light_receive (uart_light_regs_t *uart);
int uart_light_receive_nb (uart_light_regs_t *uart, unsigned char *value);

#endif /*UART_LIGHT_H_*/

Ein C-Programm für UART oder UARTlight einrichten

Ein Beispiel dazu finden Sie im Test 1 für den SpartanMC auf dem SP601 Board
Parameter zusammenführen
#ifndef	SB_UART_LIGHT_1_INTERRUPT_SUPPORTED
	#define F_SIZE		SB_UART_1_FIFO_TX_DEPTH+1	// FIFO Tiefe + 1
	#define	U_IDLE		(UART_TX_STOP|UART_RX_STOP|UART_TX_EMPTY|UART_RX_EMPTY)
	#define	U_IDLE_MSK	(UART_TX_STOP|UART_RX_STOP|UART_TX_EMPTY|UART_RX_EMPTY|UART_RST_UART)
	#define	UART1		UART_0
	#define	UART2		UART_1
	#define	U_RX_EMPTY	UART_RX_EMPTY
	#define	U_RX_FULL	UART_RX_FULL
	#define	U_TX_EMPTY	UART_TX_EMPTY
	#define	U_TX_FULL	UART_TX_FULL
	#define	U_TX_IRQ_FLAG	UART_TX_IRQ_FLAG
#else
	#define F_SIZE		SB_UART_LIGHT_1_FIFO_TX_DEPTH+1	// FIFO Tiefe + 1
	#define	U_IDLE		(UART_LIGHT_TX_EMPTY|UART_LIGHT_RX_EMPTY)
	#define	U_IDLE_MSK	(UART_LIGHT_TX_EMPTY|UART_LIGHT_RX_EMPTY)
	#define	UART1		UART_LIGHT_0
	#define	UART2		UART_LIGHT_1
	#define	U_RX_EMPTY	UART_LIGHT_RX_EMPTY
	#define	U_RX_FULL	UART_LIGHT_RX_FULL
	#define	U_TX_EMPTY	UART_LIGHT_TX_EMPTY
	#define	U_TX_FULL	UART_LIGHT_TX_FULL
	#define	U_TX_IRQ_FLAG	UART_LIGHT_TX_IRQ_FLAG
#endif

stdio festlegen
#ifndef	SB_UART_LIGHT_0_INTERRUPT_SUPPORTED
FILE * stdout	= &UART_0_FILE;
FILE * stdin	= &UART_0_FILE;
#else
FILE * stdout	= &UART_LIGHT_0_FILE;
FILE * stdin	= &UART_LIGHT_0_FILE;
#endif

Initialisierung
#ifndef	SB_UART_LIGHT_0_INTERRUPT_SUPPORTED
	uart_wait_idle(UART1);
	UART1.ctrl_stat	= UART_RX_EN|UART_TX_EN|UART_DATA_LEN_8|UART_TWO_STOP|UART_BPS_115200;
	UART2.ctrl_stat	= UART_RX_EN|UART_TX_EN|UART_DATA_LEN_8|UART_BPS_600;
#endif

Interrupt Freigabe
#ifndef	SB_UART_LIGHT_1_INTERRUPT_SUPPORTED
	UART2.ctrl_stat	= UART_RX_EN|UART_TX_EN|UART_DATA_LEN_8|UART_BPS_600|UART_RX_IE|UART_TX_IE;
#else
	UART2.status	= UART_LIGHT_RXIE | UART_LIGHT_TXIE;	// Interruptfreigabe fuer UART light
#endif

Interrupt Sperren
#ifndef	SB_UART_LIGHT_1_INTERRUPT_SUPPORTED
	UART2.ctrl_stat	= UART_RX_EN|UART_TX_EN|UART_DATA_LEN_8|UART_BPS_600;
#else
	UART2.status	= 0;		// Interrupt sperren fuer UART light
#endif

Tx Interrupt in der ISR zurücksetzen
#ifndef	SB_UART_LIGHT_1_INTERRUPT_SUPPORTED
	variable	= UART2.ctrl_stat;			// Tx Interrupt zurueck setzen
#else
	UART2.status	= UART_LIGHT_RXIE | UART_LIGHT_TXIE;	// Tx Interrupt zurueck setzen
#endif



SpartanMC