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

 
 
> Зависает TWI в SAM7
jhoo
сообщение Dec 22 2005, 07:39
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 19-04-05
Пользователь №: 4 288



Использую TWI для работы с еепром и ртц. Все работает как положено. Параллельно работает тамер 0, в обработчике прерывания которого выполняю некоторую работу. Вот что заметил - если прерывание таймера длится относительно долго (точный предел не знаю, у меня около 80мкс), то после выхода из него и возврата к продолжению работы с еепром TWI зависает на проверке статуса готовности принятых данных. Если длительность прерывания таймера маленькая, то все нормально.
Программа выглядит примерно так:

Код
main()
{
//.......
    while (1)
    {
         EEPR_ReadData(...);
    }

}

void Timer0IRQ(void)
{
// что-то делаю (~80 мкс)
}

int AT91F_TWI_ReadData(LPVOID Data, int Size)
{
    int Error=0;
    int Status,Count=0;
    AT91PS_TWI pTwi = AT91C_BASE_TWI;
    BYTE *pData = (BYTE*)Data;

    pTwi->TWI_MMR |= AT91C_TWI_MREAD;

    {
         pTwi->TWI_CR = AT91C_TWI_START;
         for(Count=0; Count<Size; Count++)
         {
            if (Count == (Size - 1))    pTwi->TWI_CR = AT91C_TWI_STOP;

            Status = pTwi->TWI_SR;
            while (!(Status & AT91C_TWI_RXRDY))
            {
                Status = pTwi->TWI_SR;       //  <---------- В этом цикле происходит зависание
            }
            *pData++ = pTwi->TWI_RHR;
        }
    }

    return 0;
}


Т.е. получается что TWI не любит когда его прерывают на длительное время? Как с этим бороться, ведь теоретически прерывания могут длиться любое время.
Go to the top of the page
 
+Quote Post



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

 


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


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