Цитата(Getmanov @ Jul 20 2010, 22:05)

Не могу понять почему не идёт обмен с дисплеем. Возможно 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;
}
Вызываете эти функции до тех пор, пока не вернет единицу, тогда произойдет завершение записи или чтения.
Просто для моего случая было недопустимо использовать прерывания и в цикле ждать окончания чтения/записи.
Но суть понять можно.