Цитата(E.V.G. @ Sep 28 2018, 16:50)
Либо mot_num становится отрицательным из-за (RxMessage.ExtId & 0xFF) < BASE_MOTOR_ID, либо opcode не соответствует перечню команд в switch.
Копайте в этом направлении.
так в любом случае return ack; ack - oн всегда будет определен.
Цитата(Сергей Борщ @ Sep 28 2018, 17:04)
Теперь покажите объявление can_params. Ее член message_received меняется в прерываниии?
я заменил флаг can_params.message_received на volatile uint32_t can_message_received; и он устанавливается в прерывании
Код
void USB_LP_CAN1_RX0_IRQHandler(void)
{
can_params.fifo_num = CAN_FIFO0;
can_message_received = 1;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
}
ради эксперемента сделал /*master_ack = */ CAN_RX_Master(); и в начале функции опроса жестко поставил master_ack = 1; - все равно заходит в else.
О! Только после того как определил static volatile uint32_t master_ack; - все стало на свои места. отдельно static или отдельно volatile не работает.