Assembly code example - slave receiver mode, Atmega163(l) – Rainbow Electronics ATmega163L User Manual
Page 83

ATmega163(L)
83
Assembly Code Example - Slave Receiver Mode
;Part specific include file and TWI include file must be included.
; <Initialize registers TWAR and TWBR>
ldi
r16, (1<<TWINT) | (1<<TWEA) | (1<<TWEN)
out
TWCR, r16
; Enable TWI in Slave Receiver Mode
; <Receive START condition and SLA+W>
wait10:in
r16,TWCR
; Wait for TWINT flag set. This indicates that
sbrs
r16, TWINT
; START followed by SLA+W has been received
rjmp
wait10
in
r16, TWSR
; Check value of TWI Status Register. If status
cpi
r16, SR_SLA_ACK
; different from SR_SLA_ACK, go to ERROR
brne
ERROR
ldi
r16, (1<<TWINT) | (1<<TWEA) | (1<<TWEN)
out
TWCR, r16
; Clear TWINT bit in TWCR to start reception of first
; data byte. Setting TWEA indicates that
; ACK should be returned after receiving first data byte
wait11: in
r16,TWCR
; Wait for TWINT flag set. This indicates that
sbrs
r16, TWINT
; data has been received and ACK returned
rjmp
wait11
in
r16, TWSR
; Check value of TWI Status Register. If status
cpi
r16, SR_SLA_ACK
; different from SR_SLA_ACK, go to ERROR
brne
ERROR
ldi
r16, (1<<TWINT) | (1<<TWEA) | (1<<TWEN)
out
TWCR, r16
; Clear TWINT bit in TWCR to start reception
; of data. Setting TWEA causes ACK to be
; returned after reception of next data byte
wait12:in
r16,TWCR
; Wait for TWINT flag set. This indicates that
sbrs
r16, TWINT
; data has been received and ACK returned
rjmp
wait12
in
r16, TWSR
; Check value of TWI Status Register. If status
cpi
r16, SR_DATA_ACK
; different from SR_DATA_ACK, go to ERROR
brne
ERROR
in
r16, TWDR
; Input received data from TWDR.
nop
;<do something with received data>
ldi
r16, (1<<TWINT) | (1<<TWEN)
out
TWCR, r16
; Clear TWINT bit in TWCR to start reception of data.
; Not setting TWEA causes NACK to be
; returned after reception of next data byte
wait13:in
r16,TWCR
; Wait for TWINT flag set. This indicates that
sbrs
r16, TWINT
; data has been received and NACK returned
rjmp
wait13