Цитата(SasaVitebsk @ Jan 17 2008, 10:53)

А в чём делал. Я тоже пару раз делал. Может сравним.

Может я чего не так накондырябал.

Хотя вроде всё работает
Да вроде так по-быстрому слепил из апнота. Вроде все правильно, только железо дома забыл, щас не проверю.
А сравнивать тут нечего - эмулируется только чтение из 2402. И когда успешно вычитан блок, работа заканчивается (специфика устройства такая). Да и никаких таймаутов, просто железно включен WDT, если устройство, для которого эмулируется 24ка не вычитала данные за приемлемое время, то мой камень сбрасывается, сбрасывает устройство и все сначала. Я ж говорю, все по-быстрому...
Код
static char adr24=0;
extern char data24[];
static char adrp24=0;
#pragma vector=TWI_vect
__interrupt void TWI_ISR( void )
{
char c;
switch (TWSR)
{
case TWI_STX_ADR_ACK: // Own SLA+R has been received; ACK has been returned
if (adrp24!=sizeof(adr24)) goto L_TWI_BREAK;
case TWI_STX_DATA_ACK: // Data byte in TWDR has been transmitted; ACK has been received
c=adr24;
TWDR = data24[c++];
adr24=c;
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to send byte
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //
(0<<TWWC); //
break;
case TWI_SRX_ADR_ACK: // Own SLA+W has been received ACK has been returned
adrp24=0;
// Dont need to clear TWI_S_statusRegister.generalAddressCall due to that it is the default state.
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to send byte
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Expect ACK on this transmission
(0<<TWWC); //
break;
case TWI_SRX_ADR_DATA_ACK: // Previously addressed with own SLA+W; data has been received; ACK has been returned
c=TWDR;
if (adrp24<sizeof(adr24))
{
((char*)&adr24)[adrp24++]=c;
}
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to send byte
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Send ACK after next reception
(0<<TWWC); //
break;
case TWI_STX_DATA_NACK: // Data byte in TWDR has been transmitted; NACK has been received.
TWCR=0;
break;
default:
case TWI_SRX_GEN_DATA_ACK: // Previously addressed with general call; data has been received; ACK has been returned
case TWI_SRX_GEN_ACK: // General call address has been received; ACK has been returned
L_TWI_BREAK:
adrp24=0;
case TWI_SRX_STOP_RESTART: // A STOP condition or repeated START condition has been received while still addressed as Slave
TWCR = (1<<TWEN)| // Enable TWI-interface and release TWI pins
(1<<TWIE)|(1<<TWINT)| // Disable Interupt
(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Do not acknowledge on any new requests.
(0<<TWWC); //
break;
}
}
void Init_TWI(void)
{
TWAR=0xA0;
TWDR=0xFF;
TWCR = (1<<TWEN)| // Enable TWI-interface and release TWI pins.
(1<<TWIE)|(1<<TWINT); // Enable TWI Interupt.
__enable_interrupt();
}
void Disable_TWI(void)
{
TWCR=0;
}
UREG IsEEREADinProgress(void)
{
return(TWCR&(1<<TWEN));
}
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин