Getmanov 0 20 июля, 2010 Опубликовано 20 июля, 2010 · Жалоба Не могу понять почему не идёт обмен с дисплеем. Возможно all поможет. Мой код: Работа с TWI: #include <ioavr.h> #include <intrinsics.h> #pragma vector = TWIC_TWIM_vect // Прерывание по приёму. __interrupt void TWIC_TWIM_foo(void) { TWIC.MASTER.STATUS = TWI_MASTER_WIF_bm; } void TWI_MasterInit(TWI_t *twi, unsigned char baudRateRegisterSetting) { twi->MASTER.CTRLA = TWI_MASTER_INTLVL_LO_gc | TWI_MASTER_WIEN_bm | TWI_MASTER_ENABLE_bm; // Низкий уровень пркрываний | Разрешено прерывание по передаче | Разрешение работы twi->MASTER.BAUD = baudRateRegisterSetting; // Скорость передачи twi->MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc; // Шинf в IDLE } void TWI_Send_Start(TWI_t *twi, unsigned char Address) { while ((twi->MASTER.STATUS & TWI_MASTER_BUSSTATE_IDLE_gc) == 0); // Ждём освобождения шигы twi->MASTER.ADDR = Address; // Передать СТАРТ и АДРЕС } void TWI_Send_Stop(TWI_t *twi) { twi->MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc; // Передать СТОП } void TWI_Write(TWI_t *twi, unsigned char data) { if (twi->MASTER.STATUS & TWI_MASTER_WIF_bm) // Проверка флага прерывание по приёму twi->MASTER.STATUS = TWI_MASTER_WIF_bm; // если надо очистка twi->MASTER.DATA = data; // Запись данных } Использование: TWI_MasterInit(&TWIC, 5); // Инициализация TWI_Send_Start(&TWIC, TIC13364_ADDR); TWI_Write(&TWIC, 0x40); /* Запись настроек и .... */ TWI_Send_Stop(&TWIC); Изменение скорости никак не влияет. При этом железо точно в порядке, так как с программным I2C дисплей работает. Заранее огромное спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
koljakh 0 22 июля, 2010 Опубликовано 22 июля, 2010 · Жалоба Не могу понять почему не идёт обмен с дисплеем. Возможно all поможет. Мой код: ... Изменение скорости никак не влияет. При этом железо точно в порядке, так как с программным I2C дисплей работает. Заранее огромное спасибо. что-то у вас совсем не то. Вот код для работы с DS1337 Там можно все упростить для вашего случая. #define DS1337_ADDR 0x68 #define TWI_MASTER_WRITE 0 #define TWI_MASTER_READ 1 void init_rtc(void) { TWIC_CTRL = 0; // TWI Common Control Register TWIC_MASTER_CTRLB = 0; // Control Register B TWIC_MASTER_BAUD = 155; // Baurd Rate Control Register TWIC_MASTER_CTRLA = TWI_MASTER_ENABLE_bm; // Control Register A TWIC_MASTER_STATUS = TWI_MASTER_BUSSTATE_IDLE_gc; // Status Register } unsigned char rtc_dc1337_write(unsigned char addr, unsigned char *data) { static unsigned char rtc_state=0; unsigned char ret_val=0; if(rtc_state==0) { TWIC_MASTER_STATUS = TWI_MASTER_BUSSTATE_IDLE_gc; // Status Register TWIC_MASTER_ADDR = (DS1337_ADDR<<1) | TWI_MASTER_WRITE; rtc_state=1; } else if(rtc_state==1) { if((TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm)) { TWIC_MASTER_CTRLC = TWI_MASTER_CMD_RECVTRANS_gc; TWIC_MASTER_DATA = addr; rtc_state=2; } } else if(rtc_state==2) { if((TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm)) { TWIC_MASTER_CTRLC = TWI_MASTER_CMD_RECVTRANS_gc; TWIC_MASTER_DATA = *data; rtc_state=3; } } else if(rtc_state==3) { if((TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm)) { TWIC_MASTER_CTRLC = TWI_MASTER_CMD_RECVTRANS_gc; TWIC_MASTER_CTRLC = TWI_MASTER_CMD_STOP_gc; rtc_state=4; } } else if(rtc_state==4) { rtc_state=0; ret_val=1; } return ret_val; } //******************************************************************* unsigned char rtc_dc1337_read(unsigned char addr, unsigned char *data) { unsigned char ret_val=0; static unsigned char rtc_state=0; if(rtc_state==0) { TWIC_MASTER_STATUS = TWI_MASTER_BUSSTATE_IDLE_gc; TWIC_MASTER_ADDR = (DS1337_ADDR<<1) | TWI_MASTER_WRITE; rtc_state=1; } else if(rtc_state==1) { if((TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm)) { TWIC_MASTER_CTRLC = TWI_MASTER_CMD_RECVTRANS_gc; TWIC_MASTER_DATA = addr; rtc_state=2; } } else if(rtc_state==2) { if((TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm)) { TWIC_MASTER_CTRLC = TWI_MASTER_CMD_STOP_gc; rtc_state=3; } } else if(rtc_state==3) { TWIC_MASTER_ADDR = (DS1337_ADDR<<1) | TWI_MASTER_READ; rtc_state=4; } else if(rtc_state==4) { if((TWIC_MASTER_STATUS & TWI_MASTER_RIF_bm)) { *data = TWIC_MASTER_DATA; TWIC_MASTER_CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc; rtc_state=5; ret_val=1; } } else if(rtc_state==5) { rtc_state=0; } return ret_val; } Вызываете эти функции до тех пор, пока не вернет единицу, тогда произойдет завершение записи или чтения. Просто для моего случая было недопустимо использовать прерывания и в цикле ждать окончания чтения/записи. Но суть понять можно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Getmanov 0 22 июля, 2010 Опубликовано 22 июля, 2010 · Жалоба что-то у вас совсем не то. Спасибо, попробую, это наверное 20 вариант, возможно мозг уже кипел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
koljakh 0 22 июля, 2010 Опубликовано 22 июля, 2010 · Жалоба Спасибо, попробую, это наверное 20 вариант, возможно мозг уже кипел. да twi контроллеры это нечто :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться