RadiatoR 2 6 апреля, 2016 Опубликовано 6 апреля, 2016 · Жалоба Всем привет. У меня есть готовая инициализация 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 байта вписывается это число не понятно. Без него не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 7 апреля, 2016 Опубликовано 7 апреля, 2016 · Жалоба покопался в дш - походу я просто маску сдвигаю (0xFF70U) и равна она чму-то левому. Видимо что было, то и взял, и случайно подошло Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pvo125 0 7 апреля, 2016 Опубликовано 7 апреля, 2016 · Жалоба CAN->sFilterRegister[3].FR1 = 0x18FF1F03;// ID and mask При такой записи у Вас получается что бит 0 равен 1. А он должен быть равен 0. Бит 1 это RTR он должен быть равным 0 для дата пакета и 1 для запроса. Ну и Бит 2 это IDE для расширенного идентификатора должен быть равен 1 а у Вас получается 0 (как бы стандартный). Вообще если я правильно понял что написано в "инструкции" то: Например расширенный идентификатор пусть будет 0x88181F1 IDE=1 RTR=0(пакет данных) тогда CAN->sFilterRegister[3].FR1 = (0x88181F1<<3)|(1<<2)|(0<<1); должно в регистр фильтра записаться число 0x440C0F8C Ну и во второй регистр котрый в режиме маски такой же идентификатор если хотите чтоб маска только один ID пропускала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 8 апреля, 2016 Опубликовано 8 апреля, 2016 · Жалоба да, разобрался с id, масками и прочим. спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 8 апреля, 2016 Опубликовано 8 апреля, 2016 · Жалоба А есть те, кто пользовался лупбеком или сайлент модом? Пытаюсь врубить, но он не сбрасывает бит INAK в MSR - ждет синхронизации, но ее и не будет как я понял - у меня девайс к шине то не подключен при отладке. Как правильно его врубить? Код как и выше, только в регистр CAN->BTR я вписываю уже 0x401c0005; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба Вы там, случаем, вход приёмника в dominant state не держите? Подключения к шине для инициализации и не требуется - там как раз условие выхода из неё, чтобы на шине не было активности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться