Rst7 5 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Господа, никто не делал эмулятор 24xx с использованием TWI? Достаточно эмуляции чтения данных из 24ки. Честно говоря, что-то лень писать и отлаживать, да и время поджимает. Или подскажите правильный вопрос для гугли, а то чето ничего не попадается... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Все. Всем спасибо, асилил сам. Надо было просто кофе попить с утра и проснуться :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Все. Всем спасибо, асилил сам. Надо было просто кофе попить с утра и проснуться :) А в чём делал. Я тоже пару раз делал. Может сравним. :) Может я чего не так накондырябал. :) Хотя вроде всё работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба А в чём делал. Я тоже пару раз делал. Может сравним. :) Может я чего не так накондырябал. :) Хотя вроде всё работает Да вроде так по-быстрому слепил из апнота. Вроде все правильно, только железо дома забыл, щас не проверю. А сравнивать тут нечего - эмулируется только чтение из 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)); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться