vesago 0 21 июля, 2006 Опубликовано 21 июля, 2006 · Жалоба К моему глубокому стыду не могу запустить мастера хоть тресни. Осциллографом не смотрел. У меня две платы на одной мега 128L(кварц 7.3 питание 3.3) на другой 168 (кварц 14.7). И там и там стоит FM31256. Проверяю на обоих. До этого эту микрушку пользовал в проекте на LPC2214. Там i2c очень похож. Я тамошний драйвер подогнал под регистры авр и вставил в проект - не прошло. Тогда воспользовался хардверным драйвером, любезно выложенным haker_fox. Тоже не идет. Валят ошибки буквально с посылки старта. Уж очень не хочется софтовый применять. Сразу скажу - фактически это мое первый опыт в авр. Скажите - вообще этот модуль нормально работает в указаных чипах? Надо ли ноги конфигурировать на ввод/вывод. Может он где дополнительно включается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 21 июля, 2006 Опубликовано 21 июля, 2006 · Жалоба Нормальный там TWI, только с норовом (очень навороченный) 1. Банальный вопрос, о подтяжках не забыли? 2.Линии не перепутали?(помниться был секс из-за разводчика) 3.Там после каждой транзакции в статусе устанавливается код завершения, нормальный или ошибка. Выводите его на дисплей или в УАРТ. Моментально выловите источник проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 21 июля, 2006 Опубликовано 21 июля, 2006 · Жалоба Когда я первый раз пробовал работать с AVR'овским аппаратным TWI - ничего не получилось, пришлось писать софтварный драйвер. В последствии оказалось, что на тестовом девайсе были просто выжжены TWI пины.. PS: а вообще неплохо бы TWI с JTAG'ом отлаживать, сразу статус регистр видно. Как верно отметил beer_warrior TWI нормальный полноценный I2C интерфейс, только со спец. наворотами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 22 июля, 2006 Опубликовано 22 июля, 2006 · Жалоба Спасибо, ребята. А то я начал подумывать, что он у АВР вообще не работает. Сегодня попробую - взял у приятеля жтаг. От отчаяния чета не подумал, что неплохо бы посмотреть что получается в статусном регистре. Быстрее было бы наверное софтовый написать, да дело принципа. Разводку и прочее сперва проверил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 22 июля, 2006 Опубликовано 22 июля, 2006 · Жалоба Посмотрел вышеупомянутый драйвер 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(;;); } Удачи Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 23 июля, 2006 Опубликовано 23 июля, 2006 · Жалоба Спасибо, большое, defunct. Запустился TWI. Мои выводы: TWI не переносит некорректных изменений TWCR. В моей версии в обработчике прерывания я крутил старты и стопы без добавления (1 << TWEN)|(1 << TWINT); Последнюю строку перед выходом из обработчика добавлял. Из-за этого проц просто зависал в обрботчике - ужас. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться