Easyelectronics.ru

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

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



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

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

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

Интересует, кто сталкивался.
Обрабатываем прерывания 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
Сообщения: 129
А с какой частотой шлете сообщения? Может контроллер просто не успевает все их "переваривать"? OVR флаг выскакивает?


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

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


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

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


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

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 44
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
Сообщения: 44
Eddy_Em писал(а):
Проверяю не в прерывании, однако, сообщения ни разу не терялись (видимо, т.к. поток данных небольшой сравнительно).


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

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


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

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


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

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


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

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


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

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

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

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


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

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


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


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

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


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

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


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

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


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

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


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

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


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

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

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


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

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

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

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

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


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

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 44
Провёл эксперимент с дрыгающей ногой по сообщению (сообщение всё равно надо забирать из очереди, иначе всё сливается в одну линию)
и получается что пропуски даёт сам 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
Сообщения: 44
Конец эпопеи.
Переложил всё на другой проц (не китай) STM32F205RB.
Железо, конечно, немного другое, но факт на лицо - пропусков нет.

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

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

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


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

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


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

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


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

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

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

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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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