Вот так идёт инициализация.
Код
// Инициализация CAN
Can_reset(); // Инициализация Can
Can_enable();
Can_conf_bt(); // Установка Fcan = 250 кбит
can_clear_all_mob(); // Очистка всех mailbox
CANEN2=3; // Разрешить работу двух ящиков MOB
CANIE2=3; // Разрешить прерывания двух ящиков MOB
can_Set_mob_T(); // Инициализация ящика температуры двигателя
can_Set_mob_POil(); // Инициализация ящика давления масла
CANGIE = (1<<ENIT)|(1<<ENRX); // Разрешить прерывание на приём
вот некоторые процедуры
Код
void can_Set_mob_T(void)
{
Can_clear_rtr();
Can_set_mob(MOB_T);
Can_set_mask_mob(); // Принимать конкретные адреса
Can_set_dlc(8); // Длина пакета 8 байт
Can_clear_rplv(); // без ответа
Can_config_rx(); // на приём
Can_set_ext_id(idt_T); // Задать адрес
}
void can_clear_all_mob(void)
{
uint8_t mob_number;
for (mob_number = 0; mob_number < NB_MOB; mob_number++)
{
CANPAGE = (mob_number << 4); //! Page index
Can_clear_mob(); //! All MOb Registers=0
}
}
Вот так выглядит прерывание
Код
// Прерывание от CAN
#pragma vector=CANIT_vect
__interrupt static void CAN_int(void)
{
uint8_t data[8],i;
if((CANSIT2 & 1)!=0) // MOB0 сработал? Температура первый байт
{
Can_set_mob(MOB_T);
for(i=0;i<8;i++) data[i]=CANMSG; // Прочитать сообщение целиком
CAN_Temp=data[0]; // Прочитать температуру
}
if((CANSIT2 & 2)!=0) // MOB1 сработал? Давление масла 4 байт
{
Can_set_mob(MOB_OIL);
for(i=0;i<8;i++) data[i]=CANMSG; // Прочитать сообщение целиком
CAN_POil=data[3]; // Прочитать температуру
}
}