Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT90CAN128 & CAN: проясните пожалуйста
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
Kitsok
Всем привет!

Бьюсь, бьюсь - не получается.

Вот настроил я контроллер, настроил MOB, включил передачу, а вот дальше вопросы:

1. Пока идет передача, в соответствующем битике CANENn будет 1. Как попытка передачи закончилась - скидывается в 0. Это так?
2. Если все успешно - понятно, CANEN в нуле, CANMOBST == (1<<TXOK).
3. Если не все ОК, то CANMOBST содержит флаг соответствующую ошибку. В случае с передачей, как я понимаю, это либо BERR, либо AERR. Это так?
4. А вот дальше, если ошибка, в особенности, AERR, контроллер должен повторить попытку? И как это отследить?
5. А если после очистки CANENn CANMOBST содержит нуль, то это что значит?

Подскажите пожалуйста, бьюсь вторую ночь, не могу наладить передачу n-фреймов без пауз друг за дружкой.

Собственно, вот код.
Код
BOOL can_tx( char mob,   CAN_packet *packet)
{
signed char ret=0;
unsigned char status;

/* Check if MOB is available by CANEN2 register */
if (CANEN2 & 0x02)
  {
   /* CANEN2 is set, MOB is busy. Exit */
   return -20;
  }
/* MOB is vacant, disable interrupts */
cli();

/* Select MOB1 page */
Can_set_mob(1);

/* Clear MOB status, IDT, IDM */
Can_mob_abort();
Can_clear_status_mob();

/* Clear IDT (RTR, RBnTAG) and mask  */
CANIDT1=CANIDT2=CANIDT3=CANIDT4=0;
/* Clear IDM (not really sure if it's actual in TX) */
CANIDM1=CANIDM2=CANIDM3=CANIDM4=0;

/* Setup MOB. Length and IDE, ID, data */
Can_set_dlc_ide(packet->length);
Can_set_ext_id(packet->id);
for (cnt=0; cnt<8; ++cnt) CANMSG = packet->data[cnt];

/* Initiate transfer */
Can_trigger_tx();

/* Mistry part begins */
/* Wait while the MOB is busy */
while(CANEN2 & 0x02);

/* ????Transfer is complete???, check the status  ?*/

while(status = CANSTMOB)
  {
   /* May be everything is OK */
   if (status & (1<<TXOK))
    {
     /* Free the MOB by dropping CONMOB0 and CONMOB1 */
     Can_mob_abort();
     /* Reset MOB status by dropping everything in CAMSTMOB */
     Can_clear_status_mob();
     ret = 0;
     break;
    }
   /* If there are errors - pass them to the application */
   if (status & ERR_MOB_MSK)
    { ret = status; break; }
   /* We are here if status is zero. Don't know how to interpret it */
   if (status == 0 )
    { ret = -1; break; }
  }

/* Don't forget it, dude! */
sei();
return(ret);
}
Kitsok
А..... все, нашел.

Передатчик в порядке, приемник молчаливо не справляется.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.