Вот код для AT90CAN...: 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 на передачу? Совсем запутался...