Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

STM32F4 CAN BUS ÇALIŞMASI

Başlatan dmc1, 29 Eylül 2016, 09:13:44

dmc1

Merhabalar,

2'den fazla STM32F4 kullanarak bir CAN BUS ağı kurmak istiyorum.Biri master olacak ve senkron bir şekilde adrese bağlı olarak diğer slave kartlardan veri çekecek.Yalnız bunları yaparken hazır kütüphane kullanmak istemiyorum.İşlemcinin register larına kendim müdahale ederek bu yazılım altyapısını geliştirmek istiyorum.

Bu konuda yardımcı olabilecek varsa şimdiden teşekkürler.

1n4001

Öncelikle CANBus ağı için her MCU kartı için bir CAN Transciever kullanmalısın. Hattın iki başında 120R sonlandırma direnci kullanmalısın. CAN hattı diferansiyel olduğundan twisted pair kablo kullanmalısın. Master dediğin cihaz ile kullanacağın adresten Request istediğinde ilgili Slave bu adres üzerinden geri cevap döndürebilirsin. CAN hattı 250Kbps için yaklaşık saniyede 1000 mesaj taşıyabilir. Sorgulama ve cevaplarını örn. 10 ms aralıklarla yapman hat doluluğunun önüne geçer. ST'nin Standard Peripheral Kütüphanelerini beğeniyorum. Onları kullanabilirsin. Register ile uğraşmak bu noktada uzun sürebilir veya iş içinden çıkılmaz duruma gelebilir.

dmc1

Uzun sürmesi önemli değil işi temelinden öğrenmek için tüm ayrıntıları kendim inşa etmek istiyorum o yüzden hazır kütüphane kullanmayı sevmiyorum.Verdiğiniz bilgiler için teşekkürler.

sadogan

Alıntı yapılan: dmc1 - 29 Eylül 2016, 09:13:44
2'den fazla STM32F4 kullanarak bir CAN BUS ağı kurmak istiyorum.Biri master olacak ve senkron bir şekilde adrese bağlı olarak diğer slave kartlardan veri çekecek.
Canbus master ve slave lerden oluşan bir yapı deyildir.
Canbus ta paketlerin ID leri olur.
Her node, BUS müsait olduğunda verisini BUS a aktarır, otonom bir yapısı vardır.




skara1214

 ilkönce canbus nedir nasıl çalışır onu anlamaya calis. Bu dökümanla başla takıldığın yerleri sorarak ilerleyebilirsin
http://ww1.microchip.com/downloads/en/AppNotes/00713a.pdf
Herkes ölür ama herkes gerçekten yaşamaz

dmc1

Linkini paylaştığınız döküman doğrultusunda CAN BUS konusunda yanlış bildiklerimi de öğrenmiş oldum.Teşekkürler ederim.

Soruma gelecek olursak bir ana modül olacak ve bu modül, diğer tüm modüllere sırayla ve senkron bir şekilde bilgi gönderecek ve bu modüllerden bilgi alacak.CAN 2.0 A ya da B protokolleriyle bu haberleşme altyapısını nasıl kurabilirim.Cevaplar için şimdiden teşekkürler.

skara1214

slave mantığı diye birşey yok  herkes herkese mesaj yollar. sen kime mesaj yollarsan onunda sana mesaj yollamasını beklersin. standart olarak  her birimde 1 adet stmf4 ve mcp2551 kullanacaksın.rs485 hattı gibi kuracaksın.
fiziksel olarak tüm sistemi kurmadan önce eline bir adet stm32f4 discovery bordu al ve canbusu LOOPBACK moduna geçirerek denemelerini yap. Direkman cantx i canrx e bağlar içerden  mcp ye falan gerek olmaz .Ne yolluyorsan onu alırsın böylece sistemi çalıştırırsın. Bunu hallettikten sonra gerisi çocuk oyuncağı
Herkes ölür ama herkes gerçekten yaşamaz

dmc1

Örneğin X modülünden Y modülüne veri yollanır yollanmaz Y'den X modülüne veri gönderilmesi standart bir durum mu CAN protokolünde????

skara1214

#8
değil. x modulunen y modulune data yolladın y bunu okur x e cevap verir. Burada ayrım yapman gereken konu mesaj alıcıya özeldir.  yani sen mesajın id sini belirlersin mesela PICPROJE mesajını yollayacksın. Canbus tx bufferina PICPROJE yi yazarsın ID kısmınada sallıyorum 2501 yazarsın sonra datayı basarsın. Diğer tüm sistemler buna bakar ID 2501 i almasına ayarladığın rx bunu alır. Diğerleri ciddiye almaz. Yani yolladığın data ID si kimle uyusuyorsa o alır.

mesaj birleştirme:: 30 Eylül 2016, 16:32:35

http://www.barissamanci.net/Makale/15/can-bus-nedir-can-protokolu-incelemesi/
Herkes ölür ama herkes gerçekten yaşamaz

dmc1

Yalnız anlattığınız senaryoda herhangi bir cevap göndermedi ID'si 2501 olan işlemci.Datayı sadece aldı.

skara1214

onuda siz yazıyorsunuz ya sizde kime cevap yollamak istiyorsanız cevabı ID ekleyerek hatta basıyorsunuz.
Herkes ölür ama herkes gerçekten yaşamaz

M_B

@skara1214 hocam;
Can bus ta filtreleme nasıl oluyor. 
Diyelim 50 tane nodumuz bir tanede masterımız var. Bu nodeların da Id leri 1-den 50 ye kadar.
Masterın da ID si 500 olsun.

Tüm slave nodelar durumlara göre mastera bilgi verecek.
Slave lerde nasıl bir hardware filtreleme yapılıyor.
Yani 5 numaralı slave node mastera bilgi verirken diğer nodelar kendi üstüne almasın.

Demek istediğim.
slave nodelar dongu icinde gelen id ile kendi id sini karşılaştırmasın.
O yuzden hardware filtreleme nasıl yapılıyor.

Teşekkürler


İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

skara1214

#12
şöyle oluyor hocam. Canbusun rx bufferinin filtresini ayarlayabiliyorsunuz yani bir registerla rx1 bufferinin filtresi 500 olsun diyorsunuz. 1 full message geldiğinde bu verdiğim barış samancı linkini incelerseniz data harici birçok bölüm var burada hardware ID yi  inceliyor eger ID çakışması oluşursa o mesajı alıyor ve flagi 1 yapıyor. yoksa o mesajın sizinle alakası yoksa yokmuş gibi davranıyor.

sizin verdiğiniz örnekte node 5 mesaj yazarsa mastera; ID yi 500 ayarlayıp datayı hatta basıyor. Bakın CANBUS MULTİMASTER bir sistemdir rs485 gibi 1 master birçok slave mantığı yoktur.
sizin master dediğiniz hehrangi bir noddur .herhangi bir nod İD Sİ 20 olanla konuşur. ID si 20 olanda isterse IDsi bilmem kaçla konuşur
Herkes ölür ama herkes gerçekten yaşamaz

M_B

Teşekkürler hocam.
Verdigim ornek anlaşılsın diye o şekilde tarif ettim. Dediğiniz gibi multimaster bir yapıda çalışıyor.
İşlemci olarak 18f4580 kullanıyorum. Takıldığı yer üzerinde çalıştığım kısım filtreleme. Filtreleme dokümanının tam kavrayamadim da.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

skara1214

filtreleme şöyle çalışıyor. Filtre önemli değil ona uygulanan mask önemli .
Nasıl yani;
filtre binary olarak yazarsak;
1001 0100 1100 1001
maskta;
1111 0000 0000 0011
maskın 1 olduğu yer önemlidir yani gelen hangi mesaj kabul edilir;
1001 xxxx xxxx xx01

Herkes ölür ama herkes gerçekten yaşamaz