217
7679H–CAN–08/08
AT90CAN32/64/128
• 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.
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
1
ldi r16, (1<<TWINT)|
(1<<TWSTA)|
(1<<TWEN)
sts TWCR, r16
TWCR = (1<<TWINT)|
(1<<TWSTA)|
(1<<TWEN)
Send START condition
2
wait1:
lds 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
lds 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
sts TWDR, r16
ldi r16, (1<<TWINT)|
(1<<TWEN)
sts 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:
lds 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
lds 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
sts TWDR, r16
ldi r16, (1<<TWINT)|
(1<<TWEN)
sts TWCR, r16
TWDR = DATA;
TWCR = (1<<TWINT)|(1<<TWEN);
Load DATA into TWDR Register. Clear TWINT
bit in TWCR to start transmission of data
6
wait3:
lds r16,TWCR
sbrs r16,TWINT
rjmp wait3
while (!(TWCR & (1<<TWINT)));
Wait for TWINT flag set. This indicates that
the DATA has been transmitted, and
ACK/NACK has been received.
7
lds r16,TWSR
andi r16, 0xF8
cpi r16, MT_DATA_ACK
brne ERROR
if ((TWSR & 0xF8)!=MT_DATA_ACK)
ERROR();
Check value of TWI Status Register. Mask
prescaler bits. If status different from
MT_DATA_ACK go to ERROR
ldi r16, (1<<TWINT)|
(1<<TWEN) |
(1<<TWSTO)
sts TWCR, r16
TWCR = (1<<TWINT)|
(1<<TWEN) |
(1<<TWSTO);
Transmit STOP condition