Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: power-down и CAN
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
jekler
Приветствую! Мучаю LPC2364. Проблема с уходом в power-down mode. Ситуация такая, если усыплять чип с помощью кнопки с отключенным пробуждением от CAN, то все ок, просыпается от внешних прерываний нормально. Но если врубить пробуждение от CAN, то все работает замечательно пока не пришла посылка по CANу, уход в сон больше невозможен. Такое ощущение что где-то что-то сбросить нужно, но непойму где, а пробуждение по CANу все же требуется реализовать. Может кто подскажет куда копать?
В power-down ухожу по таймеру таким образом(пробовал разные комбинации):
Код
    if(CAN_WAKEUP)
     {
      CAN1IER/* = CAN2IER*/ = 0x10;        // Wake-Up Interrupt Enable
      PCONP_SAVE = PCONP;
      PCONP = (1 << 13); //Enable only CAN1
        CAN1MOD |= (1 << 4); //CAN1 Sleep mode
      //CAN2MOD    |= (1 << 4); //CAN2 Sleep mode
     }
    PCON = 2;

    if(CAN_WAKEUP)
    PCONP = PCONP_SAVE;

    ConfigurePLL();
    //CAN1MOD = CAN2MOD = 1; //CAN1-2 Reset
    //CAN1MOD = CAN2MOD = 0; //CAN1-2 Normal mode

    if(CAN_WAKEUP)
    CAN1IER/* = CAN2IER*/ = 0x01;        // Enable receive interrupts
jekler
Неужели никто не сталкивался с таким? sad.gif
вот код прерывания CAN(из примеров Keil):
Код
void CAN_Handler(void) __irq
{    
         
    CANStatus = CAN_RX_SR;
    if ( CANStatus & (1 << 8) )
    {
        CAN1RxCount++;
        CAN_ISR_Rx1();
    }
    if ( CANStatus & (1 << 9) )
    {
        CAN2RxCount++;
        CAN_ISR_Rx2();
    }
    if ( CAN1GSR & (1 << 6 ) )
    {
        /* The error count includes both TX and RX */
        CAN1ErrCount = (CAN1GSR >> 16 );
    }
    if ( CAN2GSR & (1 << 6 ) )
    {
        /* The error count includes both TX and RX */
        CAN2ErrCount = (CAN2GSR >> 16 );
    }

    VICVectAddr = 0;        /* Acknowledge Interrupt */
    return;
}


Вот например по пробуждению по линии EINT0 вызывается вот такая функция:
Код
void EINT0_Handler (void) __irq
{  
EXTINT |= EINT0; /* clear interrupt */
VICVectAddr = 0;
}


EXTINT |= EINT0; вот как будто такой строки не хватает для обнуления прерывания в CAN, но ничего подобного в регистрах не нашел. Что обнулить\сбросить не пойму.
Yaumen
Попробуй при просыпании переинициализировать CAN, хотя бы посбрасывать возможно накопленные ошибки
jekler
Прбовал так, не получается sad.gif
Код
if(CAN_WAKEUP)
     {
      PCONP_SAVE = PCONP;
      PCONP = (1 << 13);
      CAN1MOD = 1;    // Reset CAN
      CAN1GSR = 0;    // Reset error counter when CANxMOD is in reset
      CAN1IER = 0x10;        // Wake-Up Interrupt Enable
      CAN1MOD |= (1 << 4); //CAN1 Sleep mode
     }
    PCON = 2; //Power-down mode

    if(CAN_WAKEUP)
    PCONP = PCONP_SAVE;

    ConfigurePLL();

    if(CAN_WAKEUP)
    {
     CAN1MOD = 1;    // Reset CAN
     CAN1MOD = 0;   //Normal mode
     CAN1IER = 0x01;// Enable receive interrupts
    }
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.