Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм CAN-приема
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
DVF
Может ли кто привести алгоритм обработки прерывания CAINT при приеме кадра и собственно чтения байтов из MOb?
Проверили источник прерывания: ошибка или нет. Если нет, то какие шаги далее?
SasaVitebsk
Да собственно никакие. Читаем соответствующий mailbox да и всё. Единственное, что возможно надо также таймаут обрабатывать. Это на случай, чтобы отловить ситуацию когда произошёл обрыв CAN канала.

Если у вас передача сообщения это часть протокола более высокого уровня (Например CAN-Open), то тогда необходима дальнейшая обработка этого протокола.
DVF
Цитата
Единственное, что возможно надо также таймаут обрабатывать. Это на случай, чтобы отловить ситуацию когда произошёл обрыв CAN канала.

Подробнее можно? Имеется ввиду ожидание флага BXOK, если данные с ожидаемой длиной?
ARV
а чего бы вам не использовать готовую атмеловскую билиотеку поддержки CAN? правда, по умолчанию там не по прерываниям, а поллингом все делается... но ежели вы мало-мало покумекаете - не трудно и прерывания сделать smile.gif
DVF
И такой вариант рассматривается, но что-то он мне сложно дается - не тот уровень у меня, однако smile.gif
DVF
Вот код :
Код
void can_Set_mob_Rx(void)
{
    Can_clear_rtr();                                                          
    Can_set_mob(MOB_rx);// Выбор mob: #define Can_set_mob(mob)       { CANPAGE = ((mob) << 4);}
    Can_set_mask_mob();                // Принимать конкретные адреса
    Can_set_dlc(2);                    // Длина пакета 2 байта
    Can_clear_rplv();                    // Без ответа
    CANIDT1 = 0x68;
    CANIDT2 = 0x00;
    CANIDT3 = 0x00;
    CANIDT4 = 0x00;
    Can_config_rx();                    // На прием
}

void can_Set_mob_Tx(void)
{
    Can_set_mob(MOB_tx);                // Выбор mob
    CANIDT1 = 0x66;
    CANIDT2 = 0x00;
    CANIDT3 = 0x00;
    CANIDT4 = 0x00;
    Can_set_dlc(2);                    // Длина пакета 2 байта
    for(U8 i = 0; i < (Can_get_dlc()); i++)    CANMSG = Tx_Data[i];    // запись в CANMSG
    Can_clear_rtr();
    Can_clear_status_mob();                // Очищаем все флаги регистра состояния MOb
Can_config_tx();                    // Передача
}

Передача инициируется событием. Все проходит хорошо - отправляется и принимается вторым узлом.
Далее, я считал, что MOb на прием уже сконфигурирован и достаточно очистить CANSTMOB = 0x00; Прием у меня по прерыванию от RXOK. Но оно не возникает, пока не будет выполнено перед этим: Can_set_mob(MOB_rx); Это правильное поведение? А если я несколько MOb настрою на прием, то мне для каждого придется выполнить этот шаг? Или надо так понимать, что делая CANSTMOB = 0x00; я очищал страницу MOb на передачу? Совсем запутался...

Забегая вперед хочу спросить, как моделировать ошибки в CAN, чтобы можно было заняться отладкой при из возникновении? Может ссылки есть?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.