Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => STM32 Örnekleri => Konuyu başlatan: esdevhk - 15 Temmuz 2018, 00:52:11

Başlık: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 15 Temmuz 2018, 00:52:11
İyi çalışmalar arkadaşlar,

STM32F0 HAL kütüphanesi ile CAN haberleşmesi yapacağım. STM32F0 library klasöründeki CAN örneklerini inceledim ve denedim. Fakat olmadı. Aslında kullanılan fonksiyonların çok bir esprisi yok fakat belki bir detayı kaçırdığımdan bir çıktı alamadım.

Aranızda STM32F0/F3 ile CAN haberleşmesi yapmış arkadaşlar var ise bana yol gösterici olabilir mi? Yaptığı projelerin kodlarını incelemem için atsa hiç fena olmaz. Ya da CAN haberleşmesinde CONFIG ayarlarındaki ince ayarlar nelerdir? Ne yapmazsam sıkıntı olur vs gibi.

Şimdiden teşekkür ederim,iyi çalışmalar.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: mehmet - 15 Temmuz 2018, 21:09:15
Siz yaptığınız çalışmayı
paylaşın. Hata ve eksikleri
belirtin. Daha fazla yardım
alabilirsiniz.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 09:42:09
Alıntı yapılan: mehmet - 15 Temmuz 2018, 21:09:15Siz yaptığınız çalışmayı
paylaşın. Hata ve eksikleri
belirtin. Daha fazla yardım
alabilirsiniz.

Hocam aslında ST firmasının hazırladığı hazır örneklerden kullandım. Belki kullandığım USB-CAN converter'da bir sıkıntı vardır bilmiyorum. Amacım HAL kütüphanelerindeki CAN fonksiyonlarının tam olarak işlevi ki aslında basit. Klasik transmit ve receive fonksiyonları. Sizlerden yapmış olduğunuz örnekleri istedim ki inceleyeyim,aradaki farkları göreyim belki bir ipucu olur bana. Fakat yine de kullandığım uygulama kodlarını bırakıyorum buraya.

Şimdiden teşekkürler,iyi çalışmalar.

/**
  ******************************************************************************
  * @file    CAN/CAN_Networking/Src/main.c
  * @author  MCD Application Team
  * @brief  This example shows how to configure the CAN peripheral
  *          to send and receive CAN frames in normal mode. The sent frames
  *          are used to control Leds by pressing Tamper push-button.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *  1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *  2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *  3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/** @addtogroup STM32F0xx_HAL_Examples
  * @{
  */

/** @addtogroup CAN_Networking
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define KEY_PRESSED    0x00
#define KEY_NOT_PRESSED 0x01
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint8_t ubKeyNumber = 0x0;
CAN_HandleTypeDef    CanHandle;

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void Error_Handler(void);
static void CAN_Config(void);
static void LED_Display(uint8_t LedStatus);

/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
 
  /* STM32F0xx HAL library initialization:
      - Configure the Flash prefetch
      - Systick timer is configured by default as source of time base, but user
        can eventually implement his proper time base source (a general purpose
        timer for example or other time source), keeping in mind that Time base
        duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
        handled in milliseconds basis.
      - Low Level Initialization
    */
  HAL_Init();

  /* Configure the system clock to 48 MHz */
  SystemClock_Config();

  /* Configure LED1, LED2, LED3 and LED4 */
  BSP_LED_Init(LED1);
  BSP_LED_Init(LED2);
  BSP_LED_Init(LED3);
  BSP_LED_Init(LED4);

  /* Configure Tamper push-button */
  BSP_PB_Init(BUTTON_TAMPER, BUTTON_MODE_GPIO);

  /*##-1- Configure the CAN peripheral #######################################*/
  CAN_Config();

  /*##-2- Start the Reception process and enable reception interrupt #########*/
  if (HAL_CAN_Receive_IT(&CanHandle, CAN_FIFO0) != HAL_OK)
  {
    /* Reception Error */
    Error_Handler();
  }

  /* Infinite loop */
  while (1)
  {
    while (BSP_PB_GetState(BUTTON_TAMPER) == KEY_PRESSED)
    {
      if (ubKeyNumber == 0x4)
      {
        ubKeyNumber = 0x00;
      }
      else
      {
        LED_Display(++ubKeyNumber);
       
        /* Set the data to be transmitted */
        CanHandle.pTxMsg->Data[0] = ubKeyNumber;
        CanHandle.pTxMsg->Data[1] = 0xAD;
       
        /*##-3- Start the Transmission process ###############################*/
        if (HAL_CAN_Transmit(&CanHandle, 10) != HAL_OK)
        {
          /* Transmission Error */
          Error_Handler();
        }
        HAL_Delay(10);
       
        while (BSP_PB_GetState(BUTTON_TAMPER) != KEY_NOT_PRESSED)
        {
        }
      }
    }
  }
}

/**
  * @brief  System Clock Configuration
  *        The system Clock is configured as follow :
  *            System Clock source            = PLL (HSE)
  *            SYSCLK(Hz)                    = 48000000
  *            HCLK(Hz)                      = 48000000
  *            AHB Prescaler                  = 1
  *            APB1 Prescaler                = 1
  *            HSE Frequency(Hz)              = 8000000
  *            PREDIV                        = 1
  *            PLLMUL                        = 6
  *            Flash Latency(WS)              = 1
  * @param  None
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;
 
  /* Enable HSE Oscillator and Activate PLL with HSE as source */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
  {
    /* Initialization Error */
    while(1);
  }

  /* Select PLL as system clock source and configure the HCLK, PCLK1 clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1)!= HAL_OK)
  {
    /* Initialization Error */
    while(1);
  }
}



/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
static void Error_Handler(void)
{
  while (1)
  {
  }
}

/**
  * @brief  Configures the CAN.
  * @param  None
  * @retval None
  */
static void CAN_Config(void)
{
  CAN_FilterConfTypeDef  sFilterConfig;
  static CanTxMsgTypeDef        TxMessage;
  static CanRxMsgTypeDef        RxMessage;

  /*##-1- Configure the CAN peripheral #######################################*/
  CanHandle.Instance = CANx;
  CanHandle.pTxMsg = &TxMessage;
  CanHandle.pRxMsg = &RxMessage;

  CanHandle.Init.TTCM = DISABLE;
  CanHandle.Init.ABOM = DISABLE;
  CanHandle.Init.AWUM = DISABLE;
  CanHandle.Init.NART = DISABLE;
  CanHandle.Init.RFLM = DISABLE;
  CanHandle.Init.TXFP = DISABLE;
  CanHandle.Init.Mode = CAN_MODE_NORMAL;
  CanHandle.Init.SJW = CAN_SJW_1TQ;
  CanHandle.Init.BS1 = CAN_BS1_5TQ;
  CanHandle.Init.BS2 = CAN_BS2_6TQ;
  CanHandle.Init.Prescaler = 4;

  if (HAL_CAN_Init(&CanHandle) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }

  /*##-2- Configure the CAN Filter ###########################################*/
  sFilterConfig.FilterNumber = 0;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig.FilterIdHigh = 0x0000;
  sFilterConfig.FilterIdLow = 0x0000;
  sFilterConfig.FilterMaskIdHigh = 0x0000;
  sFilterConfig.FilterMaskIdLow = 0x0000;
  sFilterConfig.FilterFIFOAssignment = 0;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.BankNumber = 14;

  if (HAL_CAN_ConfigFilter(&CanHandle, &sFilterConfig) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }

  /*##-3- Configure Transmission process #####################################*/
  CanHandle.pTxMsg->StdId = 0x321;
  CanHandle.pTxMsg->ExtId = 0x01;
  CanHandle.pTxMsg->RTR = CAN_RTR_DATA;
  CanHandle.pTxMsg->IDE = CAN_ID_STD;
  CanHandle.pTxMsg->DLC = 2;
}

/**
  * @brief  Transmission  complete callback in non blocking mode
  * @param  CanHandle: pointer to a CAN_HandleTypeDef structure that contains
  *        the configuration information for the specified CAN.
  * @retval None
  */
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
{
  if ((CanHandle->pRxMsg->StdId == 0x321) && (CanHandle->pRxMsg->IDE == CAN_ID_STD) && (CanHandle->pRxMsg->DLC == 2))
  {
    LED_Display(CanHandle->pRxMsg->Data[0]);
    ubKeyNumber = CanHandle->pRxMsg->Data[0];
  }

  /* Receive */
  if (HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0) != HAL_OK)
  {
    /* Reception Error */
    Error_Handler();
  }
}

/**
  * @brief  Turns ON/OFF the dedicated LED.
  * @param  LedStatus: LED number from 0 to 3
  * @retval None
  */
void LED_Display(uint8_t LedStatus)
{
  /* Turn OFF all LEDs */
  BSP_LED_Off(LED1);
  BSP_LED_Off(LED2);
  BSP_LED_Off(LED3);
  BSP_LED_Off(LED4);

  switch(LedStatus)
  {
    case (1):
      /* Turn ON LED1 */
      BSP_LED_On(LED1);
      break;

    case (2):
      /* Turn ON LED2 */
      BSP_LED_On(LED2);
      break;

    case (3):
      /* Turn ON LED3 */
      BSP_LED_On(LED3);
      break;

    case (4):
      /* Turn ON LED4 */
      BSP_LED_On(LED4);
      break;
    default:
      break;
  }
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *        where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(char *file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}

#endif

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: e-zeki - 16 Temmuz 2018, 10:26:51
Hocam nasıl bir hata aldığını bilmeden CAN BUS ile alakalı bir yardımda bulunmak çok zor. Mesela filtre kullanmayacağım diyerek filtre ayarlarını hiç yapmazsan can bus çalışmaz. Yada quanta bitleri yanlış ayarlarsan yine çalışmaz. Senin sorunun bilgi alamamak mı? yanlış almak mı? HardFault error mu biraz detay vermen lazım.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 10:41:37
Alıntı yapılan: e-zeki - 16 Temmuz 2018, 10:26:51Hocam nasıl bir hata aldığını bilmeden CAN BUS ile alakalı bir yardımda bulunmak çok zor. Mesela filtre kullanmayacağım diyerek filtre ayarlarını hiç yapmazsan can bus çalışmaz. Yada quanta bitleri yanlış ayarlarsan yine çalışmaz. Senin sorunun bilgi alamamak mı? yanlış almak mı? HardFault error mu biraz detay vermen lazım.

Hemen veriyorum hocam. Kendim şöyle bir kod yazdım.
/**
  ******************************************************************************
  * @file          : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2018 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *  1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *  2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *  3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f3xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
CAN_HandleTypeDef hcan;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
CAN_FilterConfTypeDef  sFilterConfig;
static CanTxMsgTypeDef        TxMessage;
static CanRxMsgTypeDef        RxMessage;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

static void CAN_Config()
{
 hcan.pTxMsg = &TxMessage;
  hcan.pRxMsg = &RxMessage;
 
 /*##-2- Configure the CAN Filter ###########################################*/
  sFilterConfig.FilterNumber = 0;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig.FilterIdHigh = 0x0000;
  sFilterConfig.FilterIdLow = 0x0000;
  sFilterConfig.FilterMaskIdHigh = 0x0000;
  sFilterConfig.FilterMaskIdLow = 0x0000;
  sFilterConfig.FilterFIFOAssignment = 0;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.BankNumber = 14;

  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }

  /*##-3- Configure Transmission process #####################################*/
  hcan.pTxMsg->StdId = 0x321;
  hcan.pTxMsg->ExtId = 0x01;
  hcan.pTxMsg->RTR = CAN_RTR_DATA;
  hcan.pTxMsg->IDE = CAN_ID_STD;
  hcan.pTxMsg->DLC = 1;
}

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
{
 if((hcan->pRxMsg->StdId == 0x321) && (hcan->pRxMsg->IDE == CAN_ID_STD) && (hcan->pRxMsg->DLC == 1))
 {
 if(hcan->pRxMsg->Data[0] == 0x58)
 {
 HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
 }
 }
 
 // Receive
 if (HAL_CAN_Receive_IT(hcan, CAN_FIFO0) != HAL_OK)
  {
    /* Reception Error */
    Error_Handler();
  }

}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CAN_Init();
  /* USER CODE BEGIN 2 */
 
 /*##-1- Configure the CAN peripheral #######################################*/
 CAN_Config();
 
 /*##-2- Start the Reception process and enable reception interrupt #########*/
 if (HAL_CAN_Receive_IT(&hcan, CAN_FIFO0) != HAL_OK)
 {
 /* Reception Error */
 Error_Handler();
 }
 
 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
 if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin) == GPIO_PIN_RESET)
 {
 TxMessage.Data[0] = 0x58;
      //hcan.pTxMsg->Data[0] = 0x58;
 
 /*##-3- Start the Transmission process ###############################*/
 if(HAL_CAN_Transmit(&hcan,100)!=HAL_OK)
 {
 Error_Handler();
 }
 
 HAL_Delay(100);
 }
 
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* CAN init function */
static void MX_CAN_Init(void)
{

  hcan.Instance = CAN;
  hcan.Init.Prescaler = 12;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_5TQ;
  hcan.Init.BS2 = CAN_BS2_6TQ;
  hcan.Init.TTCM = DISABLE;
  hcan.Init.ABOM = DISABLE;
  hcan.Init.AWUM = DISABLE;
  hcan.Init.NART = DISABLE;
  hcan.Init.RFLM = DISABLE;
  hcan.Init.TXFP = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin : B1_Pin */
  GPIO_InitStruct.Pin = B1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : LD2_Pin */
  GPIO_InitStruct.Pin = LD2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *        where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Amacım şimdilik CAN hakkında fikir edinmek en azından data alıp-göndermeyi sağlayıp görmek. Logic analyser'da görebilirmek için Transmit ile 0x58 yolluyorum. Ayrıca i-7565-H1 CAN converter arayüzü ile de 0x58 datasını yollayıp LED yakmak istiyorum. Aslında fitre ayarlarının da tam olarak neden yapıldığını bilmiyorum. Çoğu örnekte yapıldığını gördüm diye koydum ne yalan söyleyeyim.
Yazdığım kodu çalıştırdığımda ise while(1) içerisindeki HAL_CAN_Transmit() fonksiyonuna geldiğinde debugging işlemi sona eriyor daha ilerleyemiyorum. Sebebini de anlamadım. Kodumda bir hata var mı?
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: e-zeki - 16 Temmuz 2018, 14:10:03

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
 if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin) == GPIO_PIN_RESET)
 {
 TxMessage.Data[0] = 0x58;
      //hcan.pTxMsg->Data[0] = 0x58;
 
 /*##-3- Start the Transmission process ###############################*/
 if(HAL_CAN_Transmit(&hcan,100)!=HAL_OK)
 {
 Error_Handler();
 }
 
 HAL_Delay(100);
 }
hocam bu kısımda Error Handler'a mı düşüyor yoksa devam mı ediyor?
Debug mode'da can handler'ı watch ekranında açıp bi bakar mısın error code ne veriyor?
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 14:21:40
Alıntı yapılan: e-zeki - 16 Temmuz 2018, 14:10:03
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
 if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin) == GPIO_PIN_RESET)
 {
 TxMessage.Data[0] = 0x58;
      //hcan.pTxMsg->Data[0] = 0x58;
 
 /*##-3- Start the Transmission process ###############################*/
 if(HAL_CAN_Transmit(&hcan,100)!=HAL_OK)
 {
 Error_Handler();
 }
 
 HAL_Delay(100);
 }
hocam bu kısımda Error Handler'a mı düşüyor yoksa devam mı ediyor?
Debug mode'da can handler'ı watch ekranında açıp bi bakar mısın error code ne veriyor?

Hocam kod Error_handler()'a girmiyor. Transmit içerisinde timeout kısmında devamlı dönüp duruyor.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: e-zeki - 16 Temmuz 2018, 14:57:37
Hocam Timeout'a düşüyorsa senin karşı taraftan ack alamıyor olman yüksek ihtimal.Bunun da türlü sebepleri var; Canbusta iki uçta da can entegresi olması lazım. 120 ohm sonlandırma dirençleri bağlı olması lazım. Bunlar tamam mı?
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 15:08:33
Alıntı yapılan: e-zeki - 16 Temmuz 2018, 14:57:37Hocam Timeout'a düşüyorsa senin karşı taraftan ack alamıyor olman yüksek ihtimal.Bunun da türlü sebepleri var; Canbusta iki uçta da can entegresi olması lazım. 120 ohm sonlandırma dirençleri bağlı olması lazım. Bunlar tamam mı?

i-7565-H1 Usb to Can converter kullanıyorum hocam. Onun bir arayüzü var ve dataları oraya gönderip oradan da data yolluyorum MCU ya. CAN dönüştürücü devrem de mevcut 120ohm sonlandırma direnci bağlı.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 15:15:14
Alıntı yapılan: e-zeki - 16 Temmuz 2018, 14:57:37Hocam Timeout'a düşüyorsa senin karşı taraftan ack alamıyor olman yüksek ihtimal.Bunun da türlü sebepleri var; Canbusta iki uçta da can entegresi olması lazım. 120 ohm sonlandırma dirençleri bağlı olması lazım. Bunlar tamam mı?

Yazdığım kodları 3 farklı MCU da farklı farklı Baudrate ile denedim hepsinde aynı sıkıntıyı yaşıyorum. Sıkıntım CAN dönüştürücülerde olabilir mi?
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: eeburakdemir - 16 Temmuz 2018, 15:25:18
Merhaba,
Can converter , loop back moda alıp deneyin. Arızalı olup olmadığını bu şekilde de anlayabilirsiniz. Yazılıma debug yaptınız mı ? Ayrıca kodlarınızda tanımlarla ilgili olarak da GPIO tanımlaması göremedim. HAL kütüphanesine hakim değilim ve hiç kullanmadığım için soruyorum bunu da. HAL_Init içinde mi yoksa diğer tanımlamalarda. Ayrıca ST nin verdiği birkaç örneği çalışmadı.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 15:27:25
Alıntı yapılan: eeburakdemir - 16 Temmuz 2018, 15:25:18Merhaba,
Can converter , loop back moda alıp deneyin. Arızalı olup olmadığını bu şekilde de anlayabilirsiniz. Yazılıma debug yaptınız mı ? Ayrıca kodlarınızda tanımlarla ilgili olarak da GPIO tanımlaması göremedim. HAL kütüphanesine hakim değilim ve hiç kullanmadığım için soruyorum bunu da. HAL_Init içinde mi yoksa diğer tanımlamalarda. Ayrıca ST nin verdiği birkaç örneği çalışmadı.
Evet öncelikle çoğu GPIO ayarı HAL kütüphaneleri içinde hallediliyor. Normal mode ve loop back arasındaki fark nedir?
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: e-zeki - 16 Temmuz 2018, 15:40:55
Hocam Debug'dan bakman gerek can error register'ına  ne düşüyor diye.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 15:45:45
Alıntı yapılan: e-zeki - 16 Temmuz 2018, 15:40:55Hocam Debug'dan bakman gerek can error register'ına  ne düşüyor diye.

Baktım hocam herhangi bir error düşmüyor :( ''Cannot evaluate'' yazıyor. Elimdeki CAN converter arayüzünden veri göndermek istediğimde converter'in ERROR ledi yanıp sönüyor bu da transmit hatası anlamına geliyor. Fakat bunun sebebibi anlamadım. Yukarıdaki arkadaşın dediğim gibi ''loop back'' moduna aldığımda o transmit timeout da takılma hatası giderildi ama yine de arayüzden herhangi bir data göremiyorum.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: e-zeki - 16 Temmuz 2018, 15:58:24
"Cannot evaluate" yazıyorsa ya fonksiyon atıyorsunuz ya lokal değişken CanTypeDef'iniz neyse onu atın debuga. hcan'i tutup atarsanız açılır bir struct yapısı gelmesi gerek. cannot evaluate deme ihtimali yok can handle için.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 16:20:02
Alıntı yapılan: e-zeki - 16 Temmuz 2018, 15:58:24"Cannot evaluate" yazıyorsa ya fonksiyon atıyorsunuz ya lokal değişken CanTypeDef'iniz neyse onu atın debuga. hcan'i tutup atarsanız açılır bir struct yapısı gelmesi gerek. cannot evaluate deme ihtimali yok can handle için.

Durum bu hocam.

(http://i.hizliresim.com/WD0XVE.png)
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: e-zeki - 16 Temmuz 2018, 16:34:19
o zaman bilemedim hocam benim CAN BUS'ım bitti bu kadar :D
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 16:36:39
Alıntı yapılan: e-zeki - 16 Temmuz 2018, 16:34:19o zaman bilemedim hocam benim CAN BUS'ım bitti bu kadar :D

Hocam kodlarımda bir yanlışlık var mı ??
Baudrate hesabını da şuna göre yapıyorum : BR = PCLK / [(Tseq1 + Tseq2 + 1) * PRESCALAR]

Varsa eğer örnek kodlarınız alabilir miyim?
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: e-zeki - 16 Temmuz 2018, 17:09:40
PCLK yerine CANBUS clok hangi Bus üstündeyse onun değerini yazmanız lazım f4'lerde APB1 Bus'ına bağlı mesela F0'larda durum ne bilmiyorum.
Örnek 168 MHZ'de koşan f4 serisi bir mcu APB1 Bus hızı 42MHz'dir

42MHZ/(psclr*(BS1_TQ+BS2_TQ+1)) şeklinde hesaplanır
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 16 Temmuz 2018, 17:16:17
Alıntı yapılan: e-zeki - 16 Temmuz 2018, 17:09:40PCLK yerine CANBUS clok hangi Bus üstündeyse onun değerini yazmanız lazım f4'lerde APB1 Bus'ına bağlı mesela F0'larda durum ne bilmiyorum.
Örnek 168 MHZ'de koşan f4 serisi bir mcu APB1 Bus hızı 42MHz'dir

42MHZ/(psclr*(BS1_TQ+BS2_TQ+1)) şeklinde hesaplanır

Ben şuanda F0 kullanıyorum ve clock ayarlarımda hepsi 48M hz şuan da. Bende şuan bilmiyorum hangisine bağlı olduğunu ama hepsi 48M Hz oldugundan bakmadım. Fakat günlerdir uğraşıyorum,araştırıyorum ve hala sıkıntıyı bulamadım. Umarım dönüştürücemde vs sorun vardır.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: e-zeki - 16 Temmuz 2018, 17:33:16
Alıntı YapUmarım dönüştürücemde vs sorun vardır.
Hocam umarım onda da sorun yoktur en kısa zamanda çözersin inşallah. boşa masraf olmasın.
F0 için referance manual var oradan bakabilirsin hangi bus'a bağlı olduğuna

Not: Kod veremiyorum çünkü tüm canbus kodlarım şirket bilgisayarında. herhangi bir şekilde kod paylaşımı yapma iznim yok maalesf
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: deneme_1234 - 17 Temmuz 2018, 00:26:00
Güzelim std_lib'i mahvetti ST böyle çoluk çombalak HAL'larla uğraşıyoruz.

F0 serisi gibi basit serilerde HAL ile uğraşmayın. STD LIB'e yönelin. İki dk'da CAN kütüphanesini adam edersiniz.

Bir de keil'ın F103 için yazdığı bir kod var cidden inanılmaz iyi.

STM32'de CAN ayarlamaları kolaydır ayrıca ve sorunsuz çalışır.

STM32'nin bir USB kütüphaneleri kötü şu ana dek, ben hep STD LIB kullandım F4 serilerinde bile, millet HAL'ı çözücem derken adamların verdikleri örnekler üzerinden ne motor sürücüler yaptık :)
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 17 Temmuz 2018, 08:04:13
Alıntı yapılan: deneme_1234 - 17 Temmuz 2018, 00:26:00Güzelim std_lib'i mahvetti ST böyle çoluk çombalak HAL'larla uğraşıyoruz.

F0 serisi gibi basit serilerde HAL ile uğraşmayın. STD LIB'e yönelin. İki dk'da CAN kütüphanesini adam edersiniz.

Bir de keil'ın F103 için yazdığı bir kod var cidden inanılmaz iyi.

STM32'de CAN ayarlamaları kolaydır ayrıca ve sorunsuz çalışır.

STM32'nin bir USB kütüphaneleri kötü şu ana dek, ben hep STD LIB kullandım F4 serilerinde bile, millet HAL'ı çözücem derken adamların verdikleri örnekler üzerinden ne motor sürücüler yaptık :)

Eminim sıkıntı bende zaten ama yazılımsal bir sıkıntı olduğunu düşünmüyorum. Config ayarlarında bir sıkıntı var ya da donanımsal bir aygıtım bozuk.
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: eeburakdemir - 17 Temmuz 2018, 09:18:35
Alıntı yapılan: huseyink - 16 Temmuz 2018, 15:27:25Evet öncelikle çoğu GPIO ayarı HAL kütüphaneleri içinde hallediliyor. Normal mode ve loop back arasındaki fark nedir?

Loop back mode siz verinizi gönderirsiniz , can transreceiver çipi kendi içinde canh-canl hattını birbirine bağlıyor gibi düşünebilirsiniz. Ardından verinizi alırsınız. Normal mode default ( genelde ) moddur. Standart kullanılan al gülüm ver gülüm yani  :)
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: bayram göktepe - 07 Ekim 2018, 22:34:26
Selam stm32f103c8t6 kullanıyorum. Hal kütüphanesini kullanarak canbus ile veri gönderebiliyorum fakat bir türlü çok uğraşmama rağmen veriyi okuyup alamıyorum. Yardımcı olabilirseniz sevinirim. cubemx ve keil kullanıyorum.


Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: esdevhk - 08 Ekim 2018, 14:04:17
Veri gönderdiğin halde okuyamaman biraz garip aslında. Donanımsal bir sıkıntın olmadığına emin misin? RX kablosu doğru mu?
Başlık: Ynt: STM32 HAL kütüphanesi CAN Haberleşmesi
Gönderen: Bünyamin Tamar - 25 Nisan 2019, 17:48:28
Ben de veri gönderiyorum. Ama ACK biti alıcı MCU tarafından verici MCU'ya gönderilmiyor. Bu yüzden iletişim tam olmadığı için sağlıklı bir veri de alınamıyor. Bunu nasıl çözebilirim. Ne önerirsiniz?