реклама на сайте
подробности

 
 
> Адресация и фильтрация CAN сообщений на STM32F4
DmitryG
сообщение Oct 2 2016, 08:45
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 27-09-16
Пользователь №: 93 508



Добрый день!

У меня CAN-шиной соединены 4 устройства STM32F4. Каждое из них подсоединено к компьютеру по USART для возможности вывода на экран входящих и исходящих сообщений. При отправке данных от одного устройства к конкретному другому, сообщение всё равно отображают все 4 устройства. Объясните, пожалуйста, каким образом правильно настроить адресацию и фильтрацию сообщений на STM32F4.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 20)
amiller
сообщение Oct 2 2016, 09:38
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Если не ошибаюсь, то в стандарте Can нет такого понятия, как адрес устройства. Есть понятие - идентификатор посылки.
В системе, где несколько устройств, и каждое из устройств может отправить посылку любому другому, целесообразно, чтобы в идентификаторе содержалась след информация:
Идентификатор получателя, идентификатор отправителя, тип посылки.
Соответственно фильтры настраиваются на идентификаторы посылок.
Например так:
CODE
// -------------------------------------------- // Настройки модуля фильтрации
setmask(CAN1->FMR, CAN_FMR_FINIT); // To Initialization mode for the filter
// -------------------------------------------- // Настройки банка 0
clrmask(CAN1->FA1R, CAN_FA1R_FACT0); // Deactivation
clrmask(CAN1->FM1R, CAN_FM1R_FBM0); // Mask mode
clrmask(CAN1->FS1R, CAN_FS1R_FSC0); // 16-bit scale
clrmask(CAN1->FFA1R, CAN_FFA1R_FFA0); // Assign to FIFO 0
CAN1->sFilterRegister[0].FR1 = ((int32u)0x1FF8 << 16) + ((int32u)Dev2_to_Dev1 << 5);
CAN1->sFilterRegister[0].FR2 = ((int32u)0x1FF8 << 16) + ((int32u)Dev3_to_Dev1 << 5);
setmask(CAN1->FA1R, CAN_FA1R_FACT0); // Activation

clrmask(CAN1->FMR, CAN_FMR_FINIT); // From Initialization mode for the filter

Вроде бы работало, детали уже увы не помню, надо заглядывать в документацию.
Go to the top of the page
 
+Quote Post
DmitryG
сообщение Oct 2 2016, 10:05
Сообщение #3





Группа: Участник
Сообщений: 7
Регистрация: 27-09-16
Пользователь №: 93 508



Цитата(amiller @ Oct 2 2016, 12:38) *
.



Хорошо. Я вас понял.

Главный вопрос в инициализации у меня относительно строк CAN_FilterIdHigh, CAN_FilterIdLow, CAN_FilterMaskIdHigh, CAN_FilterMaskIdLow. Я не очень понимаю, что конкретно в них писать. В них нужно писать диапазон Id? Если да, то зачем нужны какие-то скобки?


Код
  CAN_FilterInitStructure.CAN_FilterNumber = 0;
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;

  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);


Сообщение отредактировал IgorKossak - Oct 2 2016, 12:53
Причина редактирования: бездумное цитирование, [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
amiller
сообщение Oct 2 2016, 11:50
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(DmitryG @ Oct 2 2016, 13:05) *
Главный вопрос в инициализации у меня относительно строк CAN_FilterIdHigh, CAN_FilterIdLow, CAN_FilterMaskIdHigh, CAN_FilterMaskIdLow.

Термины, которые Вы используете, видимо из кода HAL от CMSIS или CubeM. Тут я Вам не советчик. Единственное, что могу добавить, фильтр можно настроить на полное совпадение с конкретным идентификатором, так и установить маску, когда под один фильтр может попадать целая группа идентификаторов.
Go to the top of the page
 
+Quote Post
редактор
сообщение Oct 3 2016, 06:16
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Не скажу конкретно про ваш STM, но в CAN-модуле с которым я работал для фильтрации сообщений было правило
если ((CAN_ID & FILTR_MASK) == FILTR_ID) сообщение принимается, иначе игнорируется.
Поэтому UserManual в руки и читать мат.часть.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Oct 3 2016, 08:52
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(DmitryG @ Oct 2 2016, 13:05) *
Хорошо. Я вас понял.

Главный вопрос в инициализации у меня относительно строк CAN_FilterIdHigh, CAN_FilterIdLow, CAN_FilterMaskIdHigh, CAN_FilterMaskIdLow. Я не очень понимаю, что конкретно в них писать. В них нужно писать диапазон Id? Если да, то зачем нужны какие-то скобки?


Вы начните с чтения мануала на процессор. Там довольно подробно расписана фильтрация, какие режимы есть и что надо писать в регистры. Дальше если вы хотите использовать Cube / HAL, то уже смотрите, что их функции пишут в эти регистры и таким образом понимаете, что вам надо в них передавать

Я честно говоря с HAL еще не сталкивался, но из опыта работы с CMSIS - его дока очень слабая, без мануала на проц не обойтись. Может быть в HAL это поправили.

И опять же из опыта работы с CMSIS - для CAN от него толку ноль. Он слишком уж тонкая обертка над железом и вообще нет никаких плюшек по сравнению с прямой работой с регистрами CAN-модуля процессора.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 3 2016, 09:12
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(редактор @ Oct 3 2016, 09:16) *
Поэтому UserManual в руки и читать мат.часть.

Тем более что там пять строчек кода.
Вам надо тупо настроить 1 раз регистры (зачем вызывать для этого какие-то левые п/п, один бог знает) и всё. Далее вы просто обрабатываете сообщения поступающие в ваш ящик в прерывании.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jul 30 2018, 12:55
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(SasaVitebsk @ Oct 3 2016, 14:12) *
Тем более что там пять строчек кода.
Вам надо тупо настроить 1 раз регистры (зачем вызывать для этого какие-то левые п/п, один бог знает) и всё. Далее вы просто обрабатываете сообщения поступающие в ваш ящик в прерывании.


Как настроить регистры, более или менее понятно. Я бы задал вопрос под другим углом: Каким образом сделать так, что бы каждый из нескольких идентичных каналов, с процессором прошитым одинаковой прошивкой определил для себя заданный диапазон идентификаторов, несовпадающий с другими каналами (топология один мастер - четыре слейва. Ранее это делалось на SPI и оно естественным образом рулилось сигналами NSS но захотелось лишнего геморроя - решил попробовать CAN... ) Вводить в схему перемычки или дип переключатели категорически не хочется, иметь различную версию прошивки для каждого канала - тем более...

Сообщение отредактировал nanorobot - Jul 30 2018, 12:56
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 30 2018, 13:26
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(nanorobot @ Jul 30 2018, 15:55) *
Ранее это делалось на SPI и оно естественным образом рулилось сигналами NSS но захотелось лишнего геморроя - решил попробовать CAN... ) Вводить в схему перемычки или дип переключатели категорически не хочется, иметь различную версию прошивки для каждого канала - тем более...

Ну если Вы раньше каким-то образом определяли кто будет мастером на SPI, то в чём проблема так же назначить мастера и теперь?
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jul 30 2018, 13:34
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(jcxz @ Jul 30 2018, 18:26) *
Ну если Вы раньше каким-то образом определяли кто будет мастером на SPI, то в чём проблема так же назначить мастера и теперь?

Проблема не в том, кого назначить мастером. Проблема в том чтоб каждый из четырех слейвов имел уникальный диапазон идентификаторов. Все слейвы изначально неотличимы один от другого. То есть требуется некая процедура инициализации - назначение каждому слейву своего диапазона идентификаторов. Ничего изящного в голову не приходит.

Сообщение отредактировал nanorobot - Jul 30 2018, 13:34
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 30 2018, 16:10
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



А мастер почему простаивает, пусть он распределит. Не?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jul 30 2018, 16:22
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(Obam @ Jul 30 2018, 21:10) *
А мастер почему простаивает, пусть он распределит. Не?

Все слейвы изначально неотличимы один от другого. На любое сообщение от мастера либо все среагируют одинаково, либо все проигнорируют, в зависимости от изначально установленных фильтров. Как в такой ситуации мастер что либо может распределить?
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 30 2018, 16:29
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(nanorobot @ Jul 30 2018, 19:22) *
Все слейвы изначально неотличимы один от другого. На любое сообщение от мастера либо все среагируют одинаково, либо все проигнорируют, в зависимости от изначально установленных фильтров. Как в такой ситуации мастер что либо может распределить?

О, это в чём-то похоже на IrLAP (IrDA): мастер выдаёт запрос и ведомые, услышавшие и не заригистрированные, во временных слотах, естественно с коллизиями, откликаются; ну и потом, естественно разрешение коллизий.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 30 2018, 16:32
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(nanorobot @ Jul 30 2018, 19:22) *
Все слейвы изначально неотличимы один от другого. На любое сообщение от мастера либо все среагируют одинаково, либо все проигнорируют, в зависимости от изначально установленных фильтров. Как в такой ситуации мастер что либо может распределить?

Естественно - не реагировать одинаково. Назначить каждому слэйву уникальный ID. На этапе производства (сер.номер) или динамически после вкл. Ну или использовать уникальный номер уже имеющийся в МК или каком-либо чипе схемы.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Jul 31 2018, 05:21
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(nanorobot @ Jul 30 2018, 15:55) *
Ранее это делалось на SPI и оно естественным образом рулилось сигналами NSS но захотелось лишнего геморроя - решил попробовать CAN... )


Линии NSS от мастера остались в системе? Если да, то кто мешает по их состоянию в программе задавать шаблон идентификаторов. Ногодрыг мастером GPIO NSS и вот каждый Слейв знает свой шаблон, анализируя свою GPIO NSS.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jul 31 2018, 08:42
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(DmitryM @ Jul 31 2018, 10:21) *
Линии NSS от мастера остались в системе? Если да, то кто мешает по их состоянию в программе задавать шаблон идентификаторов. Ногодрыг мастером GPIO NSS и вот каждый Слейв знает свой шаблон, анализируя свою GPIO NSS.



rolleyes.gif в таком случае вопросоа бы не возникло в принципе. одна из причин стреммления к КАНу - снижение числа гальванически развязанных линий.
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Jul 31 2018, 11:28
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



У Вас есть кристалл с уникальным ID, прошитым на производстве. Напишите что-то совместимое с CAN шиной, что будет использовать какой-нибудь специфический канал для настройки именно ведомых.
Допустим, при запуске все кристаллы одновременно ломятся в шину с сообщением и посылают свой номер в какое-то поле. Происходит коллизия. Коллизия решается, выигравший забирает первый диапазон адресов.
Повторить до окончания коллизий.
Допустим, адреса 0x00 ~ 0xFF, каналы по 16 адресов (0x10)
Посылка -> Коллизия -> Разрешение -> Выигравший забирает адреса 0x00 ~ 0x0F и замолкает.
Посылка -> Коллизия -> Разрешение -> Второй выигравший забирает 0x10 ~ 0x1F и тоже замолкает.
И так далее.

UPD: Я тут подумал. Эту же процедуру можно проводить только в случае возникновения коллизии при ответе контроллера. То есть, сеть может организовываться полностью сама. Разве что мастер не будет знать кто где.
Настройка можно хранить в выделеной странице (двух) Flash-памяти, либо на врешней EEPROM микросхеме, а перенастраиваться только при обнаружении ошибки.

Я сейчас мыслю, абстрагировавшись от работы шины данных.
Есть знатоки работы CAN протокола? Как можно реализовать подобное, используя стандартные методы?

Хотя, в моём случае, при построении сети, работа ведётся исключительно между мастером и ведомыми. И он же выдаёт им сетевые адреса. Да, слизано с больших сетей с DHCP сервером. При этом работает по двухпроводной схеме (нет, не RS-485).

Сообщение отредактировал AlanDrakes - Jul 31 2018, 13:58
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Jul 31 2018, 17:00
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(AlanDrakes @ Jul 31 2018, 16:28) *
Разве что мастер не будет знать кто где.


В самую точку....

Сообщение отредактировал nanorobot - Jul 31 2018, 17:01
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jul 31 2018, 19:47
Сообщение #19


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(nanorobot @ Jul 30 2018, 19:22) *
Все слейвы изначально неотличимы один от другого. На любое сообщение от мастера либо все среагируют одинаково, либо все проигнорируют, в зависимости от изначально установленных фильтров. Как в такой ситуации мастер что либо может распределить?


У каждого STM есть уже зашитый на заводе уникальный серийный номер. Вот его и используйте. Или его часть.
Device electronic signature
Unique device ID register (96 bits)


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 1 2018, 08:44
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(nanorobot @ Jul 31 2018, 20:00) *
В самую точку....

Это уже совсем другой вопрос. Чтобы на него ответить нужно знать ответ на "А как различаются "кто есть кто" в вашей системе"? И тогда сами себе и ответите "как".
И к назначению уникальных ID слэйвам это уже не имеет никакого отношения.
Go to the top of the page
 
+Quote Post
yes
сообщение Aug 6 2018, 13:36
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



если невнимательно читал - извиняйте

есть стандарты (протоколы) обмена по CAN-у в которых используются адреса источника и приемника - SAE J1939 он же iso 11783, по-моему

там есть процедура Address Claim Procedure в тырнете написано как оно устроено

но вроде как и без стандартов в среде, где допустимы/разрешаются конфликты сделать что-то подобное не сложно:
только что подключенный контролер сообщает (особый тип сообщения - в старших битах, например) что-то типа "я контролер такой-то (свой тип и какой-то серийный номер или что-то такое, чтобы прошло решение конфликта - если все вдруг одновременно включились) хочу себе такой-то (например, инкремент с 0) адрес" - ему либо отвечают "шалишь, такой адрес уже занят", либо остальные контроллеры у себя в табличку дописывают что этот контроллер получил этот адрес. после 0-N итераций этот контроллер получает адрес, а потом другим сообщением говорит "дайте мне табличку адресов" - причем табличку обновляют все, а передавать, например, может каждый то же самое сообщение "я контролер такой-то хочу/имею адрес такой-то" - если все это в extended CAN ID засунуть (28 бит должно хватить) - то все это будет арбитрироваться/разрешаться железкой автоматически
вроде как все...

Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01578 секунд с 7
ELECTRONIX ©2004-2016