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

 
 
 
Reply to this topicStart new topic
> ATTINY2313A регистр USIBR – USI Buffer Register, Когда загружается из USIDR – USI Data Register?
sigmaN
сообщение Dec 18 2014, 17:01
Сообщение #1


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



В даташите написано, что
Цитата
The content of the USI Data Register is loaded to the USI Buffer Register when the transfer has
been completed.
мне не очень понятно как определить что transfer has been completed?
Я вот реализую i2c сниффер и для того чтобы поймать ACK я модифицирую счетчик чтобы словить прерывание по переполнению через два тика счётчика. Это уже считается что transfer has been completed? Просто тут не очень пока стабильно ACK ловится...Но может быть дело конечно и не в этом, щас я разбираюсь. Но вопрос всё равно остаётся.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 18 2014, 21:01
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



В общем действительно подтверждается, что все дело в этом буфере...
Меняю USIDR на USIBR и начинается какая-то ерунда.... А раз ерунда начинается при изменении в одном месте, то вывод очевиден )

На всякий случай код для конкретики.
Код
#define USIBR _SFR_IO8(0x000)

USICR = (1 << USISIE) | (1 << USIOIE) | (1 << USIWM1 ) | (1 << USIWM0) | (1 << USICS1);

ISR(USI_START_vect)
{        
    USISR &=~(15);
    USISR |=(15);
    i2c_state = I2C_START_WAITING;    
    buf_add_byte(start);        
    USISR |= (1 << USISIF);
}

ISR(USI_OVERFLOW_vect)
{    
    USISR &=~(15);    
    if( i2c_state & 0x03 )
    {        
        USISR |= (14);
        //buf_add_byte(USIBR);
        buf_add_byte(USIDR);
        i2c_state = I2C_ACK_RECEIVING;                
    }    
    else if( i2c_state == I2C_ACK_RECEIVING )
    {
        //if( USIBR & 0x1 )
        if( USIDR & 0x1 )
            buf_add_byte(nack);
        else
            buf_add_byte(ack);
        i2c_state = I2C_DATA_RECEIVING;
    }
    else if( i2c_state ==  I2C_START_WAITING )
    {
        i2c_state = I2C_ADDR_RECEIVING;
    }
    USISR |= (1 << USIOIF);
}


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 10:52
Рейтинг@Mail.ru


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