Kitsok 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Всем привет! Бьюсь, бьюсь - не получается. Вот настроил я контроллер, настроил 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 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба А..... все, нашел. Передатчик в порядке, приемник молчаливо не справляется. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться