Datasheet
6. When the data packet has been transmitted, the TWINT flag in TWCRn is set and TWSRn is
updated with a status code indicating that the data packet has successfully been sent. The status
code will also reflect whether a slave acknowledged the packet or not.
7. The application software should now examine the value of TWSRn, to make sure that the data
packet was successfully transmitted, and that the value of the ACK bit was as expected. If TWSR
indicates otherwise, the application software might take some special action, like calling an error
routine. Assuming that the status code is as expected, the application must write a specific value to
TWCRn, instructing the TWI n hardware to transmit a STOP condition. Which value to write is
described later on. However, it is important that the TWINT bit is set to the value written. Writing a
one to TWINT clears the flag. The TWI n will not start any operation as long as the TWINT bit in
TWCRn is set. Immediately after the application has cleared TWINT, the TWI will initiate
transmission of the STOP condition. Note that TWINT is not set after a STOP condition has been
sent.
Even though this example is simple, it shows the principles involved in all TWI transmissions. These can
be summarized as follows:
• When the TWI has finished an operation and expects application response, the TWINT flag is set.
The SCL line is pulled low until TWINT is cleared.
• When the TWINT flag is set, the user must update all TWI n registers with the value relevant for the
next TWI n bus cycle. As an example, TWDRn must be loaded with the value to be transmitted in
the next bus cycle.
• After all TWI n register updates and other pending application software tasks have been completed,
TWCRn is written. When writing TWCRn, the TWINT bit should be set. Writing a one to TWINT
clears the flag. The TWI n will then commence executing whatever operation was specified by the
TWCRn setting.
The following table lists assembly and C implementation examples for TWI0. Note that the code below
assumes that several definitions have been made, e.g. by using include-files.
Table 26-2. Assembly and C Code Example
Assembly Code Example
C Example Comments
1
ldi r16, (1<<TWINT)|
(1<<TWSTA)|(1<<TWEN)
out TWCR0, r16
TWCR0 = (1<<TWINT)|
(1<<TWSTA)|(1<<TWEN)
Send START condition
2
wait1:
in r16,TWCR0
sbrs r16,TWINT
rjmp wait1
while (!(TWCR0 &
(1<<TWINT)));
Wait for TWINT Flag set. This indicates
that the START condition has been
transmitted.
3
in r16,TWSR0
andi r16, 0xF8
cpi r16, START
brne ERROR
if ((TWSR0 & 0xF8) !=
START)
ERROR();
Check value of TWI Status Register. Mask
prescaler bits. If status different from
START go to ERROR.
ldi r16, SLA_W
out TWDR0, r16
ldi r16, (1<<TWINT) |
(1<<TWEN)
out TWCR0, r16
TWDR0 = SLA_W;
TWCR0 = (1<<TWINT) |
(1<<TWEN);
Load SLA_W into TWDR Register. Clear
TWINT bit in TWCR to start transmission of
address.
ATmega48PA/88PA/168PA
Two-Wire Serial Interface (TWI)
© 2018 Microchip Technology Inc.
Datasheet Complete
DS40002011A-page 281