Betriebsart | Baudrate aus UBRRn(1) | UBRRn aus Baudrate | |||||||
---|---|---|---|---|---|---|---|---|---|
Synchroner Master-Modus |
|
|
BAUD | Baudrate (in Bits pro Sekunde, bps) |
---|---|
fOSC | Taktfrequenz des Hauptoszillators |
UBRRn | Inhalt des Registers, aus UBRRnH und UBRRnL zusammengesetzt (0-4095) |
UCPOLn | UCPHAn | SPI-Modus | Erste Flanke | Zweite Flanke |
---|---|---|---|---|
0 | 0 | 0 | Abtasten (steigend) | Ausgeben (fallend) |
0 | 1 | 1 | Ausgeben (steigend) | Abtasten (fallend) |
1 | 0 | 2 | Abtasten (fallend) | Ausgeben (steigend) |
1 | 1 | 3 | Ausgeben (fallend) | Abtasten (steigend) |
Kodebeispiel in Assembler(1) |
---|
USART_Init: clr r18 out UBRRnH,r18 out UBRRnL,r18 ; Das XCKn-Portpin als Ausgang setzen, was den Master-Modus aktiviert sbi XCKn_DDR, XCKn ; MSPI-Betriebsart auf SPI-Modus 0 setzen ldi r18,(1<<UMSELn1)|(1<<UMSELn0)|(0<<UCPHAn)|(0<<UCPOLn) out UCSRnC,r18 ; Sender und Empfänger freigeben ldi r18,(1<<RXENn)|(1<<TXENn) out UCSRnB,r18 ; Baudrate setzen. ; WICHTIG: Die Baudrate darf erst nach der Aktivierung von Sender und Empfänger gesetzt werden! out UBRRnH,r17 out UBRRnL,r18 ret |
Kodebeispiel in C(1) |
void USART_Init(unsigned int baud) { UBRRn = 0; /* Das XCKn-Portpin als Ausgang setzen, was den Master-Modus aktiviert */ XCKn_DDR |= (1<<XCKn); /* MSPI-Betriebsart auf SPI-Modus 0 setzen */ UCSRnC = (1<<UMSELn1)|(1<<UMSELn0)|(0<<UCPHAn)|(0<<UCPOLn); /* Sender und Empfänger freigeben */ UCSRnB = (1<<RXENn)|(1<<TXENn); /* Baudrate setzen. */ /* WICHTIG: Die Baudrate darf erst nach der Aktivierung von Sender und Empfänger gesetzt werden! */ UBRRn = baud; } |
After initialization the USART is ready for doing data transfers. A data transfer is initiated by writing to the UDRn I/O location. This is the case for both sending and receiving data since the transmitter controls the transfer clock. The data written to UDRn is moved from the transmit buffer to the shift register when the shift register is ready to send a new frame.
The function simply waits for the transmit buffer to be empty by checking the UDREn Flag, before loading it with new data to be transmitted. The function then waits for data to be present in the receive buffer by checking the RXCn Flag, before reading the buffer and returning the value.
Kodebeispiel in Assembler(1) |
---|
USART_MSPIM_Transfer: ; Wait for empty transmit buffer in r16, UCSRnA sbrs r16, UDREn rjmp USART_MSPIM_Transfer ; Put data (r16) into buffer, sends the data out UDRn,r16 ; Wait for data to be received USART_MSPIM_Wait_RXCn: in r16, UCSRnA sbrs r16, RXCn rjmp USART_MSPIM_Wait_RXCn ; Get and return received data from buffer in r16, UDRn ret |
Kodebeispiel in C(1) |
unsigned char USART_Receive( void ) { /* Wait for empty transmit buffer */ while ( !( UCSRnA & (1<<UDREn)) ); /* Put data into buffer, sends the data */ UDRn = data; /* Wait for data to be received */ while ( !(UCSRnA & (1<<RXCn)) ); /* Get and return received data from buffer */ return UDRn; } |
USART_MSPIM | SPI | Kommentar |
---|---|---|
TxDn | MOSI | Nur Master-Ausgang |
RxDn | MISO | Nur Master-Eingang |
XCKn | SCK | (functionell identisch) |
(N/A) | SS | Vom USART nicht unterstützt im MSPIM-Modus |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
RXCn | TXCn | UDREn | – | – | – | – | – | UCSRnA | |
---|---|---|---|---|---|---|---|---|---|
Zugriff | R | R/W | R | R | R | R | R | R | |
Startwert | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
RXCIEn | TXCIEn | UDRIEn | RXENn | TXENn | – | – | – | UCSRnB | |
---|---|---|---|---|---|---|---|---|---|
Zugriff | R/W | R/W | R/W | R/W | R/W | R | R | R | |
Startwert | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
UMSELn1 | UMSELn0 | – | – | – | UDORDn | UCPHAn | UCPOLn | UCSRnC | |
---|---|---|---|---|---|---|---|---|---|
Zugriff | R/W | R/W | R | R | R | R/W | R/W | R/W | |
Startwert | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
UMSELn1 | UMSELn0 | Mode |
---|---|---|
0 | 0 | Asynchronous USART |
0 | 1 | Synchronous USART |
1 | 0 | reserviert |
1 | 1 | Master SPI (MSPIM) |