STM32F0 ile ilgili HAL kodlarıyla CANBus uygulaması

Başlatan Bünyamin Tamar, 16 Nisan 2019, 13:03:28

Bünyamin Tamar

Merhaba forumdaşlar,
Ben STM32F0 işlemcileriyle HAL kütüphanesini kullanarak CANBus uygulaması gerçekleştirmek istiyorum. Fakat internette bir türlü kaynak bulamıyorum. Millet genelde I2C, USART, UART vs iletişim örnekleri paylaşmış. Özellikle YouTube'da bu konuyla ilgili örnek araştırdım. Fakat bulamadım. :(

Önerebileceğiniz bir kaynak var mı? [Özellikle bunu bekliyorum]
Bu işle daha önce uğraşan biri varsa bana bir fikir verebilir mi?
Bu sıkıntıyla daha önce karşılaşanlar muhakkak olmuştur.
Lütfen yardım edin.
 :du:

Bünyamin Tamar


Mucit23

STM32CubeF0 Software paketi içine baktınızmı?
https://my.st.com/content/my_st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32cube-mcu-mpu-packages/stm32cubef0.license=1555441114997.product=STM32CubeF0.version=1.9.0.html
Buradan ilgili dosyayı indirin.

STM32Cube_FW_F0_V1.9.0>>Projects>>STM32072B_EVAL>>Examples>>CAN>>CAN_Networking dizini içerisinde CanBus örneği var. Doğrudan kullanabilirsiniz.

Bünyamin Tamar

Cevap için teşekkürler. :)  Kaynağı inceledim. Bende de benzer veya aynı kaynaklar var. Fakat aralarında CAN ile ilgili bir örnek yok maalesef

Mucit23

Yahu nasıl yok!!! Aynı dosyalar bende de var. Acaba kaldırmışlarmı diye tekrar STM32CubeF0 'ı inidirip baktım. CAN örneği orda duruyor.

Aradığınız tam olarak nedir?

Bünyamin Tamar

Aynı geliştirme kartında (STM32F4 bu sefer ki) iki adet CAN modülünü kullanarak CAN iletişimi kurmaya çalışıyorum.
Ben şu kodları yazdım. Gönderim kısmı tamam. Çünkü osiloskop ekranında bir şeyler görüyorum. Fakat alıcı tarafında sıkıntı oluyor. CAN2 modülünde bir gelen mesaj yok.
Alıcı ID'si nasıl ayarlanır? Bilgisi olan var mı?
Kodların içinde sConfigFilter diye bir yer var. Buradan mı ayarlanıyor?
Herhangi bir kod gelmediğini alıcı interrupt'ının herhangi bir değer döndürmemesinden anlıyorum.
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file          : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */

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

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;

CAN_HandleTypeDef hcan1;

CAN_TxHeaderTypeDef pHeader1;

CAN_RxHeaderTypeDef pRxHeader1;

CAN_FilterTypeDef sFilterConfig1;

uint32_t TxMailbox1;

uint8_t a1;

uint8_t r1;

CAN_HandleTypeDef hcan2;

CAN_TxHeaderTypeDef pHeader2;

CAN_RxHeaderTypeDef pRxHeader2;

CAN_FilterTypeDef sFilterConfig2;

uint32_t TxMailbox2;

uint8_t a2;

uint8_t r2;

TIM_HandleTypeDef htim3;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_CAN1_Init(void);
static void MX_TIM3_Init(void);
static void MX_CAN2_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
#define green_on HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,1);
#define green_off HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,0);

#define yellow_on HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,1);
#define yellow_off HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,0);

#define red_on HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,1);
#define red_off HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,0);

#define blue_on HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,1);
#define blue_off HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,0);

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_ADC1_Init();
  MX_CAN1_Init();
  MX_TIM3_Init();
  MX_CAN2_Init();
  /* USER CODE BEGIN 2 */
 
 pHeader1.DLC = 1;
 pHeader1.IDE = CAN_ID_STD;
 pHeader1.RTR = CAN_RTR_DATA;
 pHeader1.StdId = 0x244;
 
 pHeader2.DLC = 1;
 pHeader2.IDE = CAN_ID_STD;
 pHeader2.RTR = CAN_RTR_DATA;
  pHeader2.StdId = 0x245;
 
 sFilterConfig1.FilterFIFOAssignment = CAN_FILTER_FIFO0;
 sFilterConfig1.FilterIdHigh = 0x245 << 5;
 sFilterConfig1.FilterIdLow = 0;
 sFilterConfig1.FilterMaskIdHigh = 0;
 sFilterConfig1.FilterMaskIdLow = 0;
 sFilterConfig1.FilterScale = CAN_FILTERSCALE_32BIT;
 sFilterConfig1.FilterActivation = CAN_FILTER_ENABLE;
 
 sFilterConfig2.FilterFIFOAssignment = CAN_FILTER_FIFO1;
 sFilterConfig2.FilterIdHigh = 0x245 << 5;
 sFilterConfig2.FilterIdLow = 0;
 sFilterConfig2.FilterMaskIdHigh = 0;
 sFilterConfig2.FilterMaskIdLow = 0;
 sFilterConfig2.FilterScale = CAN_FILTERSCALE_32BIT;
 sFilterConfig2.FilterActivation = CAN_FILTER_ENABLE;
 
 HAL_CAN_ConfigFilter(&hcan1,&sFilterConfig1);
 HAL_CAN_Start(&hcan1);
 HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);
 
 HAL_CAN_ConfigFilter(&hcan2,&sFilterConfig2);
 HAL_CAN_Start(&hcan2);
 HAL_CAN_ActivateNotification(&hcan2,CAN_IT_RX_FIFO1_MSG_PENDING); 

 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
 if( HAL_CAN_GetRxMessage(&hcan2,CAN_RX_FIFO0,&pRxHeader2,&r2) == HAL_OK )
 {
 GPIOD->ODR |= SET << 14;
 }
 else
 {
 GPIOD->ODR &= RESET << 14;
 }
    /* USER CODE END WHILE */
// a1 = 0x001;
// if ( HAL_CAN_AddTxMessage(&hcan1,&pHeader1,&a1,&TxMailbox1) == HAL_OK )
// {
// yellow_on;
// blue_on;
// red_off;
// }
// else
// {
// red_on;
// yellow_off;
// blue_off;
// }
// 
// HAL_Delay(100); 
// 
// if ( HAL_CAN_GetRxMessage(&hcan2,CAN_RX_FIFO0,&pRxHeader2,&r2) == HAL_OK )
// {
// 
// green_on;
// }
// else
// {
// green_off;
// }
// HAL_Delay(100); 
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage 
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  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.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** 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_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief ADC1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. 
  */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

/**
  * @brief CAN1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_CAN1_Init(void)
{

  /* USER CODE BEGIN CAN1_Init 0 */

  /* USER CODE END CAN1_Init 0 */

  /* USER CODE BEGIN CAN1_Init 1 */

  /* USER CODE END CAN1_Init 1 */
  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 21;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_12TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_4TQ;
  hcan1.Init.TimeTriggeredMode = DISABLE;
  hcan1.Init.AutoBusOff = DISABLE;
  hcan1.Init.AutoWakeUp = DISABLE;
  hcan1.Init.AutoRetransmission = DISABLE;
  hcan1.Init.ReceiveFifoLocked = DISABLE;
  hcan1.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN1_Init 2 */

  /* USER CODE END CAN1_Init 2 */

}

/**
  * @brief CAN2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_CAN2_Init(void)
{

  /* USER CODE BEGIN CAN2_Init 0 */

  /* USER CODE END CAN2_Init 0 */

  /* USER CODE BEGIN CAN2_Init 1 */

  /* USER CODE END CAN2_Init 1 */
  hcan2.Instance = CAN2;
  hcan2.Init.Prescaler = 21;
  hcan2.Init.Mode = CAN_MODE_NORMAL;
  hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan2.Init.TimeSeg1 = CAN_BS1_12TQ;
  hcan2.Init.TimeSeg2 = CAN_BS2_4TQ;
  hcan2.Init.TimeTriggeredMode = DISABLE;
  hcan2.Init.AutoBusOff = DISABLE;
  hcan2.Init.AutoWakeUp = DISABLE;
  hcan2.Init.AutoRetransmission = DISABLE;
  hcan2.Init.ReceiveFifoLocked = DISABLE;
  hcan2.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN2_Init 2 */

  /* USER CODE END CAN2_Init 2 */

}

/**
  * @brief TIM3 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM3_Init(void)
{

  /* USER CODE BEGIN TIM3_Init 0 */

  /* USER CODE END TIM3_Init 0 */

  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM3_Init 1 */

  /* USER CODE END TIM3_Init 1 */
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 0;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM3_Init 2 */

  /* USER CODE END TIM3_Init 2 */
  HAL_TIM_MspPostInit(&htim3);

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 GPIO_InitStruct.Pin = GPIO_PIN_12;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 
 GPIO_InitStruct.Pin = GPIO_PIN_13;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 
 GPIO_InitStruct.Pin = GPIO_PIN_14;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 
 GPIO_InitStruct.Pin = GPIO_PIN_15;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* 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****/

Mucit23

Filtrenin kullanım amacı gelen mesajları süzmektir. CAN ağını aslında bir topluluk olarak düşünebilirsiniz. Hat müsait olduğu sürece herkes hatta bir mesaj gönderir. Dolayısıyla bu mesaj hattaki tüm alıcılara ulaşır. İşte Filtre ile hattan sadece istenilen ID ile gönderilen mesajlar alınıp diğer mesajlar görmezden gelinebilir. Genellikle bu amaç ile kullanılır. Siz Filtre kullanmazsanız gelen tüm mesajları alırsınız.

Eğer iki adet node var ise hatta filtre kullanmata gerek yok demektir.

Sizin haberleşme hatanız baudrate ile ilgili olabilir. Her iki node'unda baudrate değeri eşit olmalı. Aksi durumda haberleşme gerçekleşmez.

e-zeki

önce can1 modülünüLOOPBACK modda çalıştırın. verinin kendi içinde dönüp dönmediğini kontrol edin.
Eğer veri alış verişi oluyorsa filtre ayarlarınızda bir sorun olabilir.
Ayrıca CAN2 modülü ayrı bir clk source ve sram erişim yetkisine sahip değil. Eğer can1 sürekli gönderim yapıyorsa, aynı anda can2 reception yapamıyor olabilir.

Bünyamin Tamar

Elimde sadece bir kart mevcut olduğu için CAN1 ve CAN2 modülleri arasında iletişim sağlamak istedim. Bütün ayarları birbirlerinin aynısı (prescaler falan). CAN1'den veri gönderimi oluyor. Ama CAN2'nin intterupt'ına bilgi gelince LED yak diyorum. Ama yakmıyor.

Yani iki farklı kart mı deneyeyim? Sanki bunu demek istediniz. Emin olmak istedim.
LOOPBACK modu için de şimdi deneme yapacağım.

Bünyamin Tamar

Alıntı yapılan: e-zeki - 24 Nisan 2019, 08:52:43önce can1 modülünüLOOPBACK modda çalıştırın. verinin kendi içinde dönüp dönmediğini kontrol edin.
Eğer veri alış verişi oluyorsa filtre ayarlarınızda bir sorun olabilir.
Ayrıca CAN2 modülü ayrı bir clk source ve sram erişim yetkisine sahip değil. Eğer can1 sürekli gönderim yapıyorsa, aynı anda can2 reception yapamıyor olabilir.

CAN1 modülü LOOPBACK modunda veri gönderiyor, fakat CAN1 RX interrupt'ı herhangi bir işlem yapmıyor.
CAN2 modülü için de LOOPBACK modunda veri göndermeye çalışıyorum. Fakat göndermiyor bile.

Bünyamin Tamar

Acaba donanımsal olarak yanlış bir bağlantı mı yapıyorum?
Aynı kartın üzerindeki iki modülü birleştirirken TX'ler ve RX'ler arasında çapraz bağlantı mı kuracağım? Yoksa Direk bağlantı mı? Ya da bunları da bırakıp CAN entegresi kullanarak mı bağlantı yapmam gerekiyor?
İki modülün de veri hatta veri bastığını gördüm az önce.

Tagli

CAN hakkında deneyimim yok. Ancak bana sanki arada CAN transceiver (her modül için 1'er tane) olması gerekir gibi geliyor. Çünkü CAN donanımları hatta veri basarken, aynı anda hattı dinlerler de. Böylece bastıkları verinin bir başka cihaz tarafından bastırılıp bastırılmadığını kontrol ederler. Doğrudan çapraz bağlantı yaparsan CAN donanımının kendini dinlemesine engel olursun diye tahmin ediyorum.
Gökçe Tağlıoğlu

Mucit23

Arada CAN Transreciever kullanılmalı. SN65HVD230 gibi bir çip kullanabilirsin. Doğrudan RX,TX bağlantıda çalışmıyor diye biliyorum.

Gerçi LoopBack ile çalışıyor. LoopBack Modundada Aynı çipin TX'i RX'e bağlanıyor. Emin olamadım bende

Siz yinede emin olmak için Can Transreciever kullanıp öyle deneyin

e-zeki

@Tagli  hocam haklı olabilir.
benim CAN1 CAN2 birlikte kullandığım bir proje var fakat test ederken CAN entegresi üzerinden denediğimi hatırlıyorum.
filtre ayarlarına şu satırı ekleyin
sFilterConfig1.FilterMode = CAN_FILTERMODE_IDMASK;

mask ve id high low parametrelerinin hepsine 0 yazın her hangi bir mesajı alacak hale getirin öyle deneyin

Bünyamin Tamar

Maalesef bunu yapınca da olmadı.
while (1)
  {
 r1 = HAL_CAN_GetRxMessage(&hcan1,CAN_RX_FIFO0,&pRxHeader1,&r1);
 switch(r1)
 {
 case HAL_OK:
 blue_on; break;
 case HAL_ERROR:
 red_on; break;
 case HAL_BUSY:
 yellow_on; break;
 case HAL_TIMEOUT:
 green_on;
 default: break;
 }
 HAL_Delay(100);
  }
RX interrupt'ı ile uğraşmayayım ve main içinde çalışayım dedim. Yukarıda fonksiyonu yazdım. HAL kütüphanesinde tanımlı olan mesaj alma fonksiyonu yukarıda görülmektedir. Geri dönüş bilgisi olarak error bilgisi döndürüyor. "busy" veya "timeout" döndürse keşke.