CANBUS TX pininden sinyali düzgün görünteleyemiyorum

Başlatan robikod, 27 Haziran 2019, 17:33:30

robikod

Merhaba, STM32f3 ile ilk defa CANBUS deneme yaptım ancak TX pininden herhangi bir anlamlı sinyal alamıyorum sadece low durumdan high duruma geçiyor onun dışında hiçbir CAN frame yapısına ait veri göremiyorum. Kodlarım aşağıdaki şekilde. Hata nerede olabilir?

RX->PD0 pini
TX->PD1 pini


#include <stm32f30x.h>
#include <stm32f30x_i2c.h>
#include <stm32f30x_rcc.h>
#include <stm32f30x_syscfg.h>
#include <stm32f30x_exti.h>
// #include <stm32f30x_misc.h>
#include "main.h"
#include <stdio.h>
#include "common.h"
#include "io_periph_defs.h"
#include "stm32f30x.h"
#include <stdio.h>
#include "conf.h"

GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CanTxMsg TxMessage;
CanRxMsg RxMessage;

void Init_TxMes(CanTxMsg *TxMessage)
{

    /* Transmit INITIALIZATION*/

    TxMessage->IDE = CAN_ID_STD;

    TxMessage->DLC = 2;

    TxMessage->StdId = 0x321;

    TxMessage->RTR = CAN_RTR_DATA;
}

void Init_RxMes(CanRxMsg *RxMessage)

{

    uint8_t i = 0;

    RxMessage->StdId = 0;

    RxMessage->IDE = CAN_ID_STD;

    RxMessage->DLC = 0;

    RxMessage->FMI = 0;

    for (i = 0; i < 8; i++)

    {

        RxMessage->Data[i] = 0;
    }
}

void CAN_setup(void)

{

    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); //Enable the clock for CAN

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);

    /* Configure CAN1 RX pin */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    /* Configure CAN1 TX pin */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_9);

    GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_9);
    /* Enable the CAN global Interrupt */

    NVIC_InitStructure.NVIC_IRQChannel = CAN1_SCE_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;

    NVIC_Init(&NVIC_InitStructure);

    CAN_DeInit(CAN1);

    /* Configure CAN1 **************************************************/

    /* Struct init*/

    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 Baudrate = 1MBps (CAN clocked at 36 MHz) */
    CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
    CAN_InitStructure.CAN_Prescaler = 6;
    CAN_Init(CAN1, &CAN_InitStructure);

    /* CAN filter init */
    CAN_FilterInitStructure.CAN_FilterNumber = 0;
    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 = 0;

    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);

    CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}
int main(void)
{

    int i;

    uint8_t TransmitMailbox = 0;

    CAN_setup(); // setup CAN interface

    Init_TxMes(&TxMessage);
    init_pin(GPIOA, GPIO_Pin_8, GPIO_Mode_OUT, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_UP);

    while (1)
    {

        TxMessage.Data[0] = 0xAA;
        GPIO_SetBits(GPIOA, GPIO_Pin_8); //TRansmit data

        TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);

        i = 0;
        while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK))
            ;                              // I put a breakpoint here to check and found the message is pending
        GPIO_ResetBits(GPIOA, GPIO_Pin_8); //TRansmit data
                                           // i++;
    }
}

cripple

CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;

Canbus loopback mod da ayarlamışsınız.

CAN_Mode_Normal olarak ayarlamanız gerekiyor. Loopback modda sadece kendi içinde tx rx yapar.

robikod

Alıntı yapılan: cripple - 27 Haziran 2019, 17:37:33CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;

Canbus loopback mod da ayarlamışsınız.

CAN_Mode_Normal olarak ayarlamanız gerekiyor. Loopback modda sadece kendi içinde tx rx yapar.

Cevabınız için teşekkürler ancak o şekilde denediğimde de değişen bir şey olmuyor.

    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;


Zaten başka bir cihazla konuşmuyorum sadece pinlerden TX yaptığımı görmek istyorum. Ancak hiçbir şekilde sinyal göremedim.

cripple

while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK)) bu satırın

alt satıra bunuda eklermisiniz

while((CAN_MessagePending(CANx, CAN_FIFO0) < 1)

ve while biraz bekleme ekleyin şimdilik daha rahat görebilmek için
ve Canbus tx pininde nasıl bir ölçüm yaptığınızdan bahseder misiniz?

robikod

Alıntı yapılan: cripple - 27 Haziran 2019, 17:59:42while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK)) bu satırın

alt satıra bunuda eklermisiniz

while((CAN_MessagePending(CANx, CAN_FIFO0) < 1)

ve while biraz bekleme ekleyin şimdilik daha rahat görebilmek için
ve Canbus tx pininde nasıl bir ölçüm yaptığınızdan bahseder misiniz?

O şekilde yine denedim olmadı. Osiloskop ekranında sadece düz bir çizgi görüyorum. Sadece STM32 kullanıyorum ve pinlerinden sinyal almaya çalışıyorum

Tagli

CAN ile uygulama deneyimim olmadığı için emin değilim, ama işlemci bir yandan da RX pininden hattı okuyor olabilir. TX'ten bastığı veriyi RX'te görmezse, hat üstünlüğünü kaybettiğini düşünüp geri çekiliyor olabilir. Ben olsam TX ve RX'i birbirine bağlayıp denerdim.
Gökçe Tağlıoğlu

robikod

Alıntı yapılan: Tagli - 28 Haziran 2019, 09:48:00CAN ile uygulama deneyimim olmadığı için emin değilim, ama işlemci bir yandan da RX pininden hattı okuyor olabilir. TX'ten bastığı veriyi RX'te görmezse, hat üstünlüğünü kaybettiğini düşünüp geri çekiliyor olabilir. Ben olsam TX ve RX'i birbirine bağlayıp denerdim.

Denedim hatta Rx ve Tx hatları arasına 120ohm koyarak da denedim yine olmadı

robikod

Sanıyorum ki şurada takılıyor çünkü led koyup denedim.         while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK))

dumansiz

@robikod
Ölçmeyi yaptığınız şeklin fotoğrafını paylaşır mısınız?
Can Transceiver kullanıyor musunuz?
120 ohm direnci, "Can transceiver" ın CanH ile CanL bacakları arasına bağlamanız gerekli.
Ölçümü işlemcinin bacaklarından yapmaktansa, transceiver'ın bacaklarından yapmanızı tavsiye ederim.
1Mbit baudrate ile iletişim kurmanız şart mı? Başlangıçta daha düşük baudrateler denenebilir.
Ölçüm yaptığınız osilaskopun "Volt/div" ve "sec/div" ini nasıl ayarladınız?

robikod

Alıntı yapılan: dumansiz - 28 Haziran 2019, 11:55:51@robikod
Ölçmeyi yaptığınız şeklin fotoğrafını paylaşır mısınız?
Can Transceiver kullanıyor musunuz?
120 ohm direnci, "Can transceiver" ın CanH ile CanL bacakları arasına bağlamanız gerekli.
Ölçümü işlemcinin bacaklarından yapmaktansa, transceiver'ın bacaklarından yapmanızı tavsiye ederim.
1Mbit baudrate ile iletişim kurmanız şart mı? Başlangıçta daha düşük baudrateler denenebilir.
Ölçüm yaptığınız osilaskopun "Volt/div" ve "sec/div" ini nasıl ayarladınız?


USB to CAN kullanıyorum sizin dediğinz transviver mi bilmiyorum ama onun CANH ve CANL bacakları arasına bağladım.
İletişim için hız şartım yok sadece veri görsem yeterli
STM32 (USB to CAN) bunlar dışında bir şey kullanmıyorum.

dumansiz

@robikod
USB to CAN nedir?
Bilgisayara mı takılıyor?
Sistemde kullandığınız tüm malzemelerin fotosunu atarsanız, daha fazla yardımcı olabiliriz?

cripple

USB to CAN de data görebilmeniz için can tranciever olması gerekiyor  MCP2551 kullanabilirsiniz
CANTX CANRX pinleri can tranciever a bağlanacak bunun çıkışında da CANH CANL a dönüştürüyor.

Eğer hatta başka bir canbus cihazı yoksa data göndermez. Bu durumda kodun takılmaması için canbus loopback moda alınır ve hatta herhangi bir şey basmaya çalışılmaz.(baştan direkt söylemememin sebebi biraz düşündükten sonra hatırladım)

TX den hiçbir data görememenizin sebebi canbus ın fiziksel hattaki davranışı, hattın lojik seviyesinden dolayı data göndermek için hattı ele geçiremiyor.
 
while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK))
kısmında takılmasının sebebi hatta hiçbir zaman data basamıyor oluşu.

Yazdığınız kodun herhangi bir yerinde sorun görünmüyor,
stm32 nin çıkışına can tranciever bağlayarak USB to CAN ile çalıştıracağınızı düşünüyorum.

robikod

Alıntı yapılan: cripple - 28 Haziran 2019, 17:25:12USB to CAN de data görebilmeniz için can tranciever olması gerekiyor  MCP2551 kullanabilirsiniz
CANTX CANRX pinleri can tranciever a bağlanacak bunun çıkışında da CANH CANL a dönüştürüyor.

Eğer hatta başka bir canbus cihazı yoksa data göndermez. Bu durumda kodun takılmaması için canbus loopback moda alınır ve hatta herhangi bir şey basmaya çalışılmaz.(baştan direkt söylemememin sebebi biraz düşündükten sonra hatırladım)

TX den hiçbir data görememenizin sebebi canbus ın fiziksel hattaki davranışı, hattın lojik seviyesinden dolayı data göndermek için hattı ele geçiremiyor.
 
while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK))
kısmında takılmasının sebebi hatta hiçbir zaman data basamıyor oluşu.

Yazdığınız kodun herhangi bir yerinde sorun görünmüyor,
stm32 nin çıkışına can tranciever bağlayarak USB to CAN ile çalıştıracağınızı düşünüyorum.

çok teşekkürler deneyeceğim bu şekilde.

robikod

Alıntı yapılan: cripple - 28 Haziran 2019, 17:25:12USB to CAN de data görebilmeniz için can tranciever olması gerekiyor  MCP2551 kullanabilirsiniz
CANTX CANRX pinleri can tranciever a bağlanacak bunun çıkışında da CANH CANL a dönüştürüyor.

Eğer hatta başka bir canbus cihazı yoksa data göndermez. Bu durumda kodun takılmaması için canbus loopback moda alınır ve hatta herhangi bir şey basmaya çalışılmaz.(baştan direkt söylemememin sebebi biraz düşündükten sonra hatırladım)

TX den hiçbir data görememenizin sebebi canbus ın fiziksel hattaki davranışı, hattın lojik seviyesinden dolayı data göndermek için hattı ele geçiremiyor.
 
while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK))
kısmında takılmasının sebebi hatta hiçbir zaman data basamıyor oluşu.

Yazdığınız kodun herhangi bir yerinde sorun görünmüyor,
stm32 nin çıkışına can tranciever bağlayarak USB to CAN ile çalıştıracağınızı düşünüyorum.

Merhaba transviever ekledim, bu kez şu şekilde bir hata var Normal modda çalışırken


        while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK))

döngüsünde, status kontrolü için CAN_TransmitStatus fonksiyonuna gidiyor. Burada state aşağıdaki gibi dönüyor dolayısı ile whle içerisi sürekli 0 oluyor. Bunun sebebi ne olabilir şimdi ? Loopbackte sorun olmuyor. Normal modda bu şekilde

 case (0x0): state = CAN_TxStatus_Pending;
      break;

cripple

Açıkçası belirgin bir hata yok

CanTxMsg TxMessage;
void Init_TxMes(CanTxMsg *TxMessage)

bu kısımda global buffer ile structure pointer ın ismi aynı derleyici hatalı bir yorumlama yapabilir. Yani günün sonunda canbus tan boş(id si ve datası olmayan) bir mesaj göndermeye çalışıyor olabilir.

Bunlardan birinin adını değiştirip bir denermisiniz.