set. Writing a one to TWINT clears the flag. The TWI will then commence executing
whatever operation was specified by the TWCR setting.
In the following an assembly and C implementation of the example is given. Note that
the code below assumes that several definitions have been made, for example by using
include-files.
Assembly code example
C example
Comments
ldi
r16, (1<<TWINT)|(1<<TWSTA)|
TWCR = (1<<TWINT)|(1<<TWSTA)|
1
2
Send START condition
(1<<TWEN)
TWCR, r16
(1<<TWEN)
out
wait1:
while (!(TWCR & (1<<TWINT)))
Wait for TWINT Flag set. This indicates
that the START condition has been
transmitted
in
r16,TWCR
;
sbrs r16,TWINT
rjmp wait1
in
andi r16, 0xF8
cpi r16, START
brne ERROR
r16,TWSR
if ((TWSR & 0xF8) != START)
3
Check value of TWI Status Register. Mask
prescaler bits. If status different from
START go to ERROR
ERROR();
ldi
out
ldi
out
r16, SLA_W
TWDR = SLA_W;
Load SLA_W into TWDR Register. Clear
TWINT bit in TWCR to start transmission
of address
TWDR, r16
TWCR = (1<<TWINT) | (1<<TWEN);
r16, (1<<TWINT) | (1<<TWEN)
TWCR, r16
wait2:
while (!(TWCR & (1<<TWINT)))
4
5
Wait for TWINT Flag set. This indicates
that the SLA+W has been transmitted,
and ACK/NACK has been received.
in
r16,TWCR
;
sbrs r16,TWINT
rjmp wait2
in
r16,TWSR
if ((TWSR & 0xF8) != MT_SLA_ACK)
Check value of TWI Status Register. Mask
prescaler bits. If status different from
MT_SLA_ACK go to ERROR
andi r16, 0xF8
ERROR();
cpi
r16, MT_SLA_ACK
brne ERROR
ldi
out
ldi
out
r16, DATA
TWDR = DATA;
Load DATA into TWDR Register. Clear
TWINT bit in TWCR to start transmission
of data
TWDR, r16
TWCR = (1<<TWINT) | (1<<TWEN);
r16, (1<<TWINT) | (1<<TWEN)
TWCR, r16
wait3:
while (!(TWCR & (1<<TWINT)))
6
7
Wait for TWINT Flag set. This indicates
that the DATA has been transmitted, and
ACK/NACK has been received.
in
r16,TWCR
;
sbrs r16,TWINT
rjmp wait3
in
r16,TWSR
if ((TWSR & 0xF8) != MT_DATA_ACK)
Check value of TWI Status Register. Mask
prescaler bits. If status different from
MT_DATA_ACK go to ERROR
andi r16, 0xF8
ERROR();
cpi
r16, MT_DATA_ACK
brne ERROR
ldi
out
r16, (1<<TWINT)|(1<<TWEN)|
TWCR = (1<<TWINT)|(1<<TWEN)|
(1<<TWSTO);
Transmit STOP condition
(1<<TWSTO)
TWCR, r16
182
ATmega32(L)
2503J–AVR–10/06