/*---------------------------------------------------------------------------- @ File Name : seriell.c @ Object : Grundfunktionen der seriellen Schnittstelle @ int init_ser(); char putch(char); char getch(); int puts(char *) @ @ Autor : M.Pester @ Datum : 04.12.2007 @ letzte Aenderung : 30.03.2021 @ @----------------------------------------------------------------------------*/ #include "seriell.h" #define DEFAULT_BAUD 38400 #define CLOCK_SPEED 25000000 //CD = (CLOCK_SPEED / (16*(DEFAULT_BAUD)) // 25MHz / ( 16 * 38400) = 40.69 -> 41 -> 0x29 #define CD 0x29 // Initialisiert die serielle Schnittstelle USART0 int init_ser() { StructPIO* piobaseA = PIOA_BASE; StructPMC* pmcbase = PMC_BASE; StructUSART* usartbase0 = USART0; pmcbase->PMC_PCER = 0x4; // Clock für US0 einschalten piobaseA->PIO_PDR = 0x18000; // US0 TxD und RxD usartbase0->US_CR = 0xa0; // TxD und RxD disable usartbase0->US_BRGR = CD; // Baud Rate Generator Register usartbase0->US_MR = 0x8c0; // Keine Parität, 8 Bit, MCKI usartbase0->US_CR = 0x50; // TxD und RxD enable return 0; } // Gibt wenn möglich ein Zeichen auf die serielle Schnittstelle aus // und liefert das Zeichen wieder zurück // wenn eine Ausgabe nicht möglich war wird eine 0 zurück geliefert char putch(char Zeichen) { StructUSART* usartbase0 = USART0; if( usartbase0->US_CSR & US_TXRDY ) { usartbase0->US_THR = Zeichen; } else { Zeichen = 0; // wenn keine Ausgabe } return Zeichen; } // Gibt entweder ein empfangenes Zeichen oder eine 0 zurück char getch(void) { StructUSART* usartbase0 = USART0; char Zeichen; if( usartbase0->US_CSR & US_RXRDY ) { Zeichen = usartbase0->US_RHR; } else { Zeichen = 0; } return Zeichen; } // Gibt einen String ueber putch(char) aus // und ergaenzt 0xa (LF) durch 0xa und 0xd (CR) // liefert die Anzahl der ausgebenen Zeichen int puts(char *String) { int i = 0; while( String[i] != 0) { while(!(putch(String[i]))); i = i + 1; if( String[i-1] == 0xa) { while(!(putch(0xd))); i = i + 1; // Ist das so wichtig? } } return i; }