Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2019, 00:02

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 06 июн 2019, 01:11 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
Добрый день, Уважаемое сообщество профессионалов и любителей...

Интересует, кто сталкивался.
Обрабатываем прерывания CAN, записываем лог.

В процессе сравнения обнаруживается, что часть сообщений утеряна.
В чём может быть проблема?

Процессор STM32F103xx.

Кусок кода:
Код:
// CAN filter init
   CAN_FilterInitTypeDef CAN_FilterInitStructure;
   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 = CAN_FIFO0;
   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
   CAN_FilterInit(&CAN_FilterInitStructure);

        CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
   // CAN_ITConfig(CAN1, CAN_IT_FF0, ENABLE);

        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

void USB_LP_CAN1_RX0_IRQHandler(void)

   {
   if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET)   // �������� �������� ����
      {
      //CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
      CanRxMsg RxMessage;
      memcpy(&RxMessage, 0, sizeof(CanRxMsg));

      uint8_t msginbuff = CAN_MessagePending(CAN1, CAN_FIFO0);

      for (int i = 0; i < msginbuff; i++)
         {
         CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
         //
                        }
                 }
         }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 07 июн 2019, 16:16 
Заглядывает иногда

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 162
А с какой частотой шлете сообщения? Может контроллер просто не успевает все их "переваривать"? OVR флаг выскакивает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 07 июн 2019, 16:45 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
Sergey_spb писал(а):
А с какой частотой шлете сообщения? Может контроллер просто не успевает все их "переваривать"? OVR флаг выскакивает?

В том то и дело, что нет. Первая мысль была что переполнение.

Частота щас на контроллере 72МГЦ
делитель RCC_HCLK_Div4 т.е. 18МГЦ (за глаза поидее)
Can даю HS 500KBPS соответственно:
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_15tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
CAN_InitStructure.CAN_Prescaler = 2;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 07 июн 2019, 17:27 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1775
Применил первый метод нахождения ошибок - метод пристального вглядывания.
Что произойдет, если
uint8_t msginbuff = CAN_MessagePending(CAN1, CAN_FIFO0);
вернёт значение > 1 ?
И сразу станет всё кристально ясно.
Метод работает безотказно! Рекомендую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 07 июн 2019, 18:00 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3999
Откуда: КЧР, поселок Нижний Архыз
Проверяю не в прерывании, однако, сообщения ни разу не терялись (видимо, т.к. поток данных небольшой сравнительно).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 07 июн 2019, 18:53 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
x893 писал(а):
Применил первый метод нахождения ошибок - метод пристального вглядывания.
Что произойдет, если
uint8_t msginbuff = CAN_MessagePending(CAN1, CAN_FIFO0);
вернёт значение > 1 ?
И сразу станет всё кристально ясно.
Метод работает безотказно! Рекомендую.

Уважаемый Друг,

Разумеется я не привёл код полностью. Нет, я не перетираю предыдущее значение, я его записываю в бинарный буфер

Код:
void USB_LP_CAN1_RX0_IRQHandler(void)

   {
   if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET)
      {
      CanRxMsg RxMessage[3];
      //
      uint8_t msginbuff = CAN_MessagePending(CAN1, CAN_FIFO0);
      if (msginbuff > 3)
         {
         raise_error();
         return;
         }
      //
      for (int j = 0; j < msginbuff; j++)
         {
         CAN_Receive(CAN1, CAN_FIFO0, &(RxMessage[j]));
         CanMsgCounter++;
         WriteBufBinary(&(RxMessage[j]), sizeof(RxMessage));
         }
      //
   //
   //CAN_FIFORelease(CAN1, CAN_FIFO0);// receive releases automatically
   GPIO_SetBits(GPIOC, GPIO_Pin_13); // up
   }
if (CAN_GetITStatus(CAN1, CAN_IT_FF0) == SET)
   {                       //
   CAN_ClearITPendingBit(CAN1, CAN_IT_FF0);
   WriteBufStr("-------------------FF0!!!");
   CAN_ClearFlag(CAN1, CAN_FLAG_FF0);
   }
if (CAN_GetITStatus(CAN1, CAN_IT_FOV0) == SET)
   {                       //
   CAN_ClearITPendingBit(CAN1, CAN_IT_FOV0);
   WriteBufStr("-------------------FOV0!!!");
   CAN_ClearFlag(CAN1, CAN_FLAG_FF0);
   }

}


Так что всё произойдёт как надо. Считается сообщение >1 раза.
Но это всё равно даст пропуски.
Не везде: на быстрых запросах.

Вот ,например, запрос считывания ошибок:

Код:

0> 0000073F;8;21 00 80 10 13 00 80 01
0> 0000073F;8;22 13 00 80 70 13 00 91
0> 0000073F;8;23 26 11 00 91 27 11 00
0> 0000073F;8;25 00 80 72 11 00 80 10
0> 0000073F;8;26 11 00 80 01 11 00 80
0> 0000073F;8;27 70 11 00 91 26 12 00
0> 0000073F;8;29 00 91 28 12 00 80 72
0> 0000073F;8;2A 12 00 80 10 12 00 80
0> 00000340;8;00 00 00 00 00 00 00 00
0> 0000073F;8;20 80 D5 55 00 90 11 95


последовательность должна быть непрерывная, здесь идут пропуски


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 07 июн 2019, 19:35 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
Eddy_Em писал(а):
Проверяю не в прерывании, однако, сообщения ни разу не терялись (видимо, т.к. поток данных небольшой сравнительно).


Спасибо за код. Я глянул, особых отличий не нашёл.
Но, я ещё не знаю может ли влиять на это китайское происхождение проца, встречались мне китайские процессоры, которые работали не совсем как положено, да и сопротивление ядра у них часто разнится с оригиналом.

Я попробую потестировать ещё на другой плате, где стоит точно оригинальный STM32.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 07 июн 2019, 23:49 
Заглядывает иногда

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 162
Ну чисто в виде версии. А пропущенные сообщения точно в шину уходят, со стороны отправителя?
Есть возможность каким-нибудь can-сканером подключиться и посмотреть параллельно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 08 июн 2019, 02:07 
Старожил
Аватара пользователя

Зарегистрирован: 18 фев 2014, 11:27
Сообщения: 257
Откуда: Москва
что б точно узнать надо организовать сеть с заведомо известным количеством переданных пакетов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 08 июн 2019, 02:10 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1775
Дружище !
Посмотрите сканером, точно идут сообщения от отправителя.
Уберите всякий вывод на терминал в коде приемника и проверяйте последовательность в коде (для минимизации времени обработки). Чудес не бывает. На OBD смотрел сообщения CAN (на 1Mb/s) - ничего не терялось, но логика была другая обработки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 09 июн 2019, 01:54 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
Sergey_spb писал(а):
Ну чисто в виде версии. А пропущенные сообщения точно в шину уходят, со стороны отправителя?
Есть возможность каким-нибудь can-сканером подключиться и посмотреть параллельно?

именно так я и делаю.
параллельно стоит проверенный логгер и логает.
перечеслимые просто удобнее использовать - они всегда идут по порядку.

в контрольном сканере пропусков нет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 09 июн 2019, 16:09 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
x893 писал(а):
Уберите всякий вывод на терминал в коде приемника и проверяйте последовательность в коде (для минимизации времени обработки).


Поправьте меня, если я не прав, но FIFO должно работать независимо от основного процесса CPU. Таким образом, если бы длительные действия во время обработки прерывания имелись, случались бы переполнения, чего не происходит (см. выше). В терминал я не вывожу, я пишу на SD карту, но по низкоприоритетному таймеру, основной буфер хранится в оперативной памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 09 июн 2019, 16:37 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1775
Я предложил выкинуть всё из прерывания и только проверять номер посылки.
Если номер сбился, тогда уже остановиться и смотреть, что и как.
Или отправлять в SystemView (например)
Терминал, SD, моргание лампочкой и пр. выкинуть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 09 июн 2019, 18:13 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2638
хотел предложить считать/выводить только количество посылок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 10 июн 2019, 03:55 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1775
Да понятно, что проблема надуманная.
Но человеку помочь святое дело.
Хотя и помощи то особой нет.
Нужен только здравый смысл и жизненный опыт.
И никакой контрреволюции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 10 июн 2019, 14:02 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
x893 писал(а):
Да понятно, что проблема надуманная.
Но человеку помочь святое дело.
Хотя и помощи то особой нет.
Нужен только здравый смысл и жизненный опыт.
И никакой контрреволюции.


Как всегда, всё свелось к банальному стёбу (думал этот форум чем-то отличаетя, но нет - ошибся).
Вы не опровергли меня по поводу FIFO, значит Вы со мной согласны. FIFO должен переполняться в случае длительных операций.
Я могу выкинуть всё из прерывания без проблем. Это ничего не изменит, готов поспорить на бутылку пива (по обозначенным выше причинам).

В чём, собственно, надуманность проблемы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 10 июн 2019, 15:04 
Заглядывает иногда

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 162
А с оригинальным stm32 еще не пробовали?
И с какой примерно скоростью сообщения идут, сколько штук в секунду?

Интересно, в чем в итоге проблема.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 10 июн 2019, 23:29 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
Sergey_spb писал(а):
А с оригинальным stm32 еще не пробовали?
И с какой примерно скоростью сообщения идут, сколько штук в секунду?

Интересно, в чем в итоге проблема.

Сергей, именно этим и планирую заняться - уезжал.

Есть еще несколько отладочных плат на других процах STM32 серии, разработку всё равно не планировал делать на 103.
Завтра попробую код плавно перенести на 205 или 303 и протестить.
Также под вопросом кан трансивер.

Скорость сейчас покажу на таймштампах. Тут похоже дело не в скорости.

Код:
00000340;8;00 00 00 00 00 00 00 00 ;3292658326
00000461;8;03 F8 00 00 40 00 00 6C ;3292659235
00000340;8;00 00 00 00 00 00 00 00 ;3292758333
00000461;8;03 F8 00 00 40 00 00 6C ;3292759231
00000340;8;00 00 00 00 00 00 00 00 ;3292858325
00000461;8;03 F8 00 00 40 00 00 6C ;3292859224
00000340;8;00 00 00 00 00 00 00 00 ;3292958321
00000461;8;03 F8 00 00 40 00 00 6C ;3292959220
00000340;8;00 00 00 00 00 00 00 00 ;3293058322
00000461;8;03 F8 00 00 40 00 00 6C ;3293059219
00000340;8;00 00 00 00 00 00 00 00 ;3293158320
00000461;8;03 F8 00 00 40 00 00 6C ;3293159214
00000340;8;00 00 00 00 00 00 00 00 ;3293258315
00000461;8;03 F8 00 00 40 00 00 6C ;3293259212
00000340;8;00 00 00 00 00 00 00 00 ;3293358310
00000461;8;03 F8 00 00 40 00 00 6C ;3293359205
00000340;8;00 00 00 00 00 00 00 00 ;3293458307
00000461;8;03 F8 00 00 40 00 00 6C ;3293459200
00000340;8;00 00 00 00 00 00 00 00 ;3293558301
00000461;8;03 F8 00 00 40 00 00 6C ;3293559196


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 11 июн 2019, 00:21 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 618
Откуда: Севастополь
Гхм - а если msginbuff==0 ?!?
может слетает при входе в прерывание по другой причине ( потому что код у индусов не фонтан, поэтому есть варианты ;) ) добавьте ради прикола ексепшн на нулевое значение, мало ли ...
А еще интереснее - при любом прерывании кан - дергать какой нибудь лапкой проца, и став каким нибудь логическим анализатором на кан входы и на этот пин - смотреть всегда ли оно по приходу сообщения попадает в прерывание.... Ну и не забываем про резистор терминатор в шине - мало ли как себя ведут устройства без хотя бы одного терминатора на шине.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 11 июн 2019, 00:57 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
balu_dark писал(а):
Гхм - а если msginbuff==0 ?!?
может слетает при входе в прерывание по другой причине ( потому что код у индусов не фонтан, поэтому есть варианты ;) ) добавьте ради прикола ексепшн на нулевое значение, мало ли ...
А еще интереснее - при любом прерывании кан - дергать какой нибудь лапкой проца, и став каким нибудь логическим анализатором на кан входы и на этот пин - смотреть всегда ли оно по приходу сообщения попадает в прерывание.... Ну и не забываем про резистор терминатор в шине - мало ли как себя ведут устройства без хотя бы одного терминатора на шине.

Если смотреть на алгоритм, то при msginbuff=0 вход в цикл (for j) не происходит, так что ничего не вызовется, кроме LED
Но по логике вещей при отсутствии сообщений не приходит туда (смотрел под дебаггером).

Второе - сделаю, это не сложно.

Терминатор вроде стоит на адаптере отладочном, но - проверю. Поидее если нет терминатора, а он нужен - то сообщения вообще не идут... но хз.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 11 июн 2019, 19:56 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
Провёл эксперимент с дрыгающей ногой по сообщению (сообщение всё равно надо забирать из очереди, иначе всё сливается в одну линию)
и получается что пропуски даёт сам can tranciever.
Контрольный замер в 38 сообщений прилагаю: https://cloud.mail.ru/public/vji1/rfr45cGtB

Немного ошибся в эксперименте, поменял кан трансивер на TJA, и сейчас стало видно, что процессор пропускает сообщения.

https://cloud.mail.ru/public/4aXw/W9qhaKZ9B
Здесь для контроля три линии : одна RX-CAN, другая - дергающаяся нога, третья - живой CAN до трансивера.

Видно, что RX-CAN и живой кан совпадают, а там где нога дёргается - пропуски.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 12 июн 2019, 20:59 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
Конец эпопеи.
Переложил всё на другой проц (не китай) STM32F205RB.
Железо, конечно, немного другое, но факт на лицо - пропусков нет.

Прилагаю отчёт логике, на ней чётко видно, что прерывание приходит не реже чем раз в три сообщения.

https://cloud.mail.ru/public/3pbY/3bYHcLjKS

Всем спасибо, особенно китайцам ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 12 июн 2019, 21:58 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2638
то есть таки китайский след?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 12 июн 2019, 23:13 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6218
zacher, вы бы проверили с новым процессором, но со старыми частотами ядра и периферийных шин. И кодом.
Объясню: Вы не нашли истинную причину, а потому, сами понимаете, пользы в "положительном результате" ровным счетом "0".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение CAN шины - пропуск сообщений
СообщениеДобавлено: 13 июн 2019, 18:43 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 60
u37 писал(а):
zacher, вы бы проверили с новым процессором, но со старыми частотами ядра и периферийных шин. И кодом.

Ну частоты шин примерно совпадают.
А код как вы себе представляете однозначно перенести на новое железо?

Код перенесен настолько, несколько это возможно.

По вашему, я не нашел истинной причины, которая, как вы думаете в чем может заключаться? (Только ознакомьтесь пожалуйста с моими выкладками выше)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: VladislavS


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB