Нет, не получилось - мастер зависает в том же месте.
Ниже привожу прогу мастера (передача на слейв1 и передача/прием на слейв2
осуществляются в пределах одного обработчика прерывания таймера (Timer/Counter2 Переполнение)).
Мастер (передача 1-го байта на слейв 1):
Код
To_sl_1:ldi temp,$14;Установка скорости передачи= 71429 Hz
out TWBR,temp
ldi temp,$00
out TWSR,temp
Pusk_Sn:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp;Посылка сигнала "START"
wait1n: in temp,TWCR;Ожидаем ответа от интерфейса TWI
sbrs temp,TWINT
rjmp wait1n
SLA_Wn: ldi temp,$20;Загрузка адреса слейв1 + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp
wait2n: in temp,TWCR;Ожидаем ответа от слейв1
sbrs temp,TWINT
rjmp wait2n
;Начинаем передавать данные:
DATA_n: out TWDR,Byte_1 ;Отправка: Byte 1
rcall Writen
rjmp STOP_n ;Передача данных завершена
;*******************************************************************
Writen: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp
wait3n: in temp,TWCR;Ожидаем ответа от слейв1
sbrs temp,TWINT
rjmp wait3n
ret
;*******************************************************************
;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)
STOP_n: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp
PAUSE_n:ldi temp,$40
p: dec temp
cpi temp,$00
brne p
;*******************************************************************
После этого идет дальнейшее выполнение программы обработчика таймера.
Далее:
Мастер (передача 1-го байта на слейв2, и прием со слейв2 3-х байт):
Код
;*************************
;Передача на слейв 2:
;*************************
ldi temp,$14;Установка скорости передачи= 71429 Hz
out TWBR,temp
ldi temp,$00
out TWSR,temp
Pusk_Sr:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp;Посылка сигнала "START"
wait1r: in temp,TWCR;Ожидаем ответа интерфейса
sbrs temp,TWINT
rjmp wait1r
SLA_Wr: ldi temp,$40;Загрузка адреса слейв 2 + "WRITE"
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp
wait2r: in temp,TWCR;Ожидаем ответа от слейв 2
sbrs temp,TWINT
rjmp wait2r
;Начинаем передавать данные:
DATA_r: out TWDR,Byte_1 ;Отправка: Byte 1
rcall Writer
rjmp STOP_r ;Передача данных завершена
;*******************************************************************
Writer: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp
wait3r: in temp,TWCR;Ожидаем ответа от слейв 2
sbrs temp,TWINT
rjmp wait3r
ret
;*******************************************************************
;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)
STOP_r: ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp
PAUSE: ldi temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП
P_cikl: dec temp
cpi temp,0
brne P_cikl
;Прием данных:
ldi temp,$14;Установка скорости передачи= 71429 Hz
out TWBR,temp
ldi temp,$00
out TWSR,temp
Pusk_R: ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,temp;Посылка сигнала "START"
waitT1: in temp,TWCR;Ожидаем ответа интерфейса
sbrs temp,TWINT
rjmp waitT1
ldi temp,$41;Загрузка адреса слейв 2 + "READ"
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp
waitR2: in temp,TWCR;Ожидаем ответа слейв 2
sbrs temp,TWINT
rjmp waitR2
;*******
;Прием данных:
Data: rcall TW_NT_R ;Прием: Byte 1
in temp,TWDR
sts Byte_1,temp
rcall TW_NT_R ;Прием: Byte 2
in temp,TWDR
sts Byte_2,temp
TWI_DATA_R_NACK:
ldi temp,(1<<TWINT)|(1<<TWEN)
out TWCR,temp
d2: in temp,TWCR
sbrs temp,7
rjmp d2
in temp,TWDR ;Прием: Byte 3
sts Byte_3,temp
rjmp STOP_RD ;Прием данных завершен
;*******************************************************************
TW_NT_R:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
out TWCR,temp
waitRr: in temp,TWCR ;Ожидаем ответа от слейв 2
sbrs temp,TWINT
rjmp waitRr
in temp,TWSR
cpi temp,$50
brne STOP_RD ;Переход, если данные от слейв 2 не получены
ret
;*******************************************************************
STOP_RD:ldi temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
out TWCR,temp
PAUSE2: ldi temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП
P_cikl2:dec temp
cpi temp,$00
brne P_cikl2
;*******************************************************************
Прога слейв1 (прием 1-го байта):
Код
;*******************************************************************
;Режим - подчиненный-приемник:
TWI_Obr:in temp,TWSR
cpi temp,$60;Проверка принятого адреса от мастера
breq Address
cpi temp,$80;Прием данных
breq Data
cpi temp,$00;
breq Sob_00
cpi temp,$F8;
breq Sob_F8
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
;***************************************************
Sob_00: ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWSTO)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
Sob_F8: reti
;*******
Address:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
;*******
;Прием данных:
Data: in Byte_1,TWDR
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
;*******************************************************************
Прога слейв2 (прием 1-го байта и передача 3-х байт мастеру):
Код
;*******************************************************************
;Режим - подчиненный-приемник/передатчик:
TWI_Obr:in temp,TWSR
cpi temp,$60;Проверка принятого адреса от мастера
breq Address
cpi temp,$80;Прием данных
breq DataR
cpi temp,$A8;Передача данных
breq DataT1
cpi temp,$B0;
breq DataT1
cpi temp,$B8;
breq DataT2
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
;*******
Address:ldi XH,$00
ldi XL,$80
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
;*************************
;Прием от мастера:
;*************************
;Прием данных:
DataR: cpi XL,$90
breq DataR_2
in temp,TWDR
st X+,temp
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
DataR_2:in temp,TWDR
st X,temp
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
;*************************
;Передача мастеру:
;*************************
;Передача данных:
DataT1: ldi YH,$00
ldi YL,$90
ld temp,Y+
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
DataT2: cpi YL,$A0
breq t4_1
ld temp,Y+
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
t4_1: ld temp,Y
out TWDR,temp
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
out TWCR,temp
reti
;*******************************************************************