Всем привет. Вот я так делаю:
CODE
void setup_can_filter(void)
{
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN filter init 0*/
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x332<<5);//|(1<<4);
CAN_FilterInitStructure.CAN_FilterIdLow = (0x331<<5);//|(0<<4);
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x3B3<<5);//|(1<<4);
CAN_FilterInitStructure.CAN_FilterMaskIdLow = (0x430<<5);//|(0<<4);
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN filter init 1*/
CAN_FilterInitStructure.CAN_FilterNumber = 1;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x171<<5);//|(1<<4);
CAN_FilterInitStructure.CAN_FilterIdLow = (0x0415<<5);//|(0<<4);
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x0434<<5);//|(1<<4);
CAN_FilterInitStructure.CAN_FilterMaskIdLow = (0x042F<<5);//|(0<<4);
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
void setup_can(CAN_InitTypeDef *can, int baud)
{
CAN_StructInit(can);
CAN_DeInit(CAN);
CAN_StructInit(can);
/* CAN cell init */
can->CAN_TTCM = DISABLE;
can->CAN_ABOM = ENABLE;
can->CAN_AWUM = DISABLE;
can->CAN_NART = DISABLE; /* orig: DISABLE Transmit only once */
can->CAN_RFLM = DISABLE;
can->CAN_TXFP = DISABLE;
can->CAN_Mode = CAN_Mode_Normal;
can->CAN_SJW = CAN_SJW_1tq;
can->CAN_BS1 = CAN_BS1_13tq;
can->CAN_BS2 = CAN_BS2_2tq;
switch(baud)
{
case 1000000:
can->CAN_Prescaler = 3;
break;
case 500000:
/* CAN Baudrate = 100KBps (tested OK on real car) */
// на самом деле не 100К, а 500К (копипастеры ...)
can->CAN_Prescaler = 6;
break;
case 250000:
/* CAN Baudrate = 250KBps */
can->CAN_Prescaler = 12;
break;
case 125000:
/* CAN Baudrate = 125KBps */
can->CAN_Prescaler = 24;
break;
case 100000:
/* CAN Baudrate = 100KBps (tested OK on real car) */
can->CAN_Prescaler = 30;
break;
case 50000:
/* CAN Baudrate = 50KBps */
can->CAN_Prescaler = 60;
break;
}
setup_can_filter();
CAN_Init(CAN, can);
CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
}
Все равно не работает. НЕ нужные сообщения проходят. Что может быть не так?