реклама на сайте
подробности

 
 
> XMega TWI, Не могу запустить TIC154
Getmanov
сообщение Jul 20 2010, 19:05
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 28-01-08
Из: Николаев
Пользователь №: 34 507



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

Заранее огромное спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
koljakh
сообщение Jul 22 2010, 07:27
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 14-07-09
Из: Украина, Киев
Пользователь №: 51 248



Цитата(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;
}


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

Go to the top of the page
 
+Quote Post
Getmanov
сообщение Jul 22 2010, 08:13
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 28-01-08
Из: Николаев
Пользователь №: 34 507



Цитата(koljakh @ Jul 22 2010, 10:27) *
что-то у вас совсем не то.


Спасибо, попробую, это наверное 20 вариант, возможно мозг уже кипел.
Go to the top of the page
 
+Quote Post
koljakh
сообщение Jul 22 2010, 08:29
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 14-07-09
Из: Украина, Киев
Пользователь №: 51 248



Цитата(Getmanov @ Jul 22 2010, 11:13) *
Спасибо, попробую, это наверное 20 вариант, возможно мозг уже кипел.



да twi контроллеры это нечто smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 23:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016