STM32 CAN Probleme mit Empfängnis(gelöst)

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
Chefbastler
Beiträge: 2665
Registriert: Mo 12. Aug 2013, 20:21
Wohnort: Südbayern

STM32 CAN Probleme mit Empfängnis(gelöst)

Beitrag von Chefbastler »

Ich bekomme den STM32F103C8T6 nicht dazu CAN-Telegramme zu empfangen.
Der CAN1_RX1_IRQHandler(void) wird schon gar nicht aufgerufen wenn ich Telegramme hinsende.
Im Loopbackmodus ebenfalls nicht.
Hatte mit dem RX-Filter auch schon ein wenig gespielt ohne Erfolg.

Einzig die "Ich habe richitg verstsnden" ACK Bits kommen beim hinsenden als Antwort richtig zurück.

Senden klappt dagegen ohne Probleme.

Hatte mir die HAL mit CubeMX erstellt.

Code: Alles auswählen


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

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

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

UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t can_message[4];
uint8_t can_rx_int = 0;
/* USER CODE END PV */

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

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
static volatile uint32_t TimingDelay;


void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan);
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* 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();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */




  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

	  /* USER CODE END WHILE */

	   /* USER CODE BEGIN 3 */

	 	  //HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

	 	  hcan.pTxMsg->StdId = 0x100;
	 	  hcan.pTxMsg->RTR = CAN_RTR_DATA;
	 	  hcan.pTxMsg->IDE = CAN_ID_STD;
	 	  hcan.pTxMsg->DLC = 8;

	       hcan.pTxMsg->Data[0] = 84;
	       hcan.pTxMsg->Data[1] = 69;
	       hcan.pTxMsg->Data[2] = 83;
	       hcan.pTxMsg->Data[3] = 84;
	       hcan.pTxMsg->Data[4] = 116;
	       hcan.pTxMsg->Data[5] = 101;
	       hcan.pTxMsg->Data[6] = 115;
	       hcan.pTxMsg->Data[7] = 116;
	 	   HAL_CAN_Transmit(&hcan, 10);

	 	 Delay(500);


  }
  /* USER CODE END 3 */

}


void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan) {

    // todo  ... CAN-Daten verarbeiten
	HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);

    __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP0); // hier mal fest FMPIE0 wieder freigeben, damit weitere CAN-Botschaften (CAN RX ISR ausgelöst werden)
}






/**
  * @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_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  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_DIV2;

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

  HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_1);

    /**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)
{
	static CanRxMsgTypeDef CanRX;
	static CanTxMsgTypeDef CanTX;
	CAN_FilterConfTypeDef myFilter;

	hcan.pRxMsg = &CanRX;
	hcan.pTxMsg = &CanTX;

  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 16;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_12TQ;
  hcan.Init.BS2 = CAN_BS2_5TQ;
  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__);
  }

    myFilter.FilterNumber = 0;
    myFilter.FilterMode = CAN_FILTERMODE_IDMASK;
    myFilter.FilterScale = CAN_FILTERSCALE_32BIT;
    myFilter.FilterIdHigh = 0x0000;
    myFilter.FilterIdLow = 0x0000;
    myFilter.FilterMaskIdHigh = 0x0000;
    myFilter.FilterMaskIdLow = 0x0000;
    myFilter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
    myFilter.FilterActivation = ENABLE;
    myFilter.BankNumber = 14;

    HAL_CAN_ConfigFilter(&hcan,&myFilter);


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


}

/* USART1 init function */
static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

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

  GPIO_InitTypeDef GPIO_InitStruct;

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

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : LED_Pin */
  GPIO_InitStruct.Pin = LED_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PA3 */
  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PA8 */
  GPIO_InitStruct.Pin = GPIO_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

void Delay(uint32_t nTime)
{
  TimingDelay = nTime;

  while(TimingDelay != 0);

}

void TimingDelay_Decrement(void)
{

  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }

}


/* 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****/
Zuletzt geändert von Chefbastler am Do 21. Jun 2018, 21:52, insgesamt 1-mal geändert.
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Fritzler »

Kannstes bitte noch als C Datei anhängen?
In dem Minifenster bei den Codetags bekommt man ja nen Föhn wenn man was sucht.
Benutzeravatar
Chefbastler
Beiträge: 2665
Registriert: Mo 12. Aug 2013, 20:21
Wohnort: Südbayern

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Chefbastler »

Hab mal das ganze Projekt angehängt.
Dateianhänge
STM32F103_CAN_Test.zip
(839.36 KiB) 65-mal heruntergeladen
Benutzeravatar
Nicki
Beiträge: 3127
Registriert: So 11. Aug 2013, 20:16
Wohnort: wo Mosel und Rhein sich treffen

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Nicki »

Einen Debugger hast du?
Guck mal, ob wirklich alle nötigen Module aktiviert sind, und wie das CAN-Modul konfiguriert ist (also was wirklich drin steht).
Ein Interrupthandler allein nützt nichts, wo aktivierst du die Interrupts?
Der STM32 reagiert auch zickig, wenn CAN außerhalb des Prozessors genutzt werden soll, und du nicht Transceiver und Abschlusswiderstand angeschlossen hast.
Zuletzt geändert von Nicki am Mo 18. Jun 2018, 23:12, insgesamt 1-mal geändert.
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Fritzler »

irgendwie vermisse ich, dass die CAN GPIOs auf "GPIO_MODE_AF_PP" gestellt werden (wie PA8 für den MCO)

Laut Tabelle 6.1 in der pdf wird das umgestellt aber im Code unter "MX_GPIO_Init(void)" ist es nicht zu sehen.
Benutzeravatar
Lukas
Beiträge: 157
Registriert: Mo 12. Aug 2013, 18:45

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Lukas »

Ich kann dir nurh empfehlen in den CubeMX Settings "Generate peripheral initialization as a pair of '.c/.h' files per peripheral" zu aktivieren. Wird sehr viel übersichtlicher. Wenn ich das mache habe ich in can.c:

Code: Alles auswählen

void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(canHandle->Instance==CAN1)
  {
  /* USER CODE BEGIN CAN1_MspInit 0 */

  /* USER CODE END CAN1_MspInit 0 */
    /* CAN1 clock enable */
    __HAL_RCC_CAN1_CLK_ENABLE();
  
    /**CAN GPIO Configuration    
    PA11     ------> CAN_RX
    PA12     ------> CAN_TX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* CAN1 interrupt Init */
    HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
  /* USER CODE BEGIN CAN1_MspInit 1 */

  /* USER CODE END CAN1_MspInit 1 */
  }
}
Hab gerade kein F103 zum Testen.

Edit.: Der Code ist auch in deinem Projekt in der Funktion HAL_CAN_MspInit
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Fritzler »

Hm, dann hab ich das übersehen.
Den Autogencode und die HAL kann ich wegen sowas eh überhaupt nicht leiden :lol:

Da musst du dir jetzt wohl mal eine FUnktion bauen welche die Statusregister ausließt und bei einer Änderung über den UART ausgibt.
Dann siehste welche Bits nicht gesetzt sind um den IRQ auszulösen oder ob der Eingangsfilter noch nicht richtig gebauchpinselt wurde.
i_h
Beiträge: 101
Registriert: Sa 7. Sep 2013, 11:04

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von i_h »

Der Code ist produktiv im Einsatz:

Code: Alles auswählen

	// enable CAN1 and GPIO clock
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	// init CAN IO ports
	GPIO_InitTypeDef gpio_init;
	gpio_init.GPIO_Pin=GPIO_Pin_12;
	gpio_init.GPIO_Speed=GPIO_Speed_50MHz;
	gpio_init.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &gpio_init);
	
	gpio_init.GPIO_Pin=GPIO_Pin_11;
	gpio_init.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &gpio_init);
	
	// init can controller
	CAN_DeInit(CAN1);
	CAN_InitTypeDef can1;
	CAN_StructInit(&can1);
	
	can1.CAN_Mode=CAN_Mode_Normal; // what is init mode??
	
	// 1mbit bitrate timings...
	can1.CAN_Prescaler=2;
	can1.CAN_SJW=CAN_SJW_1tq;
	can1.CAN_BS1=CAN_BS1_15tq;
	can1.CAN_BS2=CAN_BS2_2tq;

	can1.CAN_TTCM=DISABLE;
	can1.CAN_ABOM=DISABLE;
	can1.CAN_AWUM=DISABLE;
	can1.CAN_NART=DISABLE;
	can1.CAN_RFLM=DISABLE;
	can1.CAN_TXFP=DISABLE;
	
	if(CAN_Init(CAN1, &can1)!=CAN_InitStatus_Success) 
		debug_halt_error();
	
	//
	// init can filters
	//
	CAN_FilterInitTypeDef filter1;
	
	// this filter receives everything
	filter1.CAN_FilterNumber=0;
	filter1.CAN_FilterMode=CAN_FilterMode_IdMask;
	filter1.CAN_FilterScale=CAN_FilterScale_32bit;
	filter1.CAN_FilterIdHigh=0;
	filter1.CAN_FilterIdLow=0;
	filter1.CAN_FilterMaskIdHigh=0;
	filter1.CAN_FilterMaskIdLow=0;
	filter1.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
	filter1.CAN_FilterActivation=ENABLE;
	CAN_FilterInit(&filter1);

	CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
	CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);
	
	// enable CAN1 interrupts
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitTypeDef nvic_init;
	
	// enable CAN1 RX Interrupt
	nvic_init.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;
	nvic_init.NVIC_IRQChannelPreemptionPriority=0;
	nvic_init.NVIC_IRQChannelSubPriority=0;
	nvic_init.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&nvic_init);
	
	// enable CAN1 TX Interrupt
	nvic_init.NVIC_IRQChannel=USB_HP_CAN1_TX_IRQn;
	nvic_init.NVIC_IRQChannelPreemptionPriority=0;
	nvic_init.NVIC_IRQChannelSubPriority=0;
	nvic_init.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&nvic_init);
Benutzeravatar
Chefbastler
Beiträge: 2665
Registriert: Mo 12. Aug 2013, 20:21
Wohnort: Südbayern

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Chefbastler »

Hab hier Atollic TrueStudio. Debugger läuft über SWD. Läuft etwas arg langsam hier auf dem Rechner.

Mit dem CubeMX war eigentlich die hoffung die Hardware Config einfach und schnell erledigen zu können. :oops:

Wie gesagt Senden klappt, nur beim Empfang wird zwar auf dem Bus das "Ich habe richtig verstanden" ACK Bit zurückgesendet aber der Interrupt nicht ausgelöst. Hardware dürfte daher auch in Ordnung sein.

Im Loopback Modus müsste ich ja die selbst gesendeten Telegramme ja den RX Interrupt auslösen.
Wenn ich den RX-Filter Disable sollte ja eigentlich alles durchkommen würde ich meinen.

Ich hatte auch schon eine Pin-Togglefunktion in den CAN IRQ Handler gepakt um zu schauen ob sich da was tut.
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Fritzler »

Wenn du den HAL nutzen willst, dann musst du die Hardware _UND_ den HAL verstehen :P
Insofern der Debugger läuft eben ein Databreakpoint auf das passende CAN Register werfen und gucken wie das CAN Telegram durch die Statusregister wandert.

Vom F100 müsst ich mal ins DB gucken wenn ich mehr Zeit hab inwiefern der CAN da abgespeckt ist, aber bei den F200 und aufwärts muss das CAN Telegramm ja noch in die richtige FIFO/Messagebox geleitet werden.
Benutzeravatar
Chefbastler
Beiträge: 2665
Registriert: Mo 12. Aug 2013, 20:21
Wohnort: Südbayern

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Chefbastler »

In die Register CAN_RDL0R und CAN_RDH0R kommt das Empfangene Telegramm mit richtigen Dateninhalt an.

Ja der hatt zwei FIFOs wo er je drei Telegramme puffern kann.
Benutzeravatar
Nicki
Beiträge: 3127
Registriert: So 11. Aug 2013, 20:16
Wohnort: wo Mosel und Rhein sich treffen

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Nicki »

Den Konfigurator braucht man doch fast gar nicht.
Ich habe mir irgendwann mal ein Peripheral Example umgestrickt und programmiere davon ausgehend fast jedes Projekt.
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Fritzler »

Ich glaub der IRQ ist garnicht aktiviert.
Jedenfalls sehe ich (mal wieder :lol: ) was nicht in dem Code.
Dem NVIC wird gesagt, dass er den CAN RX annehmen soll, aber beim CAN scheint das Register nicht richtig gesetzt zu sein.

Guck mal ob im Register CAN_IER das Bit "Bit 1 FMPIE0: FIFO 0 message pending interrupt enable" gesetzt ist.

Zudem wird beim NVIC "CAN1_RX1_IRQn" aktiviert, dein Telegram landet aber in FIFO0.
Das ist ein anderer IRQ Vektor! -> USB_LP_CAN1_RX0_IRQn
Den darfst du dir noch anlegen oder du biegst es so um, dass die RX Pakete in FIFO1 landen.
Also guck im CAN_IER auch ob das "FMPIE1" Bit gesetzt ist.
Nicki hat geschrieben:Den Konfigurator braucht man doch fast gar nicht.
Seh ich auch so, man lässt sich einmal die PLL, den Clocktree durchrechnen und tippt das dann selber ein.
Zudem lässt man sich die IOs legen, wenn man das nach der Monstertabelle im Datenblatt macht muss man danach in die Klappse :lol:
Wobei ich dann wieder zu den schlimmen Fingern gehöre, die sich die STM32 Treiber selber schreiben ohne HAL oder CMSIS Quark :twisted:
Benutzeravatar
Chefbastler
Beiträge: 2665
Registriert: Mo 12. Aug 2013, 20:21
Wohnort: Südbayern

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Chefbastler »

Besagtes FMPIE0 Bit ist Null. Der Rest in CAN_IER auch.
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Fritzler »

Dann wird da auch nie ein IRQ kommen wenn die nicht aktiviert sind.

Da kann ich dir jetzt aber nicht mehr helfen wie man über den gammligen HAL dieses Bit setzt.
Aber google wird da sicher wissen welcher Member im Initstruct gesetzt werden muss.
i_h
Beiträge: 101
Registriert: Sa 7. Sep 2013, 11:04

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von i_h »

Steht in dem Codeschnipsel drinnen:

Code: Alles auswählen

  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
   CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);
  
Auch wenn die HAL in C geschrieben ist, die rohen Bitwerte will ich nicht mehr verwenden müssen.
E_Tobi
Beiträge: 640
Registriert: Mo 12. Aug 2013, 22:26

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von E_Tobi »

i_h hat geschrieben: Auch wenn die HAL in C geschrieben ist, die rohen Bitwerte will ich nicht mehr verwenden müssen.
Wie unterschiedlich die Vorlieben beim programmieren sind... :lol:
Benutzeravatar
Chefbastler
Beiträge: 2665
Registriert: Mo 12. Aug 2013, 20:21
Wohnort: Südbayern

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Chefbastler »

Erste Erfolgsvermeldung.

Interrupt ist jetzt wohl aktiv. Aber der Prozessor hängt sich jetzt bei Empfang auf.

Edit: Kommt anscheinend bei "Infinite_Loop" raus..
Zuletzt geändert von Chefbastler am Do 21. Jun 2018, 21:02, insgesamt 1-mal geändert.
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Fritzler »

Dann les nochmal mein Beitrag.
Da war was mit falscher FIFO und falschem IRQ.

Also erzähl mal genau wasse jetz gemacht hast, alles aus der Nase ziehen is nervig.
Benutzeravatar
Chefbastler
Beiträge: 2665
Registriert: Mo 12. Aug 2013, 20:21
Wohnort: Südbayern

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Chefbastler »

Ich hab jetzt alles auf FIFO0 geschrieben.

HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);

__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);

FMPIE0 ist jetzt auf 1
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Fritzler »

Für USB_LP_CAN1_RX0 haste doch sicher noch keinen IRQ Handler geschrieben, der den IRQ auch handled.
Dann landeste ind er default loop mit der µC nicht irgendwas macht.

siehe stm32f1xx_it.c
Den Namen siehste in startup_stm32f103xb.s
Benutzeravatar
Chefbastler
Beiträge: 2665
Registriert: Mo 12. Aug 2013, 20:21
Wohnort: Südbayern

Re: STM32 CAN Probleme mit Empfängnis

Beitrag von Chefbastler »

Fritzler hat geschrieben:Für USB_LP_CAN1_RX0 haste doch sicher noch keinen IRQ Handler geschrieben, der den IRQ auch handled.
Dann landeste ind er default loop mit der µC nicht irgendwas macht.
Klingt logisch. :oops:

War der hoffnung das dass Ding von der HAL gestartet wird in stm32fxx_it.c:
Da fehlt wohl noch was.

void CAN1_RX1_IRQHandler(void)
{
/* USER CODE BEGIN CAN1_RX1_IRQn 0 */
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
/* USER CODE END CAN1_RX1_IRQn 0 */
HAL_CAN_IRQHandler(&hcan);
/* USER CODE BEGIN CAN1_RX1_IRQn 1 */

/* USER CODE END CAN1_RX1_IRQn 1 */
}

Edit: Ich doofi habs. Hab da was vergessen auf FIFO0 umzuschreiben. :oops: :lol:

Es läuft. Danke für die Hilfe. :D
Antworten