STM32F4-Arduino CANBUS İletişimi

Başlatan CmlDrmz, 03 Nisan 2021, 23:32:14

CmlDrmz

Merhabalar, bir projem için STM32F4 DISC kartı ile Arduino Uno'yu CANBUS portu üzerinden haberleştirmem gerekiyor. Bunun için STM tarafında SN65HVD230 kullandım. Arduino tarafında ise MCP2515 modülü kullandım. CANH ve CANL pinleri arasında 120ohm direnç mevcut.Bu durumda Arduino tarafından mesaj iletilmesine rağmen STM nedense TX portundan herhangi bir mesaj gönderemiyor.
CubeIDE'de main dosyasında yaptığım tanımlama kısmı şu şekildedir:
  //Starting CAN
  HAL_CAN_Start(&hcan1);

  //Activating Interruption
  HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);

  //Filter Configuration
  sFilterConfig.FilterActivation = CAN_FILTER_ENABLE;
  sFilterConfig.FilterBank = 0;
  sFilterConfig.FilterFIFOAssignment = CAN_FilterFIFO0;
  sFilterConfig.FilterIdHigh = 0x001F<<5;
  sFilterConfig.FilterIdLow = 0;
  sFilterConfig.FilterMaskIdHigh = 0;
  sFilterConfig.FilterMaskIdLow = 0;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

  HAL_CAN_ConfigFilter(&hcan1,&sFilterConfig);

  //CAN Message Configuration
  pTxHeader.DLC = 1;
  pTxHeader.IDE = CAN_ID_STD;
  pTxHeader.RTR = CAN_RTR_DATA;
  pTxHeader.StdId = 0x001F;
  pTxHeader.TransmitGlobalTime = DISABLE;

  /* USER CODE END 2 */

Kesmelere girdiği kısım ise şu şekildedir.
void EXTI0_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_IRQn 0 */

  /* USER CODE END EXTI0_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  /* USER CODE BEGIN EXTI0_IRQn 1 */
  if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
  {
	    tData[0] = 37;
		HAL_CAN_AddTxMessage(&hcan1, &pTxHeader,tData, &pTxMailbox);
		dogrumu = HAL_CAN_IsTxMessagePending(&hcan1, pTxMailbox);
  }
  /* USER CODE END EXTI0_IRQn 1 */
}

/**
  * @brief This function handles CAN1 RX0 interrupts.
  */
void CAN1_RX0_IRQHandler(void)
{
  /* USER CODE BEGIN CAN1_RX0_IRQn 0 */

  /* USER CODE END CAN1_RX0_IRQn 0 */
  HAL_CAN_IRQHandler(&hcan1);
  /* USER CODE BEGIN CAN1_RX0_IRQn 1 */
  HAL_CAN_GetRxMessage(&hcan1,CAN_RX_FIFO0,&pRxHeader,&data);
  HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_12);
  /* USER CODE END CAN1_RX0_IRQn 1 */
}

STM'in tx pininde tık yok :)

robikod

STM32 tarafında Canbus'un aşağıdaki gibi konfigürasyonu daha olması lazım. Bu durum haberleşme hızının ve canbus çalışma modunun hangi ayarlamalarda olduğunu etkiler.

  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 3;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_11TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
  hcan1.Init.TimeTriggeredMode = DISABLE;
  hcan1.Init.AutoBusOff = DISABLE;
  hcan1.Init.AutoWakeUp = DISABLE;
  hcan1.Init.AutoRetransmission = ENABLE;
  hcan1.Init.ReceiveFifoLocked = DISABLE;
  hcan1.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

e-zeki

@CmlDrmz
1- kodda önce filtre ayarlarını yap sonra canbusı başlat sonra da kesmeyi aktif et. sen ön ayarları tamamlamadan kesme aktif ediyorsun.
2- @robikod 'un dediği gibi quanta bitlerini doğru ayarlaman gerekiyor. hem hesaba hemde quanta bit timing'e uyuyor olması lazım.
2 - SN65HVD230 bu entegrenin slope pinine gerilim bölücü devre yaptıysan dirençlerle onları sök. slew rate kontrolü yaparak alıyorsa breadboarda dizdiğin devrede slew rate kontrolü olursa mesaj alamazsın.