21.   USART im SPI-Modus

21.1   Features

21.2   Übersicht

Der universelle serielle Datensender/-empfänger (USART) kann in einen SPI-kompatiblen Master-Betriebsmodus versetzt werden. Werden beide UMSELn1:0-Bits gesetzt, wird die USART-interne MSPIM-Logik aktiviert. In dieser Betriebsart übernimmt die SPI-Master-Steuerlogik die Kontrolle über die USART-Ressourcen. Die Ressourcen umfassen die Sende- und Empfangsschieberegister und -Puffer sowie den Baudraten-Generator. Der Paritätsgenerator und -prüfer, die Daten- und Taktwiederherstellungslogik sowie die RX- und TX-Steuerlogik sind abgeschaltet. Die USART-eigene RX- und TX-Steuerlogik wird durch eine gemeinsame SPI-Transfersteuerlogik ersetzt. Andererseits ist die Pin-Steuerlogik und Interrupterzeugungslogik identisch in beiden Betriebsmodi. Die Lage der I/O-Register ist die gleich in beiden Betriebsmodi, aber ein Teil der Funktionalität der Steuerregister ändert sich bei Nutzung des MSPIM.

21.3   Takterzeugung

Die Takterzeugungslogik generiert den Basistakt für den Sender und Empfänger. Für USART-MSPIM wird nur die interne Takterzeugung unterstützt, mithin nur der Master-Modus. Die Datenrrichtungsregister für das XCKn-Pin (DDR_XCKn) muss daher auf Eins (Ausgang) gesetzt werden, damit der USART-MSPIM richtig funktioniert. Bevorzugt sollte DDR_XCKn gesetzt werden, bevor MSPIM aktiviert wird (d.h. TXENn- und RXENn-Bit auf Eins gesetzt). Die interne Takterzeugung im MSPIM-Modus ist identisch zum synchronen USART-Master-Modus. Die Baudrate oder UBRRn-Einstellung kann daher durch die gleichen Gleichungen berechnet werden, siehe folgende Tabelle:
Tabelle 21-1: Gleichungen zwischen Baudrate und Baudraten-Register
BetriebsartBaudrate aus UBRRn(1)UBRRn aus Baudrate
Synchroner Master-Modus
BAUD =fOSC
2·(UBRRn+1)
UBRRn =fOSC-1
2·BAUD
Hinweis
  1. Die Baudrate ist die Symbolrate in Bit pro Sekunde (bps)
BAUDBaudrate (in Bits pro Sekunde, bps)
fOSCTaktfrequenz des Hauptoszillators
UBRRnInhalt des Registers, aus UBRRnH und UBRRnL zusammengesetzt (0-4095)

21.4   SPI-Datenmodi und -Zeiten

Es gibt vier Kombinationen der Phase und Polarität von XCKn (SCK) im Bezug zu den seriellen Daten, welche durch die Steuerbits UCPHAn und UCPOLn festgelegt werden. Das Datentransfer-Zeitdiagramm ist im Bild 21-1 dargestellt. Die Datenbits werden an entgegengesetzten Flanken des XCKn-Signals herausgeschoben bzw. abgetastet, so dass genügend Zeit für die Stabilisierung des Daten-Signalpegels bleibt. Die Funktion von UCPOLn und UCPHAn ist in Tabelle 21-2 zusammengefasst. Das Ändern eines der beiden Bits während einer laufenden Kommunikation bringt sowohl Sender als auch Empfänger durcheinander.
Tabelle 21-2: Funktion von UCPOLn und UCPHAn
UCPOLnUCPHAnSPI-ModusErste FlankeZweite Flanke
000Abtasten (steigend)Ausgeben (fallend)
011Ausgeben (steigend)Abtasten (fallend)
102Abtasten (fallend)Ausgeben (steigend)
113Ausgeben (fallend)Abtasten (steigend)
Bild 21-1: Zeitdiagramme für die vier Kombinationen aus UCPHAn und UCPOLn

21.5   Rahmenformate

Ein serieller Rahmen für MSPIM ist definiert als ein Zeichen von 8 Datenbits. Der USART im MSPIM-Modus hat zwei gültige Rahmenformate: Ein Rahmen beginnt mit dem niedrigst- oder höchstwertigen Datenbit. Dann folgen die nächsten Datenbits, insgesamt acht, mit dem höchst- oder niedrigstwertigen Datenbit entsprechend endend. Wurde ein kompletter Rahmen gesendet, kann der nächste unmittelbar folgen oder die Kommunikationsleitung wird in den Pausenzustand (high) gesetzt. Das Bit UDORDn in UCSRnC setzt das Rahmenformat im MSPIM-Modus. Sowohl Empfänger als auch Sender benutzen die gleiche Einstellung. Das Ändern dieses Bits während einer laufenden Kommunikation bringt sowohl Sender als auch Empfänger durcheinander. 16-bit-Datentransfer wird durch das Schreiben von zwei Datenbytes in UDRn erreicht. Ein UART-Senden-fertig-Interrupt signalisiert dann, dass der 16-Bit-Wert ausgeschoben wurde.

21.5.1.   MSPIM-Initialisierung

The USART in MSPIM mode has to be initialized before any communication can take place. The initialization process normally consists of setting the baud rate, setting master mode of operation (by setting DDR_XCKn to one), setting frame format and enabling the Transmitter and the Receiver. Only the transmitter can operate independently. For interrupt driven USART operation, the Global Interrupt Flag should be cleared (and thus interrupts globally disabled) when doing the initialization.
Note:
To ensure immediate initialization of the XCKn output the baud-rate register (UBRRn) must be zero at the time the transmitter is enabled. Contrary to the normal mode USART operation the UBRRn must then be written to the desired value after the transmitter is enabled, but before the first transmission is started. Setting UBRRn to zero before enabling the transmitter is not necessary if the initialization is done immediately after a reset since UBRRn is reset to zero.
Before doing a re-initialization with changed baud rate, data mode, or frame format, be sure that there is no ongoing transmissions during the period the registers are changed. The TXCn Flag can be used to check that the Transmitter has completed all transfers, and the RXCn Flag can be used to check that there are no unread data in the receive buffer. Note that the TXCn Flag must be cleared before each transmission (before UDRn is written) if it is used for this purpose. The following simple USART initialization code examples show one assembly and one C function that are equal in functionality. The examples assume polling (no interrupts enabled). The baud rate is given as a function parameter. For the assembly code, the baud rate parameter is assumed to be stored in the r17:r16 registers.
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;
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“

21.6   Datentransfer

Using the USART in MSPI mode requires the Transmitter to be enabled, i.e. the TXENn bit in the UCSRnB register is set to one. When the Transmitter is enabled, the normal port operation of the TxDn pin is overridden and given the function as the Transmitter's serial output. Enabling the receiver is optional and is done by setting the RXENn bit in the UCSRnB register to one. When the receiver is enabled, the normal pin operation of the RxDn pin is overridden and given the function as the Receiver's serial input. The XCKn will in both cases be used as the transfer clock.

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.

Note:
To keep the input buffer in sync with the number of data bytes transmitted, the UDRn register must be read once for each byte transmitted. The input buffer operation is identical to normal USART mode, i.e. if an overflow occurs the character last received will be lost, not the first data in the buffer. This means that if four bytes are transferred, byte 1 first, then byte 2, 3, and 4, and the UDRn is not read before all transfers are completed, then byte 3 to be received will be lost, and not byte 1.
The following code examples show a simple USART in MSPIM mode transfer function based on polling of the Data Register Empty (UDREn) Flag and the Receive Complete (RXCn) Flag. The USART has to be initialized before the function can be used. For the assembly code, the data to be sent is assumed to be stored in Register R16 and the data received will be available in the same register (R16) after the function returns.

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;
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“

21.6.1   Sende- und Empfängerflags und Interrupts

The RXCn, TXCn, and UDREn flags and corresponding interrupts in USART in MSPIM mode are identical in function to the normal USART operation. However, the receiver error status flags (FE, DOR, and PE) are not in use and is always read as zero.

21.6.2   Deaktivierung des Senders oder Empfängers

The disabling of the transmitter or receiver in USART in MSPIM mode is identical in function to the normal USART operation.

21.7   Gegenüberstellung MSPIM und SPI

The USART in MSPIM mode is fully compatible with the AVR SPI regarding: However, since the USART in MSPIM mode reuses the USART resources, the use of the USART in MSPIM mode is somewhat different compared to the SPI. In addition to differences of the control register bits, and that only master operation is supported by the USART in MSPIM mode, the following features differ between the two modules: A comparison of the USART in MSPIM mode and the SPI pins is shown in folgende Tabelle.
Tabelle 21-3: Vergleich der USART im MSPIM-Modus mit SPI-Pins
USART_MSPIMSPIKommentar
TxDnMOSINur Master-Ausgang
RxDnMISONur Master-Eingang
XCKnSCK(functionell identisch)
(N/A)SSVom USART nicht unterstützt im MSPIM-Modus

21.8   Register-Beschreibung

The following section describes the registers used for SPI operation using the USART.

21.8.1   UDRn — Bidirektionales Datenregister

The function and bit description of the USART data register (UDRn) in MSPI mode is identical to normal USART operation. Siehe „UDRn — Bidirektionales Datenregister“.

21.8.2   UCSRnA — Kontroll- und Statusregister A

Bit76543210
RXCnTXCnUDREnUCSRnA
ZugriffRR/WRRRRRR
Startwert00000110
  • Bit 7 – RXCn: USART Receive Complete This flag bit is set when there are unread data in the receive buffer and cleared when the receive buffer is empty (i.e., does not contain any unread data). If the Receiver is disabled, the receive buffer will be flushed and consequently the RXCn bit will become zero. The RXCn Flag can be used to generate a Receive Complete interrupt (see description of the RXCIEn bit).
  • Bit 6 – TXCn: USART Transmit Complete This flag bit is set when the entire frame in the Transmit Shift Register has been shifted out and there are no new data currently present in the transmit buffer (UDRn). The TXCn Flag bit is automatically cleared when a transmit complete interrupt is executed, or it can be cleared by writing a one to its bit location. The TXCn Flag can generate a Transmit Complete interrupt (see description of the TXCIEn bit).
  • Bit 5 – UDREn: USART Data Register Empty The UDREn Flag indicates if the transmit buffer (UDRn) is ready to receive new data. If UDREn is one, the buffer is empty, and therefore ready to be written. The UDREn Flag can generate a Data Register Empty interrupt (see description of the UDRIE bit). UDREn is set after a reset to indicate that the Transmitter is ready.
  • Bit 4:0 – Reserved Bits in MSPI mode When in MSPI mode, these bits are reserved for future use. For compatibility with future devices, these bits must be written to zero when UCSRnA is written.

    21.8.3   UCSRnB — Kontroll- und Statusregister B

    Bit76543210
    RXCIEnTXCIEnUDRIEnRXENnTXENnUCSRnB
    ZugriffR/WR/WR/WR/WR/WRRR
    Startwert00000110
  • Bit 7 – RXCIEn: RX Complete Interrupt Enable Writing this bit to one enables interrupt on the RXCn Flag. A USART Receive Complete interrupt will be generated only if the RXCIEn bit is written to one, the Global Interrupt Flag in SREG is written to one and the RXCn bit in UCSRnA is set.
  • Bit 6 – TXCIEn: TX Complete Interrupt Enable Writing this bit to one enables interrupt on the TXCn Flag. A USART Transmit Complete interrupt will be generated only if the TXCIEn bit is written to one, the Global Interrupt Flag in SREG is written to one and the TXCn bit in UCSRnA is set.
  • Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable Writing this bit to one enables interrupt on the UDREn Flag. A Data Register Empty interrupt will be generated only if the UDRIE bit is written to one, the Global Interrupt Flag in SREG is written to one and the UDREn bit in UCSRnA is set.
  • Bit 4 – RXENn: Receiver Enable Writing this bit to one enables the USART Receiver in MSPIM mode. The Receiver will override normal port operation for the RxDn pin when enabled. Disabling the Receiver will flush the receive buffer. Only enabling the receiver in MSPI mode (i.e. setting RXENn=1 and TXENn=0) has no meaning since it is the transmitter that controls the transfer clock and since only master mode is supported.
  • Bit 3 – TXENn: Transmitter Enable Writing this bit to one enables the USART Transmitter. The Transmitter will override normal port operation for the TxDn pin when enabled. The disabling of the Transmitter (writing TXENn to zero) will not become effective until ongoing and pending transmissions are completed, i.e., when the Transmit Shift Register and Transmit Buffer Register do not contain data to be transmitted. When disabled, the Transmitter will no longer override the TxDn port.
  • Bit 2:0 – Reserved Bits in MSPI mode When in MSPI mode, these bits are reserved for future use. For compatibility with future devices, these bits must be written to zero when UCSRnB is written.

    21.8.4   UCSRnC — Kontroll- und Statusregister C

    Bit76543210
    UMSELn1UMSELn0UDORDnUCPHAnUCPOLnUCSRnC
    ZugriffR/WR/WRRRR/WR/WR/W
    Startwert00000110
  • Bit 7:6 – UMSELn1:0: USART Mode Select These bits select the mode of operation of the USART as shown in Table 21-4. See ”UCSRnC – USART Control and Status Register n C” on page 193 for full description of the normal USART operation. The MSPIM is enabled when both UMSELn bits are set to one. The UDORDn, UCPHAn, and UCPOLn can be set in the same write operation where the MSPIM is enabled.
    Tabelle 21-4: UMSELn Bits Settings
    UMSELn1UMSELn0Mode
    00Asynchronous USART
    01Synchronous USART
    10reserviert
    11Master SPI (MSPIM)
  • Bit 5:3 – Reserved Bits in MSPI mode When in MSPI mode, these bits are reserved for future use. For compatibility with future devices, these bits must be written to zero when UCSRnC is written.
  • Bit 2 – UDORDn: Data Order When set to one the LSB of the data word is transmitted first. When set to zero the MSB of the data word is transmitted first. Refer to the Frame Formats section page 4 for details.
  • Bit 1 – UCPHAn: Clock Phase The UCPHAn bit setting determine if data is sampled on the leasing edge (first) or tailing (last) edge of XCKn. Refer to the SPI Data Modes and Timing section page 4 for details.
  • Bit 0 – UCPOLn: Clock Polarity The UCPOLn bit sets the polarity of the XCKn clock. The combination of the UCPOLn and UCPHAn bit settings determine the timing of the data transfer. Refer to the SPI Data Modes and Timing section page 4 for details.

    21.8.5   UBRRn — Baudraten-Register

    The function and bit description of the baud rate registers in MSPI mode is identical to normal USART operation. Siehe „UBRRn — Baudraten-Register“.