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

Помогите запустить TWI

К моему глубокому стыду не могу запустить мастера хоть тресни. Осциллографом не смотрел. У меня две платы на одной мега 128L(кварц 7.3 питание 3.3) на другой 168 (кварц 14.7). И там и там стоит FM31256. Проверяю на обоих. До этого эту микрушку пользовал в проекте на LPC2214. Там i2c очень похож. Я тамошний драйвер подогнал под регистры авр и вставил в проект - не прошло. Тогда воспользовался хардверным драйвером, любезно выложенным haker_fox. Тоже не идет. Валят ошибки буквально с посылки старта. Уж очень не хочется софтовый применять. Сразу скажу - фактически это мое первый опыт в авр. Скажите - вообще этот модуль нормально работает в указаных чипах? Надо ли ноги конфигурировать на ввод/вывод. Может он где дополнительно включается?

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


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

Нормальный там TWI, только с норовом (очень навороченный)

1. Банальный вопрос, о подтяжках не забыли?

2.Линии не перепутали?(помниться был секс из-за разводчика)

3.Там после каждой транзакции в статусе устанавливается код завершения, нормальный или ошибка. Выводите его на дисплей или в УАРТ. Моментально выловите источник проблемы.

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


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

Когда я первый раз пробовал работать с AVR'овским аппаратным TWI - ничего не получилось, пришлось писать софтварный драйвер. В последствии оказалось, что на тестовом девайсе были просто выжжены TWI пины..

 

PS: а вообще неплохо бы TWI с JTAG'ом отлаживать, сразу статус регистр видно. Как верно отметил beer_warrior TWI нормальный полноценный I2C интерфейс, только со спец. наворотами.

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


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

Спасибо, ребята. А то я начал подумывать, что он у АВР вообще не работает. Сегодня попробую - взял у приятеля жтаг. От отчаяния чета не подумал, что неплохо бы посмотреть что получается в статусном регистре. Быстрее было бы наверное софтовый написать, да дело принципа. Разводку и прочее сперва проверил.

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


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

Посмотрел вышеупомянутый драйвер i2c.. Там что-то сильно сложно все imho, возможно в этом и причина. Задержка i2c делается там каким-то странным образом.

Наскоро сделал пример, проверил с имеющейся под рукой AT24C512:

 

#define U8 unsigned char
#define i2cRead 1
#define i2cWrite 0
#define ACK  0    // continue receiving
#define NACK 1    // end of receiving
#define i2c_processing (!( TWCR & (1 << TWINT)))


void I2C_hw_init(void)
{
  TWDR = 0;
  TWAR = 0;
  TWSR = 0; // setting prescaler to 1
  TWBR = 12; // Baud Rate = Fosc / (16 + 2*(TWBR)*4^TWPS,
             // при Fosc=11.059 и TWBR = 12, Baud Rate ~ 100Khz
  TWCR = (1 << TWEN);
}


void I2C_hw_start(void)
{
  TWCR = (1 << TWEN)|(1 << TWSTA)|(1 << TWINT);
  while (i2c_processing)
    __delay_cycles(1);
}

void I2C_hw_stop(void)
{
  TWCR = (1 << TWEN)|(1 << TWSTO)|(1 << TWINT);
}

U8 I2C_hw_send(U8 value)
{
  TWDR = value;
  TWCR = (1 << TWEN)|(1 << TWINT);
  while (i2c_processing)
    __delay_cycles(1);
  return TWSR;
}

U8 I2C_hw_rec(U8 TransferStatus)
{
  if (TransferStatus == ACK)
    TWCR = (1 << TWEN)|(1 << TWEA)|(1 << TWINT);
  else
    TWCR = (1 << TWEN)|(1 << TWINT);

  while (i2c_processing)
     __delay_cycles(1);
  return TWDR;
}

inline U8 I2C_hw_SetAddressDir(U8 Address, U8 dir)
{
  return I2C_hw_send( (Address & 0xFE) | (dir != 0) );
}

 

 

Пример применения:

 

 

int main( void )
{ // Test AT24C512
  volatile U8 i2c_data;

// Hardware test
  I2C_hw_init();

  I2C_hw_start();
  I2C_hw_SetAddressDir( 0xA0, i2cWrite ); // <-- AT24
  I2C_hw_send( 0x00 );    
  I2C_hw_send( 0x26 );   
  I2C_hw_start();
  I2C_hw_SetAddressDir( 0xA0, i2cRead );
  i2c_data = I2C_hw_rec( ACK );
  i2c_data = I2C_hw_rec( ACK );
  i2c_data = I2C_hw_rec( NACK );
  I2C_hw_stop();

  for(;;);

}

 

Удачи

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


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

Спасибо, большое, defunct. Запустился TWI. Мои выводы: TWI не переносит некорректных изменений TWCR. В моей версии в обработчике прерывания я крутил старты и стопы без добавления (1 << TWEN)|(1 << TWINT); Последнюю строку перед выходом из обработчика добавлял. Из-за этого проц просто зависал в обрботчике - ужас.

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


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

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

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

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

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

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

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

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

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

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