32f103 canbus rx interrupt üretmiyor

Başlatan izturk, 25 Nisan 2018, 12:44:52

izturk

STM32F103VCT6 ile can bus çalıştırmaya uğraşıyorum.
HAL kütüphanesi fonksiyonları ile bir türlü çalıştıramadım.
Bulduğum örnek bir kod ile veri alıp vermeyi çalıştırdım.

Projeyi cubemx ile oluşturdum. interrupt ı açtım. cube mx can bus ı şu şekilde init etti.
static void MX_CAN_Init(void)
{

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

}

filtre ayarları şu şekilde
CAN1->sTxMailBox[0].TIR 0;
CAN1->sTxMailBox[0].TIR 0x245<<21;
CAN1->sTxMailBox[0].TDHR 0;
CAN1->sTxMailBox[0].TDTR 1;

CAN1->FMR |= 1<<0;
CAN1->FMR |= 13<<8;
CAN1->FS1R |= 1<<13;
CAN1->sFilterRegister[13].FR1 0x245<<21;
CAN1->FM1R |= 1<<13;
CAN1->FA1R |= 1<<13;
CAN1->FMR &= ~(1<<0);

alma ve gönderme fonksiyonları
void CAN1_Tx(uint8_t data)
{
 
CAN1->sTxMailBox[0].TDLR data;
 
CAN1->sTxMailBox[0].TIR |= 1;
}

uint8_t CAN1_Rx(void)
{
 while(!(
CAN1->RF0R&3));
 
uint8_t RxD = (CAN1->sFIFOMailBox[0].RDLR)&0xFF;
 
CAN1->RF0R |= 1<<5;
 return 
RxD;
 
}

while döngüsü içerisinde aşağıdaki şekilde veri alıp gönderebiliyorum.

 tus_oku();
 if(
enter==1)
 {
 
i++;
 while(
enter==1){tus_oku();}
 
CAN1_Tx(i);
 
rx_data=CAN1_Rx();

 
 }

veri alma işini interruptla yapmak istiyorum. ancak veri geldiğinde interrupt rutininine hiç girmiyor.
Neresi eksik acaba?

e-zeki

hocam Cube Mx'den oluşturduğun projede receive interrupt'ı bir kere çağırman gerekiyor. Örnek
HAL_CAN_Receive_IT(&hcan1,CAN_FIFO0);
ardından stm32_hal_can.h header'ından callback fonksiyonunu main.c dosyasında aşağıdaki gibi tanımlarsan oradan kesmeye gidebilirsin.
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDefCanHandle
{
HAL_CAN_Receive_IT(&hcan1,CAN_FIFO0);
}

Not: bende çok bilmiyorum fakat 2 hafta önce bu şekilde çalıştırmıştım

desert

Kodlar içerisinde kesmeyi aktif ettiğin kısım yok sanırım

izturk

Kesmeyi ayrıya aktif etmedim. Sadece cubemx den CAN Rx1 interrupt ı seçtim.

görkem

NVIC global kesmeyi aktif etmeniz lazım ve  main de tanımlanması gereken rx kesmesini enable yapan kod gerekli onuda can kütüphanesinde bulabilirsiniz yanlış hatırlamıyorsam

izturk

static void MX_NVIC_Init(void)
{
  
/* CAN1_RX1_IRQn interrupt configuration */
  
HAL_NVIC_SetPriority(CAN1_RX1_IRQn00);
  
HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
}

Kesmeyi aktif eden fonksiyonlar bunlar değil mi hocam.
Diğer kesmelerim çalışıyor.

stm32f1xx_it.c içindeki kesme fonksiyonum da bu ama bunun içine hiçbir zaman girmiyor.
void CAN1_RX1_IRQHandler(void)
{
  
/* USER CODE BEGIN CAN1_RX1_IRQn 0 */

  /* USER CODE END CAN1_RX1_IRQn 0 */
  
HAL_CAN_IRQHandler(&hcan);
  
/* USER CODE BEGIN CAN1_RX1_IRQn 1 */
	
HAL_CAN_Receive_IT(&hcan,CAN_FIFO0);
	
	
while(
1)
{
HAL_GPIO_WritePin(cpu_led_GPIO_Port,cpu_led_Pin,GPIO_PIN_SET);
}
//
	
sprintf(gosterilecek,"%d",hcan.pRxMsg->Data[0]);
	

	

  
/* USER CODE END CAN1_RX1_IRQn 1 */
}

izturk

Problemi buldum.

Cube Mx de projeyi oluştururken
CAN RX1 Interrupt ı seçiyordum.
Usb low priority or RX0 Interrupt ı seçince direkt kesme çalıştı.

İlgilenen arkadaşlara çok teşekkür ederim.

bayram göktepe

Selam

Bende stm32f103c8t6 ile can haberleşmesi gerçekleştirmek istiyorum.
Bir türlü başaramadım. stm32cubex ve keil mdk arm programlarını kullanıyorum.
Yardımcı olursanız sevinirim.

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.