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