Перейти к содержанию
    

STM32F042 Настройка CAN

Всем привет.

У меня есть готовая инициализация 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 байта вписывается это число не понятно. Без него не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

покопался в дш - походу я просто маску сдвигаю (0xFF70U) и равна она чму-то левому. Видимо что было, то и взял, и случайно подошло

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 пропускала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А есть те, кто пользовался лупбеком или сайлент модом?

Пытаюсь врубить, но он не сбрасывает бит INAK в MSR - ждет синхронизации, но ее и не будет как я понял - у меня девайс к шине то не подключен при отладке. Как правильно его врубить? Код как и выше, только в регистр CAN->BTR я вписываю уже 0x401c0005;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы там, случаем, вход приёмника в dominant state не держите?

 

Подключения к шине для инициализации и не требуется - там как раз условие выхода из неё, чтобы на шине не было активности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...