Перейти к содержанию
    

AT90CAN128 & CAN: проясните пожалуйста

Всем привет!

 

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

 

Вот настроил я контроллер, настроил 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);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...