Всем привет.
У меня есть готовая инициализация can шины. Работает она нормально. Когда я писал на нее код особо времени много не было разбираться что да как и я воткнул готовый. Откуда взял не помню) Инициализация выглядит так:
Код
RCC->APB1ENR|=RCC_APB1ENR_CANEN;
CAN->MCR|=CAN_MCR_INRQ;// init mode on
while(!(CAN->MSR|=CAN_MSR_INAK));// wait for init mode ready
CAN->MCR &=~ CAN_MCR_SLEEP;// exit sleep mode
CAN->BTR =0x001c0005; // mode, speed
CAN->MCR&=~(uint32)CAN_MCR_INRQ; // exit init mode
while(CAN->MSR & CAN_MSR_INAK);// wait exiting init mode
CAN->FMR |= CAN_FMR_FINIT;// filter mode on
CAN->FA1R |= CAN_FA1R_FACT0|CAN_FA1R_FACT1|CAN_FA1R_FACT2|CAN_FA1R_FACT3|CAN_FA1R_FACT4;// active filter 0-4
CAN->FS1R=(1<<4)|(1<<3);// 4 and 5 filter - 32bit
CAN->sFilterRegister[0].FR1 = Id1 << 5 | 0xFF70U << 16;// ID and mask
CAN->sFilterRegister[1].FR1 = Id2 << 5 | 0xFF70U << 16;// ID and mask
CAN->sFilterRegister[2].FR1 = Display_CAN_ID << 5 | 0xFF70U << 16;// ID and mask
CAN->sFilterRegister[3].FR1 = 0x18FF1F03;// ID and mask
CAN->sFilterRegister[3].FR2 = 0x18FF1F03;// ID and mask
CAN->sFilterRegister[4].FR1 = 0x18FECA03;// ID and mask
CAN->sFilterRegister[4].FR2 = 0x18FECA03;// ID and mask
CAN->FMR &=~ CAN_FMR_FINIT;// exit filter mode
CAN->IER|=CAN_IER_FMPIE0;// interrupt on receive pack to fifo0
NVIC_EnableIRQ(CEC_CAN_IRQn);
Здесь есть все что нужно для передачи/приема по 11 битному серийнику.
Возникла необходимость добавить получение 29 битного серийника и тут я стал разгребать дебри...
Вышеуказанный код не пашет. Ловит все подряд.
Тут я пытаюсь 0-2 фильтры сделать 11 битными (они работают отлично), а 4,5 29 битными (их я сейчас пилю)
Подскажите откуда берутся сдвиги << 5 | 0xFF70U << 16 и зачем они нужны? По крайней мере с 5 вроде понятно - уравнивает 11 к 16 битам, то для чего в старшие 2 байта вписывается это число не понятно. Без него не работает.