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

XMega TWI

Не могу понять почему не идёт обмен с дисплеем. Возможно 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 дисплей работает.

 

Заранее огромное спасибо.

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


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

Не могу понять почему не идёт обмен с дисплеем. Возможно 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;
}

 

Вызываете эти функции до тех пор, пока не вернет единицу, тогда произойдет завершение записи или чтения.

Просто для моего случая было недопустимо использовать прерывания и в цикле ждать окончания чтения/записи.

Но суть понять можно.

 

 

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


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

что-то у вас совсем не то.

 

Спасибо, попробую, это наверное 20 вариант, возможно мозг уже кипел.

 

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


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

Спасибо, попробую, это наверное 20 вариант, возможно мозг уже кипел.

 

 

да twi контроллеры это нечто :)

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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