Datasheet

Table Of Contents
7. The application software should now examine the value of TWSR, 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
TWCR, instructing the TWI hardware to transmit a STOP condition. Which value to write is
described later on. However, it is important that the TWINT bit is set in the value written. Writing a
one to TWINT clears the flag. The TWI will not start any operation as long as the TWINT bit in
TWCR 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 Registers with the value relevant for the
next TWI bus cycle. As an example, TWDR must be loaded with the value to be transmitted in the
next bus cycle.
After all TWI Register updates and other pending application software tasks have been completed,
TWCR is written. When writing TWCR, the TWINT bit should be set. Writing a one to TWINT clears
the flag. The TWI will then commence executing whatever operation was specified by the TWCR
setting.
The following table lists assembly and C implementation examples. Note that the code below assumes
that several definitions have been made, e.g. by using include-files.
Table 24-2. Assembly and C Code Example
Assembly Code Example C Example Comments
1
ldi r16, (1<<TWINT)|(1<<TWSTA)|
(1<<TWEN)
out TWCR, r16
TWCR = (1<<TWINT)|
(1<<TWSTA)|(1<<TWEN)
Send START condition
2
wait1:
in r16,TWCR
sbrs r16,TWINT
rjmp wait1
while (!(TWCR &
(1<<TWINT)));
Wait for TWINT Flag set. This indicates
that the START condition has been
transmitted.
3
in r16,TWSR
andi r16, 0xF8
cpi r16, START
brne ERROR
if ((TWSR & 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 TWDR, r16
ldi r16, (1<<TWINT) | (1<<TWEN)
out TWCR, r16
TWDR = SLA_W;
TWCR = (1<<TWINT) |
(1<<TWEN);
Load SLA_W into TWDR Register. Clear
TWINT bit in TWCR to start transmission
of address.
4
wait2:
in r16,TWCR
sbrs r16,TWINT
rjmp wait2
while (!(TWCR &
(1<<TWINT)));
Wait for TWINT Flag set. This indicates
that the SLA+W has been transmitted,
and ACK/NACK has been received.
5
in r16,TWSR
andi r16, 0xF8
cpi r16, MT_SLA_ACK
brne ERROR
if ((TWSR & 0xF8) !=
MT_SLA_ACK)
ERROR();
Check value of TWI Status Register.
Mask prescaler bits. If status different
from MT_SLA_ACK go to ERROR.
ldi r16, DATA
out TWDR, r16
ldi r16, (1<<TWINT) | (1<<TWEN)
out TWCR, r16
TWDR = DATA;
TWCR = (1<<TWINT) |
(1<<TWEN);
Load DATA into TWDR Register. Clear
TWINT bit in TWCR to start transmission
of data.
Atmel ATmega32A [DATASHEET]
Atmel-8155I-ATmega32A_Datasheet_Complete-08/2016
230