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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблемы с CAN в STM32F373CCT, Зависает прием CAN в процессоре
SergR
сообщение Jul 7 2016, 10:04
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 288
Регистрация: 25-06-05
Пользователь №: 6 304



Доброго времени суток.
Проблема следующего характера. Есть CAN сеть из трех устройств: один Преобразователь USB в CAN на PIC18F25K80 (CAN ID = 0x480) и две платы Контроллеров на STM32F373CCT (CAN ID = 0x400 и CAN ID = 0x401). Если в сеть включены только Преобразователь и один Контроллер то все работает корректно, пакеты принимаются и отправляются без вопросов. Но если в сеть добавить второй Контроллер то по началу тоже все корректно работает, но через пару минут вылазит не понятный глюк. Один из контроллеров перестает принимать пакеты и функция HAL_CAN_Receive_IT(&hcan, CAN_FIFO0) возвращает код ошибки (0x01). Реинициализация CAN-а не помогает только полный рисет контроллера. Причем передача данных от сбойнувшего Контроллера продолжается....
Кто сталкивался с подобным на STM-ах подскажите пожалуйста как бороться с этой проблемой.

Инициализация
Код
  MX_CAN_Init();
  static CanTxMsgTypeDef        TxMessage;
  static CanRxMsgTypeDef        RxMessage;

//HAL_StatusTypeDef CAN_Status;

  static CanTxMsgTypeDef        TxMessage;
  static CanRxMsgTypeDef        RxMessage;

  hcan.pTxMsg = &TxMessage;
  hcan.pRxMsg = &RxMessage;

  // настраиваем фильтр — приём всех посылок
  CAN_FilterConfTypeDef canFilterConfig;
  canFilterConfig.FilterNumber = 0;
  canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  canFilterConfig.FilterIdHigh = 0x0000;
  canFilterConfig.FilterIdLow = 0x0000;
  canFilterConfig.FilterMaskIdHigh = 0x0000 << 5;
  canFilterConfig.FilterMaskIdLow = 0x0000;
  canFilterConfig.FilterFIFOAssignment = 0;
  canFilterConfig.FilterActivation = ENABLE;
  canFilterConfig.BankNumber = 1;
  HAL_CAN_ConfigFilter(&hcan, &canFilterConfig);

  HAL_CAN_Receive_IT(&hcan, CAN_FIFO0); //разрешаем приём посылок


  /*##Configure Transmission process #####################################*/
  hcan.pTxMsg->StdId = (MB_number == 1) ? 0x400 : 0x401;//0x321;
  hcan.pTxMsg->ExtId = 0x01;
  hcan.pTxMsg->RTR = CAN_RTR_DATA;
  hcan.pTxMsg->IDE = CAN_ID_STD;
  hcan.pTxMsg->DLC = 8;


Обработчик прерывания приема
Код
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* CanHandle)
  {
  if((hcan.pRxMsg->StdId == 0x480) && (NewDataFromCAN == 0))
    {
    BUF_Data[0]          = hcan.pRxMsg->Data[0];
    BUF_Data[1]          = hcan.pRxMsg->Data[1];
    BUF_Data[2]          = hcan.pRxMsg->Data[2];
    BUF_Data[3]          = hcan.pRxMsg->Data[3];
    BUF_Data[4]          = hcan.pRxMsg->Data[4];
    BUF_Data[5]          = hcan.pRxMsg->Data[5];
    BUF_Data[6]          = hcan.pRxMsg->Data[6];
    BUF_Data[7]          = hcan.pRxMsg->Data[7];//hcan.pRxMsg->Data[6];

//  HAL_CAN_Transmit(&hcan, 100);//100
    NewDataFromCAN       = 1;
    }

  while(Error_Code = HAL_CAN_Receive_IT(&hcan, CAN_FIFO0) != HAL_OK)
    {
    /* Reception Error */
    Error_Handler_CAN();
    }


Обработчик ошибки инициализации приема CAN пакетов
Код
void Error_Handler_CAN(void)
{
  /* USER CODE BEGIN Error_Handler */
  /* User can add his own implementation to report the HAL error return state */

  SPI_Data[0] = 0xFF;
  SPI_Data[1] = 0xFF;
  HAL_CAN_DeInit(&hcan);

  while(SPI_Data[0] != 0)
    {
    HAL_SPI_Transmit(&hspi2, ((uint8_t*)&SPI_Data[0]),1,1000);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);            // SPI strob
    for(My_i=0; My_i<10; My_i++){__NOP();}
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);

    SPI_Data[0] >>= 1;
    SPI_Data[1] = Error_Code;
    HAL_Delay(1500);
    }
  MX_CAN_Init();
  My_CAN_FilterConf();
  /* USER CODE END Error_Handler */
}


--------------------
Go to the top of the page
 
+Quote Post
yes
сообщение Jul 7 2016, 14:56
Сообщение #2


Гуру
******

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



там (в HAL) в драйвере ошибка, по-моему

--- stm32f3xx_hal_can.c
+++ stm32f3xx_hal_can.c
@@ -758,6 +758,10 @@ HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan)
/* Request transmission */
hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ;
}
+ else
+ {
+ __HAL_UNLOCK(hcan);
+ }
}
else
{
Go to the top of the page
 
+Quote Post
SergR
сообщение Jul 7 2016, 16:02
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 288
Регистрация: 25-06-05
Пользователь №: 6 304



Не совсем понял что означает
Цитата
--- stm32f3xx_hal_can.c
+++ stm32f3xx_hal_can.c
@@ -758,6 +758,10 @@

Но в stm32f3xx_hal_can.c добавил:
Прикрепленное изображение

К сожалению не помогло...


--------------------
Go to the top of the page
 
+Quote Post
SergR
сообщение Jul 7 2016, 20:02
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 288
Регистрация: 25-06-05
Пользователь №: 6 304



PS
Даже один Контроллер затыкается на прием, только через больший промежуток времени...


--------------------
Go to the top of the page
 
+Quote Post
yes
сообщение Jul 7 2016, 20:43
Сообщение #5


Гуру
******

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



посмотрите счетчики ошибок.
сброс CAN-а делаете через APBRESET (не помню точно название)? эти счетчики сбрасываются только так, по-крайней мере сброс в самом CAN-е их не изменяет.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jul 8 2016, 07:22
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Не надо счётчики сбрасывать.
Если очень вдумчиво почитать спецификацию от Боша, выяснится, что счётчики - штука информационная.
Если шина "живая", счётчики автоматически уменьшаются, через некоторое время передатчик включается автоматически.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
dvi
сообщение Jul 8 2016, 11:46
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 3-05-07
Пользователь №: 27 479



В настройке CAN если
CanHandle.Init.ABOM = DISABLE;
надо включить
CanHandle.Init.ABOM = ENABLE;

и если с шиной все нормально счетчики ошибок сами постепенно сбросятся (как писал esaulenka).

а может проблема с самой шиной или с таймингами ?
Go to the top of the page
 
+Quote Post
SergR
сообщение Jul 8 2016, 13:09
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 288
Регистрация: 25-06-05
Пользователь №: 6 304



Цитата
В настройке CAN если
CanHandle.Init.ABOM = DISABLE;
надо включить
CanHandle.Init.ABOM = ENABLE;

Да в настройках было CanHandle.Init.ABOM = DISABLE; заменил на CanHandle.Init.ABOM = ENABLE;
Но проблема не ушла. Вот скрин:
Прикрепленное изображение

Счетчики ошибок TEC и REC по нолям...

И еще, если закоментить вызов Error_Handler_CAN то при возникновении этого затыка, СТМ продолжает выставлять акноледжи на приходящие пакеты... Вот осциллограмма на ногах процессора RX - желтый TX - бирюзовый:
Прикрепленное изображение


--------------------
Go to the top of the page
 
+Quote Post
dvi
сообщение Jul 8 2016, 13:18
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 3-05-07
Пользователь №: 27 479



проверь сигналы CAN-H и CAN-L. может все таки проблема в физике шины

Сообщение отредактировал IgorKossak - Jul 8 2016, 17:06
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
SergR
сообщение Jul 8 2016, 13:26
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 288
Регистрация: 25-06-05
Пользователь №: 6 304



Вот типичный сигнал на шине:
Прикрепленное изображение


--------------------
Go to the top of the page
 
+Quote Post
dvi
сообщение Jul 8 2016, 13:31
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 3-05-07
Пользователь №: 27 479



а какой из них CAN-H и CAN-L ?

Сообщение отредактировал IgorKossak - Jul 8 2016, 17:07
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
SergR
сообщение Jul 8 2016, 13:39
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 288
Регистрация: 25-06-05
Пользователь №: 6 304



Желтый CAN-H
Бирюзовый CAN-L
И микросхема дайвер кана на 3.3В SN65HVD230Q


--------------------
Go to the top of the page
 
+Quote Post
dvi
сообщение Jul 8 2016, 13:52
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 3-05-07
Пользователь №: 27 479



вроде у CAn-H амплитуда маленькая . вроде должно быть в примерно до 3-3.3 V.

а резисторы по 120 Ом по концам шины стоят?

Сообщение отредактировал IgorKossak - Jul 8 2016, 17:07
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
ozone
сообщение Jul 8 2016, 13:59
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 11-08-15
Пользователь №: 87 951



Да, уровни какие то не дотягивающие.

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
SergR
сообщение Jul 8 2016, 14:12
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 288
Регистрация: 25-06-05
Пользователь №: 6 304



Резисторы конешно есть. Почему ампледуда на CAN-H не дотягивает до3В, сложно сказать. Возможно потому что у меня питание не 5В а 3.3В.
PS
"Маленькая" не точность!!! После CanHandle.Init.ABOM = ENABLE; затык происходит, но переинициализация CAN модуля в Error_Handler_CAN Выводит его из ступора!!! Это уже прогресс.


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 15:39
Рейтинг@Mail.ru


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