ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 июля
542111 Топик полностью
Nikolay801_ (26.08.2014 11:47, просмотров: 127) ответил 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); \ }
Будь ты проклят, Перри-Утконос!