Перейти к содержанию
    

Эмулятор 24xx

Господа, никто не делал эмулятор 24xx с использованием TWI? Достаточно эмуляции чтения данных из 24ки.

Честно говоря, что-то лень писать и отлаживать, да и время поджимает. Или подскажите правильный вопрос для гугли, а то чето ничего не попадается...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все. Всем спасибо, асилил сам. Надо было просто кофе попить с утра и проснуться :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все. Всем спасибо, асилил сам. Надо было просто кофе попить с утра и проснуться :)

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

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

Хотя вроде всё работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Хотя вроде всё работает

 

Да вроде так по-быстрому слепил из апнота. Вроде все правильно, только железо дома забыл, щас не проверю.

 

А сравнивать тут нечего - эмулируется только чтение из 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));
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...