Емельянов Эдуард Владимирович (eddy_em) wrote in ru_radio_electr,
Емельянов Эдуард Владимирович
eddy_em
ru_radio_electr

Category:

CAN на STM32F042

Смотрю в книгу RM, а вижу...
Что-то не получается у меня правильно сбрасывать коды ошибок, которые быстро накапливаются в том случае, если на линии нет никого, кто принял бы сообщение. В обработчике прерывания делаю так:
...
    if(CAN->ESR){ // Error
        last_err_code = (CAN->ESR & CAN_ESR_LEC) >> 4;
        MSG("CAN->ESR: ");
        printu(CAN->ESR);
        newline();
        CAN->ESR = 0;
    }
...

(MSG и далее — отладочные сообщения). Пока выдается отладочное сообщение, счетчик ошибок успевает инкрементироваться на 2 (последовательно получаю числа 0x200030, 0x400030, 0x600031 и далее 0x800033 вплоть до перезапуска watchdog'ом).
Помню, сталкивался с подобной проблемой 10 лет назад, когда на PICе пробовал реализовать CAN, но там была возможность периодически обнулять счетчики ошибок.
В надежде остановить автогенерацию посылок при ошибках установил бит CAN_MCR_NART регистра CAN->MCR. Это не помогло (но CAN->ESR принимал теперь значения 0x80030 при первом входе в прерывание и далее 0x80000 вплоть до перезагрузки).

В общем, так как ничего не помогало, решил я вставить в регулярно (из основного цикла main) запускаемой процедуры проверки флагов и ошибок CAN вот это:
if(CAN->ESR & (CAN_ESR_BOFF | CAN_ESR_EPVF | CAN_ESR_EWGF)){ // much errors - restart CAN BUS
        MSG("bus-off, restarting\n");
        CAN->TSR |= CAN_TSR_ABRQ0; // request abort for mailbox0
        // reset CAN bus
        RCC->APB1RSTR |= RCC_APB1RSTR_CANRST;
        RCC->APB1RSTR &= ~RCC_APB1RSTR_CANRST;
        CAN_setup();
    }

Теперь сообщение бесконечно долго не болтается, если на шине нет читателя.
Но все это очень странно: я считал, что, судя по даташиту, поведение должно быть совершенно другим...
Subscribe
  • Post a new comment

    Error

    Comments allowed for members only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 12 comments