Nikolay801_ (26.08.2014 11:47, просмотров: 148) ответил Argon на а, ну т.е. понял - у STM32 банки фильтров подразумевают фильтры с выравниванием ID к старшему разряду. Т.е. 11-битный идентификатор сдвигаем влево на 5 бит для того, чтобы его 10й бит совпал с 15м битом регистра stm32. Соответственно 29-битный
у стешников это безобразие легло более-менее пристойно, у восьмибитников был натуральный трешь.
/*----- Identifier definition -----*/
#define CAN_SET_STD_ID_10_4(identifier) (((*((Uchar *)(&identifier)+1))<<5)+((*(Uchar *)(&identifier))>>3))
#define CAN_SET_STD_ID_3_0(identifier) ((*(Uchar *)(&identifier))<<5)
#define Can_set_std_id(identifier) {\
CANIDT1 = CAN_SET_STD_ID_10_4 (identifier);\
CANIDT2 = CAN_SET_STD_ID_3_0 (identifier);}
#define Can_set_std_remote_id(identifier) {\
CANIDT1 = CAN_SET_STD_ID_10_4 (identifier);\
CANIDT2 = CAN_SET_STD_ID_3_0 (identifier);\
CANIDT4 = (1<<RTRTAG);}
#define CAN_SET_EXT_ID_28_21(identifier) (((*((Uchar *)(&identifier)+3))<<3)+((*((Uchar *)(&identifier)+2))>>5))
#define CAN_SET_EXT_ID_20_13(identifier) (((*((Uchar *)(&identifier)+2))<<3)+((*((Uchar *)(&identifier)+1))>>5))
#define CAN_SET_EXT_ID_12_5(identifier) (((*((Uchar *)(&identifier)+1))<<3)+((* (Uchar *)(&identifier) )>>5))
#define CAN_SET_EXT_ID_4_0(identifier) ((* (Uchar *)(&identifier) )<<3)
#define Can_set_ext_id(identifier) {\
CANIDT1 = CAN_SET_EXT_ID_28_21 (identifier);\
CANIDT2 = CAN_SET_EXT_ID_20_13 (identifier);\
CANIDT3 = CAN_SET_EXT_ID_12_5 (identifier);\
CANIDT4 = CAN_SET_EXT_ID_4_0 (identifier);\
CANCDMOB |= (1<<IDE); }
#define Can_set_ext_remote_id(identifier) {\
CANIDT1 = CAN_SET_EXT_ID_28_21 (identifier);\
CANIDT2 = CAN_SET_EXT_ID_20_13 (identifier);\
CANIDT3 = CAN_SET_EXT_ID_12_5 (identifier);\
CANIDT4 = CAN_SET_EXT_ID_4_0 (identifier);\
CANCDMOB |= (1<<IDE); \
CANIDT4 |= (1<<RTRTAG);}
#define Can_get_ext_id(identifier){ \
*((Uchar *)(&identifier)+3) = CANIDT1>>3; \
*((Uchar *)(&identifier)+2) = (CANIDT2>>3)+(CANIDT1<<5); \
*((Uchar *)(&identifier)+1) = (CANIDT3>>3)+(CANIDT2<<5); \
*((Uchar *)(&identifier)) = (CANIDT4>>3)+(CANIDT3<<5); \
}
#define Can_get_std_id(identifier){ \
*((Uchar *)(&identifier)+1) = CANIDT1>>5; \
*((Uchar *)(&identifier) ) = (CANIDT2>>5)+(CANIDT1<<3); \
}
Будь ты проклят, Перри-Утконос!