0% found this document useful (0 votes)
46 views15 pages

Atmega32A DataSheet Complete DS40002072A 10

Uploaded by

Mohammad amin
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
46 views15 pages

Atmega32A DataSheet Complete DS40002072A 10

Uploaded by

Mohammad amin
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 15

ATmega32A

19. SPI – Serial Peripheral Interface

19.1 Features
• Full-duplex, Three-wire Synchronous Data Transfer
• Master or Slave Operation
• LSB First or MSB First Data Transfer
• Seven Programmable Bit Rates
• End of Transmission Interrupt Flag
• Write Collision Flag Protection
• Wake-up from Idle Mode
• Double Speed (CK/2) Master SPI Mode

19.2 Overview
The Serial Peripheral Interface (SPI) allows high-speed synchronous data transfer between the ATmega32A and
peripheral devices or between several AVR devices.

Figure 19-1. SPI Block Diagram(1)

DIVIDER
/2/4/8/16/32/64/128
SPI2X

SPI2X

Note: 1. Refer to Figure 1-1 on page 10, and Table 13-6 on page 64 for SPI pin placement.
The interconnection between Master and Slave CPUs with SPI is shown in Figure 19-2. The system consists of two
Shift Registers, and a Master clock generator. The SPI Master initiates the communication cycle when pulling low
the Slave Select SS pin of the desired Slave. Master and Slave prepare the data to be sent in their respective Shift

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 136


ATmega32A

Registers, and the Master generates the required clock pulses on the SCK line to interchange data. Data is always
shifted from Master to Slave on the Master Out – Slave In, MOSI, line, and from Slave to Master on the Master In –
Slave Out, MISO, line. After each data packet, the Master will synchronize the Slave by pulling high the Slave
Select, SS, line.
When configured as a Master, the SPI interface has no automatic control of the SS line. This must be handled by
user software before communication can start. When this is done, writing a byte to the SPI Data Register starts the
SPI clock generator, and the hardware shifts the eight bits into the Slave. After shifting one byte, the SPI clock gen-
erator stops, setting the end of Transmission Flag (SPIF). If the SPI Interrupt Enable bit (SPIE) in the SPCR
Register is set, an interrupt is requested. The Master may continue to shift the next byte by writing it into SPDR, or
signal the end of packet by pulling high the Slave Select, SS line. The last incoming byte will be kept in the Buffer
Register for later use.
When configured as a Slave, the SPI interface will remain sleeping with MISO tri-stated as long as the SS pin is
driven high. In this state, software may update the contents of the SPI Data Register, SPDR, but the data will not
be shifted out by incoming clock pulses on the SCK pin until the SS pin is driven low. As one byte has been com-
pletely shifted, the end of Transmission Flag, SPIF is set. If the SPI Interrupt Enable bit, SPIE, in the SPCR
Register is set, an interrupt is requested. The Slave may continue to place new data to be sent into SPDR before
reading the incoming data. The last incoming byte will be kept in the Buffer Register for later use.

Figure 19-2. SPI Master-slave Interconnection


MSB MASTER LSB MSB SLAVE LSB
MISO MISO
8 BIT SHIFT REGISTER 8 BIT SHIFT REGISTER
MOSI MOSI

SHIFT
SPI SCK SCK ENABLE
CLOCK GENERATOR
SS SS

The system is single buffered in the transmit direction and double buffered in the receive direction. This means that
bytes to be transmitted cannot be written to the SPI Data Register before the entire shift cycle is completed. When
receiving data, however, a received character must be read from the SPI Data Register before the next character
has been completely shifted in. Otherwise, the first byte is lost.
In SPI Slave mode, the control logic will sample the incoming signal of the SCK pin. To ensure correct sampling of
the clock signal, the minimum low and high periods should be:
Low periods: longer than 2 CPU clock cycles.
High periods: longer than 2 CPU clock cycles.
When the SPI is enabled, the data direction of the MOSI, MISO, SCK, and SS pins is overridden according to
Table 19-1. For more details on automatic port overrides, refer to “Alternate Port Functions” on page 61.
Table 19-1. SPI Pin Overrides
Pin Direction, Master SPI Direction, Slave SPI
MOSI User Defined Input
MISO Input User Defined
SCK User Defined Input
SS User Defined Input

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 137


ATmega32A

Note: See “Alternate Port Functions” on page 61 for a detailed description of how to define the direction of the user
defined SPI pins.
The following code examples show how to initialize the SPI as a master and how to perform a simple transmission.
DDR_SPI in the examples must be replaced by the actual Data Direction Register controlling the SPI pins.
DD_MOSI, DD_MISO and DD_SCK must be replaced by the actual data direction bits for these pins. For example
if MOSI is placed on pin PB5, replace DD_MOSI with DDB5 and DDR_SPI with DDRB.

Assembly Code Example(1)


SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi r17,(1<<DD_MOSI)|(1<<DD_SCK)
out DDR_SPI,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret

SPI_MasterTransmit:
; Start transmission of data (r16)
out SPDR,r16
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
C Code Example(1)
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterTransmit(char cData)


{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}

Note: 1. See “About Code Examples” on page 14.

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 138


ATmega32A

The following code examples show how to initialize the SPI as a Slave and how to perform a simple reception.

Assembly Code Example(1)


SPI_SlaveInit:
; Set MISO output, all others input
ldi r17,(1<<DD_MISO)
out DDR_SPI,r17
; Enable SPI
ldi r17,(1<<SPE)
out SPCR,r17
ret

SPI_SlaveReceive:
; Wait for reception complete
sbis SPSR,SPIF
rjmp SPI_SlaveReceive
; Read received data and return
in r16,SPDR
ret

C Code Example(1)
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1<<DD_MISO);
/* Enable SPI */
SPCR = (1<<SPE);
}

char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return data register */
return SPDR;
}

Note: 1. See “About Code Examples” on page 14.

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 139


ATmega32A

19.3 SS Pin Functionality

19.3.1 Slave Mode


When the SPI is configured as a Slave, the Slave Select (SS) pin is always input. When SS is held low, the SPI is
activated, and MISO becomes an output if configured so by the user. All other pins are inputs. When SS is driven
high, all pins are inputs except MISO which can be user configured as an output, and the SPI is passive, which
means that it will not receive incoming data. Note that the SPI logic will be reset once the SS pin is driven high.
The SS pin is useful for packet/byte synchronization to keep the slave bit counter synchronous with the master
clock generator. When the SS pin is driven high, the SPI Slave will immediately reset the send and receive logic,
and drop any partially received data in the Shift Register.

19.3.2 Master Mode


When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the direction of the SS pin.
If SS is configured as an output, the pin is a general output pin which does not affect the SPI system. Typically, the
pin will be driving the SS pin of the SPI Slave.
If SS is configured as an input, it must be held high to ensure Master SPI operation. If the SS pin is driven low by
peripheral circuitry when the SPI is configured as a Master with the SS pin defined as an input, the SPI system
interprets this as another master selecting the SPI as a slave and starting to send data to it. To avoid bus conten-
tion, the SPI system takes the following actions:
1. The MSTR bit in SPCR is cleared and the SPI system becomes a slave. As a result of the SPI becoming
a slave, the MOSI and SCK pins become inputs.
2. The SPIF Flag in SPSR is set, and if the SPI interrupt is enabled, and the I-bit in SREG is set, the interrupt
routine will be executed.
Thus, when interrupt-driven SPI transmission is used in master mode, and there exists a possibility that SS is
driven low, the interrupt should always check that the MSTR bit is still set. If the MSTR bit has been cleared by a
slave select, it must be set by the user to re-enable SPI master mode.

19.3.3 SPCR – SPI Control Register

Bit 7 6 5 4 3 2 1 0
SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0 SPCR
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

• Bit 7 – SPIE: SPI Interrupt Enable


This bit causes the SPI interrupt to be executed if SPIF bit in the SPSR Register is set and the if the global interrupt
enable bit in SREG is set.

• Bit 6 – SPE: SPI Enable


When the SPE bit is written to one, the SPI is enabled. This bit must be set to enable any SPI operations.

• Bit 5 – DORD: Data Order


When the DORD bit is written to one, the LSB of the data word is transmitted first.
When the DORD bit is written to zero, the MSB of the data word is transmitted first.

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 140


ATmega32A

• Bit 4 – MSTR: Master/Slave Select


This bit selects Master SPI mode when written to one, and Slave SPI mode when written logic zero. If SS is config-
ured as an input and is driven low while MSTR is set, MSTR will be cleared, and SPIF in SPSR will become set.
The user will then have to set MSTR to re-enable SPI Master mode.

• Bit 3 – CPOL: Clock Polarity


When this bit is written to one, SCK is high when idle. When CPOL is written to zero, SCK is low when idle. Refer
to Figure 19-3 and Figure 19-4 for an example. The CPOL functionality is summarized below:

Table 19-2. CPOL Functionality


CPOL Leading Edge Trailing Edge
0 Rising Falling
1 Falling Rising

• Bit 2 – CPHA: Clock Phase


The settings of the Clock Phase bit (CPHA) determine if data is sampled on the leading (first) or trailing (last) edge
of SCK. Refer to Figure 19-3 and Figure 19-4 for an example. The CPHA functionality is summarized below:

Table 19-3. CPHA Functionality


CPHA Leading Edge Trailing Edge
0 Sample Setup
1 Setup Sample

• Bits 1, 0 – SPR1, SPR0: SPI Clock Rate Select 1 and 0


These two bits control the SCK rate of the device configured as a Master. SPR1 and SPR0 have no effect on the
Slave. The relationship between SCK and the Oscillator Clock frequency fosc is shown in the following table:

Table 19-4. Relationship Between SCK and the Oscillator Frequency


SPI2X SPR1 SPR0 SCK Frequency
0 0 0 fosc/4
0 0 1 fosc/16
0 1 0 fosc/64
0 1 1 fosc/128
1 0 0 fosc/2
1 0 1 fosc/8
1 1 0 fosc/32
1 1 1 fosc/64

19.3.4 SPSR – SPI Status Register

Bit 7 6 5 4 3 2 1 0
SPIF WCOL – – – – – SPI2X SPSR
Read/Write R R R R R R R R/W
Initial Value 0 0 0 0 0 0 0 0

• Bit 7 – SPIF: SPI Interrupt Flag


When a serial transfer is complete, the SPIF Flag is set. An interrupt is generated if SPIE in SPCR is set and global
interrupts are enabled. If SS is an input and is driven low when the SPI is in Master mode, this will also set the SPIF

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 141


ATmega32A

Flag. SPIF is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, the
SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing the SPI Data Register
(SPDR).

• Bit 6 – WCOL: Write COLlision Flag


The WCOL bit is set if the SPI Data Register (SPDR) is written during a data transfer. The WCOL bit (and the SPIF
bit) are cleared by first reading the SPI Status Register with WCOL set, and then accessing the SPI Data Register.

• Bit 5:1 – Reserved Bits


These bits are reserved bits in the ATmega32A and will always read as zero.

• Bit 0 – SPI2X: Double SPI Speed Bit


When this bit is written logic one the SPI speed (SCK Frequency) will be doubled when the SPI is in Master mode
(see Table 19-4). This means that the minimum SCK period will be two CPU clock periods. When the SPI is config-
ured as Slave, the SPI is only ensured to work at fosc/4 or lower.
The SPI interface on the ATmega32A is also used for program memory and EEPROM downloading or uploading.
See “SPI Serial Downloading” on page 269 for SPI Serial Programming and Verification.

19.3.5 SPDR – SPI Data Register

Bit 7 6 5 4 3 2 1 0
MSB LSB SPDR
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value X X X X X X X X Undefined

The SPI Data Register is a read/write register used for data transfer between the Register File and the SPI Shift
Register. Writing to the register initiates data transmission. Reading the register causes the Shift Register Receive
buffer to be read.

19.4 Data Modes


There are four combinations of SCK phase and polarity with respect to serial data, which are determined by control
bits CPHA and CPOL. The SPI data transfer formats are shown in Figure 19-3 and Figure 19-4. Data bits are
shifted out and latched in on opposite edges of the SCK signal, ensuring sufficient time for data signals to stabilize.
This is clearly seen by summarizing Table 19-2 and Table 19-3, as done below:

Table 19-5. CPOL and CPHA Functionality


Leading Edge Trailing Edge SPI Mode
CPOL = 0, CPHA = 0 Sample (Rising) Setup (Falling) 0
CPOL = 0, CPHA = 1 Setup (Rising) Sample (Falling) 1
CPOL = 1, CPHA = 0 Sample (Falling) Setup (Rising) 2
CPOL = 1, CPHA = 1 Setup (Falling) Sample (Rising) 3

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 142


ATmega32A

Figure 19-3. SPI Transfer Format with CPHA = 0


SCK (CPOL = 0)
mode 0
SCK (CPOL = 1)
mode 2

SAMPLE I
MOSI/MISO

CHANGE 0
MOSI PIN
CHANGE 0
MISO PIN

SS

MSB first (DORD = 0) MSB Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 LSB
LSB first (DORD = 1) LSB Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 MSB

Figure 19-4. SPI Transfer Format with CPHA = 1

SCK (CPOL = 0)
mode 1
SCK (CPOL = 1)
mode 3

SAMPLE I
MOSI/MISO

CHANGE 0
MOSI PIN
CHANGE 0
MISO PIN

SS

MSB first (DORD = 0) MSB Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 LSB
LSB first (DORD = 1) LSB Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 MSB

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 143


ATmega32A

20. USART

20.1 Features
• Full Duplex Operation (Independent Serial Receive and Transmit Registers)
• Asynchronous or Synchronous Operation
• Master or Slave Clocked Synchronous Operation
• High Resolution Baud Rate Generator
• Supports Serial Frames with 5, 6, 7, 8, or 9 Data Bits and 1 or 2 Stop Bits
• Odd or Even Parity Generation and Parity Check Supported by Hardware
• Data OverRun Detection
• Framing Error Detection
• Noise Filtering Includes False Start Bit Detection and Digital Low Pass Filter
• Three Separate Interrupts on TX Complete, TX Data Register Empty, and RX Complete
• Multi-processor Communication Mode
• Double Speed Asynchronous Communication Mode

20.2 Overview
The Universal Synchronous and Asynchronous serial Receiver and Transmitter (USART) is a highly flexible serial
communication device. A simplified block diagram of the USART transmitter is shown in Figure 20-1. CPU accessi-
ble I/O Registers and I/O pins are shown in bold.

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 144


ATmega32A

Figure 20-1. USART Block Diagram(1)

Clock Generator

UBRR[H:L]
OSC

BAUD RATE GENERATOR

SYNC LOGIC PIN


XCK
CONTROL

Transmitter
TX
UDR (Transmit)
CONTROL
PARITY
GENERATOR
DATABUS

PIN
TRANSMIT SHIFT REGISTER TxD
CONTROL

Receiver
CLOCK RX
RECOVERY CONTROL

DATA PIN
RECEIVE SHIFT REGISTER RxD
RECOVERY CONTROL

PARITY
UDR (Receive)
CHECKER

UCSRA UCSRB UCSRC

Note: 1. Refer to Figure 1-1 on page 10, Table 13-14 on page 70, and Table 13-8 on page 66 for USART pin placement.
The dashed boxes in the block diagram separate the three main parts of the USART (listed from the top): Clock
Generator, Transmitter and Receiver. Control Registers are shared by all units. The clock generation logic consists
of synchronization logic for external clock input used by synchronous slave operation, and the baud rate generator.
The XCK (Transfer Clock) pin is only used by Synchronous Transfer mode. The Transmitter consists of a single
write buffer, a serial Shift Register, parity generator and control logic for handling different serial frame formats.
The write buffer allows a continuous transfer of data without any delay between frames. The Receiver is the most
complex part of the USART module due to its clock and data recovery units. The recovery units are used for asyn-
chronous data reception. In addition to the recovery units, the receiver includes a parity checker, control logic, a
Shift Register and a two level receive buffer (UDR). The receiver supports the same frame formats as the transmit-
ter, and can detect frame error, data overrun and parity errors.

20.2.1 AVR USART vs. AVR UART – Compatibility


The USART is fully compatible with the AVR UART regarding:
• Bit locations inside all USART Registers
• Baud Rate Generation
• Transmitter Operation
• Transmit Buffer Functionality

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 145


ATmega32A

• Receiver Operation
However, the receive buffering has two improvements that will affect the compatibility in some special cases:
• A second Buffer Register has been added. The two Buffer Registers operate as a circular FIFO buffer.
Therefore the UDR must only be read once for each incoming data! More important is the fact that the Error
Flags (FE and DOR) and the 9th data bit (RXB8) are buffered with the data in the receive buffer. Therefore the
status bits must always be read before the UDR Register is read. Otherwise the error status will be lost since
the buffer state is lost.
• The receiver Shift Register can now act as a third buffer level. This is done by allowing the received data to
remain in the serial Shift Register (see Figure 20-1) if the Buffer Registers are full, until a new start bit is
detected. The USART is therefore more resistant to Data OverRun (DOR) error conditions.
The following control bits have changed name, but have same functionality and register location:
• CHR9 is changed to UCSZ2
• OR is changed to DOR

20.3 Clock Generation


The clock generation logic generates the base clock for the Transmitter and Receiver. The USART supports four
modes of clock operation: Normal Asynchronous, Double Speed Asynchronous, Master Synchronous and Slave
Synchronous mode. The UMSEL bit in USART Control and Status Register C (UCSRC) selects between asyn-
chronous and synchronous operation. Double Speed (Asynchronous mode only) is controlled by the U2X found in
the UCSRA Register. When using Synchronous mode (UMSEL = 1), the Data Direction Register for the XCK pin
(DDR_XCK) controls whether the clock source is internal (Master mode) or external (Slave mode). The XCK pin is
only active when using Synchronous mode.
Figure 20-2 shows a block diagram of the clock generation logic.

Figure 20-2. Clock Generation Logic, Block Diagram


UBRR
U2X
fosc

Prescaling UBRR+1
/2 /4 /2
Down-Counter 0
1
0
OSC txclk
1
DDR_XCK

Sync Edge
xcki Register Detector 0
XCK UMSEL
xcko 1
Pin

DDR_XCK UCPOL 1
rxclk
0

Signal description:
txclk Transmitter clock (Internal Signal).
rxclk Receiver base clock (Internal Signal).
xcki Input from XCK pin (Internal Signal). Used for synchronous slave operation.
xcko Clock output to XCK pin (Internal Signal). Used for synchronous master
operation.

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 146


ATmega32A

fosc XTAL pin frequency (System Clock).

20.3.1 Internal Clock Generation – The Baud Rate Generator


Internal clock generation is used for the asynchronous and the synchronous master modes of operation. The
description in this section refers to Figure 20-2.
The USART Baud Rate Register (UBRR) and the down-counter connected to it function as a programmable pres-
caler or baud rate generator. The down-counter, running at system clock (fosc), is loaded with the UBRR value
each time the counter has counted down to zero or when the UBRRL Register is written. A clock is generated each
time the counter reaches zero. This clock is the baud rate generator clock output (= fosc/(UBRR+1)). The Trans-
mitter divides the baud rate generator clock output by 2, 8 or 16 depending on mode. The baud rate generator
output is used directly by the receiver’s clock and data recovery units. However, the recovery units use a state
machine that uses 2, 8 or 16 states depending on mode set by the state of the UMSEL, U2X and DDR_XCK bits.
Table 20-1 contains equations for calculating the baud rate (in bits per second) and for calculating the UBRR value
for each mode of operation using an internally generated clock source.

Table 20-1. Equations for Calculating Baud Rate Register Setting


Equation for Calculating Equation for Calculating
Operating Mode Baud Rate(1) UBRR Value
Asynchronous Normal Mode f OSC f OSC
(U2X = 0) BAUD = --------------------------------------- UBRR = ------------------------ – 1
16  UBRR + 1  16BAUD
Asynchronous Double Speed Mode (U2X f OSC f OSC
= 1) BAUD = ----------------------------------- UBRR = -------------------- – 1
8  UBRR + 1  8BAUD
Synchronous Master Mode f OSC f OSC
BAUD = ----------------------------------- UBRR = -------------------- – 1
2  UBRR + 1  2BAUD
Note: 1. The baud rate is defined to be the transfer rate in bit per second (bps).
BAUD Baud rate (in bits per second, bps)
fOSC System Oscillator clock frequency
UBRR Contents of the UBRRH and UBRRL Registers, (0 - 4095)
Some examples of UBRR values for some system clock frequencies are found in “Examples of Baud Rate Setting”
on page 167 (Table 20-9 to Table 20-12).

20.3.2 Double Speed Operation (U2X)


The transfer rate can be doubled by setting the U2X bit in UCSRA. Setting this bit only has effect for the asynchro-
nous operation. Set this bit to zero when using synchronous operation.
Setting this bit will reduce the divisor of the baud rate divider from 16 to 8, effectively doubling the transfer rate for
asynchronous communication. Note however that the receiver will in this case only use half the number of samples
(reduced from 16 to 8) for data sampling and clock recovery, and therefore a more accurate baud rate setting and
system clock are required when this mode is used. For the Transmitter, there are no downsides.

20.3.3 External Clock


External clocking is used by the synchronous slave modes of operation. The description in this section refers to
Figure 20-2 for details.
External clock input from the XCK pin is sampled by a synchronization register to minimize the chance of meta-sta-
bility. The output from the synchronization register must then pass through an edge detector before it can be used

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 147


ATmega32A

by the Transmitter and receiver. This process introduces a two CPU clock period delay and therefore the maximum
external XCK clock frequency is limited by the following equation:
f OSC
f XCK  -----------
4

Note that fosc depends on the stability of the system clock source. It is therefore recommended to add some margin
to avoid possible loss of data due to frequency variations.

20.3.4 Synchronous Clock Operation


When Synchronous mode is used (UMSEL = 1), the XCK pin will be used as either clock input (Slave) or clock out-
put (Master). The dependency between the clock edges and data sampling or data change is the same. The basic
principle is that data input (on RxD) is sampled at the opposite XCK clock edge of the edge the data output (TxD) is
changed.

Figure 20-3. Synchronous Mode XCK Timing.

UCPOL = 1 XCK

RxD / TxD

Sample

UCPOL = 0 XCK

RxD / TxD

Sample

The UCPOL bit UCRSC selects which XCK clock edge is used for data sampling and which is used for data
change. As Figure 20-3 shows, when UCPOL is zero the data will be changed at rising XCK edge and sampled at
falling XCK edge. If UCPOL is set, the data will be changed at falling XCK edge and sampled at rising XCK edge.

20.4 Frame Formats


A serial frame is defined to be one character of data bits with synchronization bits (start and stop bits), and option-
ally a parity bit for error checking. The USART accepts all 30 combinations of the following as valid frame formats:
• 1 start bit
• 5, 6, 7, 8, or 9 data bits
• no, even or odd parity bit
• 1 or 2 stop bits
A frame starts with the start bit followed by the least significant data bit. Then the next data bits, up to a total of
nine, are succeeding, ending with the most significant bit. If enabled, the parity bit is inserted after the data bits,
before the stop bits. When a complete frame is transmitted, it can be directly followed by a new frame, or the com-
munication line can be set to an idle (high) state. Figure 20-4 illustrates the possible combinations of the frame
formats. Bits inside brackets are optional.

Figure 20-4. Frame Formats


FRAME

(IDLE) St 0 1 2 3 4 [5] [6] [7] [8] [P] Sp1 [Sp2] (St / IDLE)

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 148


ATmega32A

St Start bit, always low.


(n) Data bits (0 to 8).
P Parity bit. Can be odd or even.
Sp Stop bit, always high.
IDLE No transfers on the communication line (RxD or TxD). An IDLE line must be
high.
The frame format used by the USART is set by the UCSZ2:0, UPM1:0, and USBS bits in UCSRB and UCSRC. The
Receiver and Transmitter use the same setting. Note that changing the setting of any of these bits will corrupt all
ongoing communication for both the Receiver and Transmitter.
The USART Character SiZe (UCSZ2:0) bits select the number of data bits in the frame. The USART Parity mode
(UPM1:0) bits enable and set the type of parity bit. The selection between one or two stop bits is done by the
USART Stop Bit Select (USBS) bit. The receiver ignores the second stop bit. An FE (Frame Error) will therefore
only be detected in the cases where the first stop bit is zero.

20.4.1 Parity Bit Calculation


The parity bit is calculated by doing an exclusive-or of all the data bits. If odd parity is used, the result of the exclu-
sive or is inverted. The relation between the parity bit and data bits is as follows::
P even = d n – 1    d 3  d 2  d 1  d 0  0
P odd = d n – 1    d 3  d 2  d 1  d 0  1

Peven Parity bit using even parity


Podd Parity bit using odd parity
dn Data bit n of the character
If used, the parity bit is located between the last data bit and first stop bit of a serial frame.

20.5 USART Initialization


The USART has to be initialized before any communication can take place. The initialization process normally con-
sists of setting the baud rate, setting frame format and enabling the Transmitter or the Receiver depending on the
usage. For interrupt driven USART operation, the Global Interrupt Flag should be cleared (and interrupts globally
disabled) when doing the initialization.
Before doing a re-initialization with changed baud rate or frame format, be sure that there are no ongoing transmis-
sions during the period the registers are changed. The TXC Flag can be used to check that the Transmitter has
completed all transfers, and the RXC Flag can be used to check that there are no unread data in the receive buffer.
Note that the TXC Flag must be cleared before each transmission (before UDR 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 asynchronous operation using polling (no interrupts enabled) and a fixed
frame format. 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. When the function writes to the UCSRC Register, the URSEL bit
(MSB) must be set due to the sharing of I/O location by UBRRH and UCSRC.

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 149


ATmega32A

Assembly Code Example(1)


USART_Init:
; Set baud rate
out UBRRH, r17
out UBRRL, r16
; Enable receiver and transmitter
ldi r16, (1<<RXEN)|(1<<TXEN)
out UCSRB,r16
; Set frame format: 8data, 2stop bit
ldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
out UCSRC,r16
ret
C Code Example(1)
void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

Note: 1. See “About Code Examples” on page 14.


More advanced initialization routines can be made that include frame format as parameters, disable interrupts and
so on. However, many applications use a fixed setting of the Baud and Control Registers, and for these types of
applications the initialization code can be placed directly in the main routine, or be combined with initialization code
for other I/O modules.

20.6 Data Transmission – The USART Transmitter


The USART Transmitter is enabled by setting the Transmit Enable (TXEN) bit in the UCSRB Register. When the
Transmitter is enabled, the normal port operation of the TxD pin is overridden by the USART and given the function
as the transmitter’s serial output. The baud rate, mode of operation and frame format must be set up once before
doing any transmissions. If synchronous operation is used, the clock on the XCK pin will be overridden and used
as transmission clock.

20.6.1 Sending Frames with 5 to 8 Data Bit


A data transmission is initiated by loading the transmit buffer with the data to be transmitted. The CPU can load the
transmit buffer by writing to the UDR I/O location. The buffered data in the transmit buffer will be moved to the Shift
Register when the Shift Register is ready to send a new frame. The Shift Register is loaded with new data if it is in
idle state (no ongoing transmission) or immediately after the last stop bit of the previous frame is transmitted. When
the Shift Register is loaded with new data, it will transfer one complete frame at the rate given by the Baud Regis-
ter, U2X bit or by XCK depending on mode of operation.
The following code examples show a simple USART transmit function based on polling of the Data Register Empty
(UDRE) Flag. When using frames with less than eight bits, the most significant bits written to the UDR are ignored.

 2018 Microchip Technology Inc. Data Sheet Complete DS40002072A-page 150

You might also like