AVR TWI и LM75A - виснет.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

AVR TWI и LM75A - виснет.

Сообщение YS »

Подключаю LM75A к ATmega48 через аппаратный TWI/I2C:

Код: Выделить всё

void WaitTWI(uint8_t step)
{
  //Step/error code
  DisplayTemp(50+step);

  while (!(TWCR & (1<<TWINT)));
}

int8_t LM75_ReadTemp(void)
{
  uint8_t lm_hi, lm_lo;

  //Turn on internal pull-up
  DDRC&=~((1<<PC4) | (1<<PC5));
  PORTC=(1<<PC4) | (1<<PC5);

  TWSR=0;
  //100KHz SCL
  TWBR=32;

  //START
  TWCR=(1<<TWEN) | (1<<TWSTA) | (1<<TWINT);
  WaitTWI(1);

  //SLA+R
  TWDR=SENSOR_ADDR | TWI_READ;
  TWCR=(1<<TWEN) | (1<<TWINT);
  WaitTWI(2);

  if (TWSR!=TWI_SLA_SUCCESS)
    return LM75_ERROR; //No device or device error

  //1st read + ACK
  TWCR=(1<<TWEN) | (1<<TWEA) | (1<<TWINT);
  WaitTWI(3);
  lm_hi=TWDR;

  //2nd read + NACK
  TWCR=(1<<TWEN) | (1<<TWINT);
  WaitTWI(4);
  lm_lo=TWDR;

  //STOP
  TWCR=(1<<TWEN) | (1<<TWSTO) | (1<<TWINT);
  WaitTWI(5); //<--- HANGS HERE

  //Turn TWI off
  TWCR=0;

  return (int8_t)(((((uint16_t)lm_hi << 8) | (uint16_t)lm_lo) >> 5)/8);
}
Виснет при отправке STOP, т.е., железо не взводит TWINT.

Подтяжка на линиях SDA/SCL 2K, пробовал с внутренними резисторами порта. Пробовал два экземпляра LM75A.

Лыжи определенно не едут, так что взываю к бывалым людям.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: AVR TWI и LM75A - виснет.

Сообщение YS »

Проблема решена - перечитал даташит.

Note that TWINT is NOT set after a STOP condition has been sent.

- стр. 218 п. 7
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»