Jump to content

    

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 пришло сообщение. 

Share this post


Link to post
Share on other sites

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

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

 

Edited by Andrew_Q

Share this post


Link to post
Share on other sites
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 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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;
	  }
}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this