Stm32 Can Bus Hakkında Bir Kaç Soru

Başlatan izturk, 30 Nisan 2018, 10:17:12

izturk

Merhaba arkadaşlar,

stm32f1 ile can bus haberleşmesi kurmaya çalışıyorum.
ayarlamaları yapıp filtreleri ayarlayıp iyi kötü can bus haberleşmesini sağladım. değişik alıcılardan veri alıp gönderebiliyorum.

soru1. stm32f1 de 3 adet tx mailbox var. Bunların id lerini başta ayarlıyoruz. program içerisinde bu id leri yeniden kurmadıkça 3 farklı id de mesaj gönderebiliriz mi demek. 4. farklı id de mesaj göndereceğimiz zaman bu mailboxların ayarlarını mı değiştirmek gerekli yoksa başka bir yöntemi var mı?

soru2. mesaj karşıdan alındı bilgisini CAN_ESR(error status register) registerinin LEC (last error code) bitinden takip ediyorum. bu doğru bir yöntemmidir?

soru3. belli bir id deki mesajı birden farklı alıcı alacak. diyelim ki mesajı bir alıcı aldı ama diğer alıcı alamadı. böyle bir durumda CAN_ESR de hata oluşur mu oluşmaz mı? Bunu ayırt etmenin yolu nedir?

foseydon

STM'de CAN kullanmadım. fakat CAN Frame'i içerisinde ID frame'i var burada ID değerini değiştirerek istediğin cihaza mesaj gönderebilirsin yani kısıtlama yok. O başta verdiğim 3 ID ise cihazın kendisine ait, yani gelen mesajları filtreleyip kendisine gelip gelmediğini kontrol edebilsin diye.

işleyiş yapısını bilmiyorum, ama error'den takip etmek bana hatalı geliyor. ben dsPIC ile kullanmıştım ve TX ve RX için kesme vardı, muhtemelen sende de benzer bir yapı vardır. Başta atadığın ID'leri filtreliyor ve kendisine geldiyse kesme oluşturuyordu.

ID'ler tek, yani mesajı alamayan cihaz senin cevap almak istediğin cihaz ise geriye mesaj dönmez. buradan iletişimde sorun olduğunu anlayıp tekrar sorgu yapabilirsin.

izturk

3. sorumu denedim ve aynı id li mesajı alıcının birisi alıp diğeri almadığında hata oluşmuyor.her alıcıdan da tek tek geri cevap almak işime gelmiyor. bunun başka bir yolu yokmudur.

bir de id dışında id mask var. bu maskelemenin amacı nedir. zaten id ile hangi alıcının veriyi alacağını belirledik. yeniden maska ne ihtiyaç var. benim problemimin çözümü bu maskın kullanımı olabilir mi acaba?

foseydon

Alıntı yapılan: izturk - 02 Mayıs 2018, 12:42:593. sorumu denedim ve aynı id li mesajı alıcının birisi alıp diğeri almadığında hata oluşmuyor.her alıcıdan da tek tek geri cevap almak işime gelmiyor. bunun başka bir yolu yokmudur.

bir de id dışında id mask var. bu maskelemenin amacı nedir. zaten id ile hangi alıcının veriyi alacağını belirledik. yeniden maska ne ihtiyaç var. benim problemimin çözümü bu maskın kullanımı olabilir mi acaba?

hocam ID ve mask gelen mesajı filtrelemek için kullanılıyor. Misal, bunları cihazın kendi ID'sine denk gelecek şekilde ayarlarsan, bu ID dışındaki mesajları görmezden gelir.Bunları kullanarak cihaz gruplandırması yaparak, kendi olduğu gruba gönderilen mesajları dikkate almasını da sağlayabilirsin. Bu işine yarayabilir. Kullanım detayını için texas'ın CANBUS dökümanı var, tavsiye ederim. aramaya üşendiğimden linki eklemedim :)

Tagli

Bilmiyorum pek yeri olmayabilir belki ama birkaç soru da ben sorayım:

Genelde CAN bus'ı ham olarak mı kullanıyorsunuz yoksa CANopen veya DeviceNet gibi bir üst katman ile mi kullanıyorsunuz? Eğer tercihiniz ikinci yöntem ise, yaygın olarak kullanılan bir kütüphane falan var mıdır STM32 için?

Bir de merak ediyorum, CAN bus'ı genelde ne tür sistemlerde kullanıyorsunuz?
Gökçe Tağlıoğlu

Ax2_Bx_C

Gürültünün bol olduğu yapılarda kullanılması önerilir. Genel olarak jeneratör sistemlerinde, kritik haberleşme gereken güç konularında hep can kullanılır. Can'in güzel yanı hem master hem slave yapıda olabilmesidir. Bu da Modbus gibi yapılara karşı onu öne çıkarır. İyi bir fiziksel layer kurarsanızda hata dönüşünüz çok az olur. Ayrıca filtrelemeler vb. sayesinde software'e çok az iş düşer. UPS ve kaynak makineleri gibi gürültülü ortamlarda sıkça kullanılır.
Ben Yalnızca Bir Matematik Fonksiyonuyum

Cemre.

Alıntı yapılan: Tagli - 03 Mayıs 2018, 13:15:39Bilmiyorum pek yeri olmayabilir belki ama birkaç soru da ben sorayım:

Genelde CAN bus'ı ham olarak mı kullanıyorsunuz yoksa CANopen veya DeviceNet gibi bir üst katman ile mi kullanıyorsunuz? Eğer tercihiniz ikinci yöntem ise, yaygın olarak kullanılan bir kütüphane falan var mıdır STM32 için?

Bir de merak ediyorum, CAN bus'ı genelde ne tür sistemlerde kullanıyorsunuz?
CANopen ve EtherCat hareket kontrol sistemlerinde (servo sistemler) sıklıkla kullanılıyor.

izturk

Hocalarım ben hala aynı konularda cebelleşiyorum. Bazı şeyler hala aklımda tam netleşmedi.
Şimdi ilk sorumu biraz daha açarak tekrar sorayım.

CAN1->sTxMailBox[0].TIR = 0;
CAN1->sTxMailBox[0].TIR = 0x100<<21;
CAN1->sTxMailBox[0].TDHR = 0;
CAN1->sTxMailBox[0].TDTR = 1;
CAN1->sTxMailBox[0].TDTR  &= ~(0x0000000F);
CAN1->sTxMailBox[0].TDTR |= 8;

tx ayarlarını bu şekilde yapıyorum. mailbox[0] 0x100 id ile gönderiyor. mailbox[1] i de 0x200 id ile kurduk.
0 ın data sına yazıp gönder deyince 0x100 id ile mesaj gitti. 1 in datasına yazıp gönder deyince 0x200 ile mesaj gitti.
bu şekilde 3 farklı mesaj yollayabildik. çünkü mailbox 3 adet. ama benim 17 farklı alıcıya mesaj göndermem gerekiyor.

her farklı id de mailbox[0] ın id sini değiştirip sadece mailbox[0] dan mı gönderme yapıyım?

Tagli

Şimdi benim bu işten anladığım, CAN Bus'ta aslında hat üzerindeki herkes herhangi bir adres hedeflemeden ortalığa bağırıyor, isteyen de istediği kadarını duyuyor (mesaj ID'sine göre filtreleme). Aynı anda bağıran olursa, yüksek öncelikli mesaj baskın geliyor. Düşük öncelikli mesajın sahibi de ortalık durulduğunda tekrar deniyor şansını.

TX için farklı mail box'lar olmasının sebebi de bu sanırım. Bir cihaz, farklı öncelikli (yani ID) mesajlar göndermek isteyebilir. Bunlar için ayrı birer buffer şart, çünkü hat durumuna göre sıra beklemek zorunda kalabilirler. Donanım ilk fırsatta tekrar deneme işini otomatik yapıyor anladığım kadarıyla.

Yani aslında cihaz adresleme CAN Bus'ın ana fikrine biraz ters. En azından ham halinde. Ham CAN Bus'ta master-slave diye bir kavram yok. Ama CANopen gibi üst katmanlarda master-slave ilişkisi ile adresli çalışma durumu olabiliyor.

Yukarıdaki sorumun bir sebebi de oydu. Yani merak ettiğim şey aslında "Ne tür sistemlerde master-slave ilişkisi kullanmayız?" sorusu idi. Öte yandan, bu imkanın CANopen gibi üst seviye protokollerle eklenmiş olması kafamı karıştırıyor.

@izturk, senin durumda belki CAN ID'lerini adres gibi düşünmeyip farklı bir yöntem izleyebilirsin. Yani adres kısmı belki o 8 byte'lık yerde olabilir. Ama tabi bu sefer slave cihazlar donanımsal filtrelerden yararlanamayacaklar. Ne bileyim, mesela cihazlar arasındaki standart iletişim bir ID üzerinden giderken hata mesajları başka bir ID ile broadcast yapılır.

Dönüp dolaşıp aynı soruya geliyorum... Belki de senin sistemin için en uygun yaklaşım CAN Bus değildir? Veya en azından ham CAN Bus değildir. Belki de Modbus veya CANopen kullanman daha uygun olur.

Öte yandan, mailbox ID'lerini de çalışma sırasında değiştirmek mümkündür muhtemelen (dokümanı incelemedim). Belki bu da senin için bir çözüm olabilir.
Gökçe Tağlıoğlu

izturk

@Tagli hocam zaten ben bu sistemi daha önce rs485 ile protokol olmaksızın soru cevap şeklinde çalıştırdım. Ama bağlantıda kopmalar hatalar yaşadım. Böyle olunca hem can bus öğreneyim hem de sistem daha düzenli çalışsın diye can bus yapmak istiyorum.

Aslında bu halde de soru cevap şekliyle işimi çözebilirim. Ama can bus ın madem id filtreleme error frame gibi özellikleri var hem bunları öğreneyim hem de sistem daha otonom çalışır hale gelsin diye çabalıyorum.

Şimdi mesajlardan anladığım benim 3 adet tx mailbox kullanmaya ihtiyacım yok. sadece 0.mailboxu kullanacağım ve id leri değiştirerek mesajları göndereceğim.

Şimdi de merak ettiğim ikinci konu bu filter mask lar ne işe yarar. Diyelim tek id de mesaj yolladım. 3 adet alıcım var ama alıcılardan filter maskla sadece biri bu mesajla ilgileniyor. Bunu filter maskla yapmaktansa neden 3 farklı id de mesajı yollamayım. Zaten 11 bit id var. Buranın "püf" noktası nedir?


Alıntı yapılan: foseydon - 03 Mayıs 2018, 11:52:00hocam ID ve mask gelen mesajı filtrelemek için kullanılıyor. Misal, bunları cihazın kendi ID'sine denk gelecek şekilde ayarlarsan, bu ID dışındaki mesajları görmezden gelir.Bunları kullanarak cihaz gruplandırması yaparak, kendi olduğu gruba gönderilen mesajları dikkate almasını da sağlayabilirsin. Bu işine yarayabilir. Kullanım detayını için texas'ın CANBUS dökümanı var, tavsiye ederim. aramaya üşendiğimden linki eklemedim :)
Yani @foseydon hocam burayı birazcık daha açabilirmiyiz.

OptimusPrime

http://www.ti.com/lit/an/sloa101b/sloa101b.pdf
burayi okumakta fayda var.

soru 3 icin broadcast kullanabilirsin fakat hicbir alicinin mesaji alip almadigini belirleyemezsin.

CAN kullamayali uzun zaman oldu. Tam hatirlayamiyorum neler oldugunu. Linki okumanda fayda var.

CAN in kullanildigi bir alanda otomobiller hatta otobusler.

Ozellikle mesaj bastirabilme ozelligi nedeniyle CAN otomobil sektorunde oldukca yaygin.

Mesela, motor sicakligi otobusun arkasindan soforun onundeki panele gonderilirken abs modulu bir yerlerle konusmak isterse o an hattaki mesaji bastirabiliyor.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

foseydon

@Tagli

ben ham kullanıyorum, ama CanOPEN hakkında da bilgim var. Aynı frame ile daha fazla veri göndermek için CanOPEN kullanılabilir.

genel not:

CAN protokolü OSI'nın fiziksel katmanını da kapsıyor ve oldukça sağlam bir protokol. Bu bakımdan CAN ile modbus kıyası olmaz, çünkü modbus OSI'nın sadece uygulama katmanını kapsıyor. Yani verinin fiziksel olarak nasıl aktarılacağına dair herhangi birşey modbus'ta yok. ama allah için güzel protokol, orası ayrı.

@izturk

Hocam, yukarıda anlatmışlar CAN master/slave gibi çalışmıyor. fakat öyle de kullanabilirsin. @Tagli nin dediği gibi, CAN bus data frame içerisinde ID bölümü var. bu bolüm 13 veya 29 bit olabiliyor (yanlış hatırlamıyorsam). node lar veriyi aldıkları zaman bu ID bölümüne bakıyorlar. Sen şayet bir filtre koyarsan bu ID o filtre ile karşılaştırılır ve filtreden geçerse node cevap verir.

misal filtre 1 ve ID 2


node cevap vermez, ama o noda verdiğin filtre 2 olsa idi o node cevap verecekti. burada işin espirisi şu, node lara verdiğin filtreler benzersiz olmak zorunda değil. Yani bir ID ye birden fazla node cevap verebilir. ama hepsine benzersiz filtre atarsan olay master/slave e döner.

Maske ise daha geniş bir filtredir, filtre ile kullandığın zaman cevap nodun cevap vereceği ID sayısını artırır. Örnenkle anlatırsam daha iyi anlarsın

misal bir node a kurdugun filtre 10 olsun, ayrica değeri F5 olan maske kurduğun zaman o node 10, 11, 12, 13, 14 numaralı ID lerin hepsine cevap verir.

genel mantık bu, senin kullandığın işlemcide özel uygulaması nasıl oluyor bilemiyorum. ama register'lardan filtre ve maske ayarlayabiliyor olman lazım. kullandığın işlemcinin referans dökümanlarını okursan eğer, orada uygulama yazıyordur muhtemelen.

zahi

#12
İzturk mcp2551 ile canbus haberleşmeyi ne yaptın senin yaşadığın sorunların aynısını bende yaşıyorum
haberleşmeyi yapabildin mi?
Bir paylaşımda da interrupt ile ilgili sıkıntı yaşadığını belirtmiştin ordaki can alıcı ve verici için mcp2515 mi kullandın ?
kullandığım mikrodenetleyici stm32f103c8t6
2 tane kullandım mcp2551 bir tanesinin tx rx ini kısa devre edip diğerine stm32f103c8t6 bağladım yukardaki kodları denediğimde logic anlyzer ile baktığımda error var veri gitmiyor
canbus normal modda loopback moda aldığımda da aynı durum canbus haberleşmeyi bir türlü yapamadım :(

izturk

Ben 2515 kullanmadım. bir tarafta 32f103vct6 diğer tarafta 32f103c8t6 var. diğer konudaki kodlar direk çalışıyor.

https://www.picproje.org/index.php/topic,72781.msg557633.html#msg557633

zahi

#14
Cevabınız için teşekürler
mcp2551 diyecektim
mcp2551 ile canbus haberleşmeyi yapabilen yokmu
yukarıdada bahsedildiği gibi cubemix te yaptığım denemelerde logic
anlyzr. ile baktığımda hiçbir şey göremedim yukarda verilen kodu denediğimde veri alma kısmında alamadığından while döngüsünde takılı kalıyor gönderdiği kısma baktığımda  error biti var logic anlyzr.da .
video daki gibimi bağlantıyı yaptınız transceiver olmadan keilin dökümanında videodaki gibi bağlantı öneriyor
son çare olarak mcp2515 modülü ile spi haberleşme  ile gönderecem mcp2515 ile günlerdir uğraşıyorum veri dahi gönderemedim :(