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++;
}
}
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.
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.
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?
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
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.
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ı
Sanıyorum ki şurada takılıyor çünkü led koyup denedim. while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK))
@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?
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.
@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?
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.
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.
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;
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.
Alıntı yapılan: cripple - 29 Haziran 2019, 21:06:54Açı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.
İlginç bir şekilde, delay eklememle düzeldi. Yardımlarınız için teşekkürler
@robikod "Delay" komutunu nereye eklediğinizi de belirtir misiniz?
Böylece sorunun çözümü; ya da sorunun kaynağının bulunması için aynı problemi yaşayan(yaşayacak olan) insanlara yardımcı olmuş olursunuz.
Aralıksız transmit yapıldığı için muhtemelen mesajlar biribirini ezip hiçbirşey gönderemiyordu. Transmit yaptıktan sonra biraz bekleme ekleyince düzelmiştir diye düşünüyorum.
Bekletmeyi döngü içerisine ekledim
while ((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK))
{
GPIO_SetBits(GPIOE, GPIO_Pin_9);
Delay(1000);
}