STM32F103 CANBUS çalıştıramadım

Başlatan magnetron, 24 Şubat 2017, 18:37:43

magnetron

merhaba forum,

aşağıdaki kodu std peripheral library'den kopyaladım ama çalışmadı
( loopback yaparken HW pinleri birbirine bağlamam mı gerekir ? library 'deki örnekte yapmamış )
ne yanlış yapıyorum ?
teşekkür

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

CAN_Initialize(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
//  CanTxMsg TxMessage;

  /* CAN register init */
  CAN_DeInit(CAN1);
  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=DISABLE;
  CAN_InitStructure.CAN_AWUM=DISABLE;
  CAN_InitStructure.CAN_NART=DISABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=DISABLE;
  CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=1;
  CAN_Init(CAN1, &CAN_InitStructure);

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=1;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);

  /* CAN FIFO0 message pending interrupt enable */ 
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

  return ;
}

void CAN_TXmit(void){

//bunu saniyede 10 kere çağırıyorum

  CanTxMsg TxMessage;
/* transmit 1 message */
  TxMessage.StdId=0x00;
  TxMessage.ExtId=0x1234;
  TxMessage.IDE=CAN_ID_EXT;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=2;
  TxMessage.Data[0]=0xDE;
  TxMessage.Data[1]=0xCA;
  CAN_Transmit(CAN1, &TxMessage);

}

void USB_LP_CAN1_RX0_IRQHandler(void)
{
    i++; // bu değişken hiç artmıyor yani interupta girmiyor
  CanRxMsg RxMessage;

  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

}

memo333

120 ohmlar takılı mı?
skopla hatta bakma imkanınız var mı?
Gömülü Linux Notları --> http://linuxedu.xyz/

M_B

Alıntı yapılan: memo333 - 24 Şubat 2017, 22:26:27
120 ohmlar takılı mı?
skopla hatta bakma imkanınız var mı?
Hocam arabirim entegresi kullanmıyorsa 120 gerek yok. cunku CanRx ile CanTx birleştirdimi olması lazım. Aynı usart taki Tx ile Rx birleştirmesi gibi.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

magnetron

hocam loopback modunda çalıştırıyorum

peripheral library örneğinde HW pinleri ne initialize etmiş ne de birbirine bağlayın demiş

acaba örnekte unutmuş mu ? yoksa loopback yapınca herşey işlemci içinde olup bitiyor mu ?

M_B

Alıntı yapılan: magnetron - 24 Şubat 2017, 22:54:04
hocam loopback modunda çalıştırıyorum

peripheral library örneğinde HW pinleri ne initialize etmiş ne de birbirine bağlayın demiş

acaba örnekte unutmuş mu ? yoksa loopback yapınca herşey işlemci içinde olup bitiyor mu ?

O konuda bilgi sahibi degilim ama dediginiz gibi de olabilir.
Elinizde bir tane daha modul varsa iki tane mcp2551 entegre alıp baglayıp test edebilirsiniz.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

baran123

Siz pinleri AF modda init edin. Daha sonrada RX-TX baglayip direnc takmadan deneyin cunku o direnc Bus yani fiziksel Can hattinin sonlandirma direnci TX-RX ile alakasi yok.

memo333

Alıntı yapılan: M_B - 24 Şubat 2017, 22:49:11
Hocam arabirim entegresi kullanmıyorsa 120 gerek yok. cunku CanRx ile CanTx birleştirdimi olması lazım. Aynı usart taki Tx ile Rx birleştirmesi gibi.

yorgunluktan kafa uçmuş.. ben arazi olayım en iyisi :)
Gömülü Linux Notları --> http://linuxedu.xyz/

magnetron

#7
Alıntı yapılan: baran123 - 24 Şubat 2017, 23:02:53
Siz pinleri AF modda init edin. Daha sonrada RX-TX baglayip direnc takmadan deneyin cunku o direnc Bus yani fiziksel Can hattinin sonlandirma direnci TX-RX ile alakasi yok.

@baran123 hocam normal moda aldım pinleri de init ettim
ama TX pininde hareket yok ( osiloskopta )
bir de CAN_Init fonksiyonu 0 döndürüyor

#define CANINITFAILED              ((uint8_t)0x00)

herşeyi libraryden kopyalıyorum neden çalışmıyor anlamıyorum

pinleri birbirine bağlayım bir de / yok bağlayınca da TX hep 3.3V

baran123

Şu bağlantıyı inceleyiniz fakat dikkat edin burada 107 ye göre yapmış.
http://stackoverflow.com/questions/6195033/stm32f103-microcontroller-can-messages

Ben CANBus'ı PIC ile yaptım önce Config moda sokup daha sonrada ayarları tamamlayınca normal moda alıp çalışma yapıyorduk. STM de sanırım farklı. Şu sıralar bitirme projem için stm32f103c8t6 da CanBus yapıcam bir gelişme olursa haberdar ediniz :)


magnetron

yanlışı buldum

libraryden STM32f10x_can.c dosyasını projeye eklememişim
diyceksiniz ki bu kadar amatör yanlış yapılır mı ?

şöyle oldu ben RIDE7 ile GCC kullanıyorum
yukardaki dosyayı eklemeden hata vermeden derledi
ben o yüzden yanıldım
herhalde RIDE7 firmware'in eski versiyonu kendisi bulup include etmişti

neyse şimdi derdim başka
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); ile receive interruptı enable ediyorum

bu sefer mesaj gelince aşağıki interrupta giriyor ama çıkamıyor
diye düşünüyorum çünkü işlemci tam açılırken watchdog reset atıyor
neden çünkü interrupt flagi temizlemedik
yalnız ara ara aşağıdaki ?????????? olan yerlere ne yazıcam bulamadım
bilen varsa teşekkür ederim
===========================================
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CAN_ClearFlag(CAN1, ??????????);
CAN_ClearITPendingBit(CAN1,??????????????);

  CanRxMsg RxMessage;

  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

muhittin_kaplan

#11
(konuyla alakasi yok, hatanin acemisi olmaz. Usb ile calisiyor ornek yapiyorum malum. 2 saat  önce calisan program calismiyor deli oluyorum, python olmadi usblib olmadi firmware derken o iki saatin sonunda usb yi takmadigimi goruyorum. )

baran123

İncelediğim örnek kodlarda kesme içinde kesme bayrağı temizlenmemiş. Şu şekilde bir dene
void USB_LP_CAN1_RX0_IRQHandler(void)
{
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); // veriyi oku
  // vs vs vs
 
}