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

STM32f105 Проблема с приемом с новой библиотекой CAN

День добрый. 

 

Разбираюсь с каном в STM32f105 . 

Удалось запустить оба Can а, помог документ от Stm по переходу на новую библиотеку. Брал тут

 

Если по передаче сообщений вопросов нет, то вот с приемом получились вопросы. 

 

Для приема используется конструкция 

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
}

насколько я понял, это обработчик прерывания по приему. 

Но этот код срабатывает как на прием с can1, так и с can2,  и не понятно, откуда пришли данные.  Вопрос в том, как определять с какого из CAN пришло сообщение. 

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


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

Дак, Вам , вроде передается указатель типа CAN_HandleTypeDef на устройство. Проверить чему равен hcan и вызвать соответствующий обработчик.

	  switch(hcan->Instance)
	  {
	  	  case CAN1:
	  		  /* CAN1 Process */
	  		  break;
	  	  case CAN2:
	  		  /* CAN2 Process */
	  		  break;
	  }

 

Изменено пользователем Andrew_Q

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


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

4 часа назад, Andrew_Q сказал:

Дак, Вам , вроде передается указатель типа CAN_HandleTypeDef на устройство. Проверить чему равен hcan и вызвать соответствующий обработчик.


	  switch(hcan->Instance)
	  {
	  	  case CAN1:
	  		  /* CAN1 Process */
	  		  break;
	  	  case CAN2:
	  		  /* CAN2 Process */
	  		  break;
	  }

 

 

Спасибо, понял куда копать. 

только этот код выдает ошибку ../Src/main.c(400): error:  #31: expression must have integral type 

сейчас с этим пытаюсь разобраться. 

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


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

Приведите тип к int.

 switch((uint32_t)hcan->Instance)
	  {
	  	  case (uint32_t)CAN1:
	  		  /* CAN1 Process */
	  		  break;
	  	  case (uint32_t)CAN2:
	  		  /* CAN2 Process */
	  		  break;
	  }

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


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

8 минут назад, Andrew_Q сказал:

Приведите тип к int.


 switch((uint32_t)hcan->Instance)
	  {
	  	  case (uint32_t)CAN1:
	  		  /* CAN1 Process */
	  		  break;
	  	  case (uint32_t)CAN2:
	  		  /* CAN2 Process */
	  		  break;
	  }

Большое спасибо, заработало! 

пойду почитаю учебники по C/C++ что б таких вопросов больше не было

 

Вот такой код работает 

 

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{	
	  switch((uint32_t)hcan->Instance)
	  {
	  	  case (uint32_t)CAN1:
	  		  /* CAN1 Process */
				HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
				HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData);
	TxHeader.StdId=RxHeader.StdId; 
	TxHeader.DLC = RxHeader.DLC;
  TxHeader.IDE = RxHeader.IDE;
	HAL_CAN_AddTxMessage(&hcan2, &TxHeader, RxData, &TxMailbox);
	  		  break;
	  	  case (uint32_t)CAN2:
	  		  /* CAN2 Process */
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
	HAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &RxHeader, RxData);
	TxHeader.StdId=RxHeader.StdId; 
	TxHeader.DLC = RxHeader.DLC;
  TxHeader.IDE = RxHeader.IDE;
	HAL_CAN_AddTxMessage(&hcan1, &TxHeader, RxData, &TxMailbox);
	  		  break;
	  }
}

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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