Bu yazımda CAN protokolünün yapısını ve çalışma mantığını donanımdan bağımsız olarak sizlere anlatmayı planlıyorum.Burdaki bilgiler ARM, AVR, PIC vb gibi işlemcilerin hepsi için geçerlidir.Burada yazdıklarım zamanında LPC2000 programlama klavuzu adlı e-kitabımı hazırlarken internetten araştırıp edindiğim bilgilerin derlemesidir.Bu kadar kapsamlısını başka yerde bulamassınız :) Bu yazımda donanıma girmeden sadece CAN sisteminin işleyisini ve mantığını anlatacağım.Eğer kelimeler öğretir örnekler yol gösterir diyenlerdenseniz, donanım ve kod incelemek istiyorsanız LPC2000 Programlama Klavuzu adlı e-kitabımdaki CAN başlığına bakabilirsiniz, burdaki bilgiler de kitabımdan alıntıdır.
Controller Area Network (CAN) protokolü 1983 yılında omototiv sektöründe kullanılmak üzere Robert Bosch tarafından geliştirilmeye başlanmıştır ve resmi olarak 1986 yılında kullanılmaya başlanmıştır. Araçlarda bulunan kablo ağının azaltılması amaçlanmıştır.Bu protokol sayesinde motor, frenler, klima, çeşitli sensörler gibi birimler arasında 10 larca kablo yerine sadece 2 kablo kullanılmaktadır.CAN protokolü başta otomotiv alanında kullanılsada veri iletim hızı,hata oranının düşüklüğü ve uygulama kolaylığı gibi sebeplerden dolayı mikroişlemcili sistemlerde de çoğu kişi tarafından bireysel uygulamalarda kullanılmaktadır.İletişim hızı 40m de 1Mbit/sn iken 1km uzaklıklarda 40Kbit/sn ye düşmektedir.Yapılan olasılık hesaplarına göre sağlıklı çalışan bir CAN sisteminin tespit edilemeyen hata yapma olasılığı bir asırda bir dir.
CAN diğer protokollerden farklı olarak adress temelli değil mesaj temelli çalışmaktadır.Her mesaja özgü bir ID numarası vardır.Mesajlar çerçeveler ile iletilirler ve veri ve istek mesajları olarak ikiye ayrılırlar.İstek mesajlarında veri bulunmaz. Veri mesajlarında ise en fazla 8 bytle lık veri aktarılır.CAN2.0A ve CAN2.0B olmak üzere 2 tane standartı vardır.Bunlar arasındaki fark mesaj uzunluklarının farklı olmasıdır.Bunlar ilerleyen kısımlarda anlatılacaktır.
CAN Veri Yolu ve Bağlantı Noktaları
Genel olarak bir CAN bağlantı noktası aşağıda gösterilmiştir.Bağlantı noktaları düğüm olarak isimlendirilirler ve mikrodenetleyici,CAN kontrolcüsünden oluşmaktadırlar.Bizim işlemcilerimizde bu CAN kontrolcüsü çipe dahil edilmiştir fakat harici entegre olarakta kullanılabilir.CAN kontrolcüsü CAN veri yoluna direk bağlanır.Bu veri yolu iki telden oluşmuş, iki tarafı 120 ohm dirençlerle sonlandırılmış bir veri yoludur.
CAN yapısında alıcı ve verici birbirinden fiziksel olarak bağımsızdır.Fakat düğümlerin yapısı gereği gönderilen mesaj alıcıdan dinlenebilmektedir.Bu sayede veriyi gönderen işlemci gönderdiği veri ile okuduğu veriyi karşılaştırarak hata ve mesajların öncelik seviyelerine göre iletilmelerine olanak sağlanır.Multimaster yapıda çalışabilen bu sistem için bu özellik önemlidir.
Yukarıdaki şekilde görüldüğü gibi hattın lojik seviyesi 2 farklı değer alabilmektedir ve bu değerlerin seviyesi gözükmektedir. Lojik1 recessive (çekingen), lojik0 dominant (baskın) olarak adlandırılmaktadır. Bunun sebebi hatta farklı düğümlerden aynı anda 0 ve 1 yazılması durumunda 0 ın 1 karşı baskın gelmesidir.Bu durumun doğruluk tabloları yukarıda verilmiştir.
Lojik 0 ın lojik 1e baskın gelmesi sonucu küçük mesaj ID sine sahip mesajlar öncelik kazanırlar. Bir düğüm tarafından mesaj gönderilmesi kararlaştırıldığında mesaj yol boşalana kadar bekletilir.Her düğüm yolu devamlı izlemektedir.Yol boşaldıktan sonra düğüm yola başla işaretini vererek mesajı yollamaya başlar.Mesaj her düğüme ulaşmaktadır ve ilişkisi olan düğümler mesajı okuyup işlemektedirler.Eğer yol boşaldığında birden fazla düğüm yola mesaj yazmaya başlarsa düşük ID li mesajı yazan düğüm yolu ele geçirir ve diğer düğümler aradan çekilerek tekrar göndermek üzere yolun boşalmasını beklerler. Bu mekanizma şu şekilde çalışır.Yazılan her bitin aynı anda okunduğun-dan bahsetmiştik.Bir düğüm veri yoluna mesaj yazarken 1 yazdığında 0 okuyorsa eğer, başka bir düğümünde yola mesaj yazdığını anlar ve onun önceliği yüksek olduğundan veri yolunu ona bırakır. Yol boşaldığında tekrar göndermeye çalışır. Örneğin yola aynı anda veri yazmaya çalışan A, B ve C adında 3 düğümümüz olsun. A düğümü yola 36 (100100), B düğümü 47(101111) ve C düğümü 37(100101) yazsın.Aşağıdaki şekilde bu durum gösterilmiştir.
A düğümü mesajını gönderdikten sonra daha önemli bir mesaj yoksa C düğümü sonrada B düğümü mesajını gönderir.
CAN Mesajları
Veriyolunda mesajlar çerçevelere bölünerek iletilmektedir.İki farklı mesaj türü vardır.Bunlar veri çerçevesi (Message Frame) ve istek çerçeveleridir (Remote Transmit Request Frame).Farkları ise veri çerçevelerinin en fazla 8 byte uzunluga kadar veri taşıyabilmesi, istek çerçevesinde ise belli bir mesaja ait verinin istenmesidir.Ayrıca 2 adet CAN2.0A ve CAN2.0B olmak üzere iki çeşit CAN standartı vardır. Aşağıda bu iki standartta anlatılmıştır. İlk anlatılan çerçeve CAN 2.0A standartındadır. Bu çerçeveye temel çerçeve (Base Frame) denilmektedir.CAN2.0B den farkı ise mesaj ID alanının 11 bit olmasıdır.CAN2.0B de mesaj ID alanı 29 bittir ve bu çerçeve genişletilmiş (Extended Frame) olarak anılmaktadır. CAN2.0B protokolünde 229 ile çok daha fazla mesaj tanımlayabirliriz.
Base Frame
Her çerçeve SOF (Start Of Frame) sinyali ile başlar.Bu sinyal 1 bitliktir dominanttır. Bunun ardından 12bitlik denetim alanı gelmektedir. İlk 11 biti mesaj ID alanıdır ve bu alandaki ID değeri ile mesajlar etiketlenir. Denetim alanındaki son bit RTR diye adlandırılır ve özel anlamı vardır.Bu bit 0 (dominant) ise gönderilen çerçeve veri çerçevesidir ve veri alanında, ID alanında tanımlanan mesaja ait veri vardır. Bu bit 1 ise çerçeve istek çerçevesidir ve veri alanı yoktur. Bu çerçevenin ID alanındaki değer ile belirlenen mesaj a ait veri ilgili düğümlerden istenmektedir.Bu çerçeveyi alan alıcı ID alanındaki değeri okuyarak hangi veriyi göndermesi gerektiğini anlar ve yol boşa çıktığında gönderir.Bu sayede CAN protokolü master ve slave olarak çalışabilmektedir.ID alanındaki ilk 7 bit ardışıl olarak resesif olamaz.
Denetim alanından sonra kontrol alanı gelmektedir.Bu alanın ilk biti IDE diye isimlendirilir ve bu çerçevenin 11 bitlik ID alanına sahip 2.0A çerçevesi olduğunu belirten dominant bir bittir.Bu bitin ardından bir bitlik kullanılmayan rezerve alan gelmektedir.Daha sonra 4 bitlik DLC diye isimlendirilen bir alan gelir.DLC alanı gönderilen verinin kaç byte olduğunu söyler.Kontol alanını veri alanı takip etmektedir.Veri alanı en fazla 8byte olabilmektedir.Veri alanını CRC alanı takip eder.Bu alan 16 bitliktir ve 15 bitlik CRC (Cyclic Redundancy Check) bilgisi ile resesif CRC Delimiter bitinden oluşmaktadır. CRC alanı gönderilen SOF alanından CRC alanına kadar gönderilen verinin doğru olup olmadığının anlaşılması için bir değerdir.Veriyi gönderen düğüm veri üzerinde bir takıp işlemler yaparak 15 bitlik CRC değerini hesaplar ve çerçeveye ekler.Alan düğüm veriyi aldığında göndericinin yaptığı işlemler ile aynı işlemleri yapar ve CRC yi tekrar hesaplar.Alınan ve gönderilen CRC tutarlı ise veri doğru gönderilmiştir.Alıcı düğümlerden en az 1 tanesi bile veriyi yanlış aldıysa veri tekrar gönderilmelidir.CRC alanını ACK alanı takip eder.Bu alan 2 bitliktir.İlk bitini gönderici resesif olarak gönderir.Eğer veri en az bir alıcı tarafından doğru alınmışsa alıcı yola domniant biti yazar.Böylece gönderici mesajın en az bir alıcı tarfından alındığını anlar.Eğer gönderici dominant biti okuyamassa ACK işaretinden kaynaklı bir hata olduğuna kanaat getirir ve veriyi tekrar yollar.Bu alanın ikinci biti ise ACK delimiter olarak adlandırılır ve resesiftir.Daha sonra çerçevenin sonlandırıldığını belirten 7 bitlik EOF alanı gelir.Bu alandaki bitler resesiftir.Daha sonra ise çerçeveler arasında boşlık bırakmak amacıyla 3 bitlik INT alanı gelmektedir ve bitleri resesiftir.
Extended Frame
Can2.0B de mesaj ID si 29 bittir.Geriye uyumluluk açısından CAN2.0B geliştirilirken 2.0A göz önünde bulundurularak geliştirilmiştir.İki protokolde aynı yolda çalışabilmektedir fakat 2.0A düğümlerine 29 bitlik ID li mesajlar gönderilmemelidir.Extended frame de dominant SOF ile başlar ardından 2.0A da olduğu gibi 11 bitlik IDA alanı gelir. Ardından 2.0A daki dominant RTR biti yerine resesif SRR biti gelmektedir.Ardından 2.0A daki ofsete denk gelecek şekilder IDE biti gelir.Tek farkı 2.0B de bu bit resesiftir çünkü 29 bitlik ID ye sahip mesajlar iletilmektedir.IDE bitinden sonra 18bitlik ikinci ID B alanı gelir.Ardından dominant RTR biti gelerek bu çerçevenin veri çerçevesi olduğunu belirtir.Kontrol alanının ilk iki biti rezerve dir ve kullanılmaz.Son dört bit DLC alanını oluşturur ve gönderilen verinin kaç byte olduğunu söyler.Geri kalan kısım 2.0A ile aynıdır.
Request Frame
Çoğu zaman veri yolu okunan, oluşan bilgilerin gönderilmesi ile çalışmaktadır.Bazen düğümler istekte bulunurlar.Bunu istek çerçevesi ile yaparlar.İstek çerçevesi ile veri çerçevesinin 2 farkı vardır.Bunlar istek çerçevelerinde RTR biti resesiftir ve istek çerçevelerinin veri alanı yoktur.Kalan kısımlar veri çerçevesi ile aynıdır.
Error Frame
Veri yolunda hata oluştuğunda hata çerçevesi gönderilmektedir.Hata çerçevesi iki alandan oluşmaktadır.Bu alanlar hata bayrakları (Error Flags) ve hata ayracı (Error Delimiter) alanıdır.Aktif ve pasif olmak üzere iki adet hata bayrağı vardır.Yolun durumuna göre aktif veya pasif hata oluşturulmaktadır.
CAN haberleşmesinde harici clock yoktur.Senkronizasyon lojik değişimlere göre yapılmak-tadır. Altı veya daha fazla adet aynı lojik seviyeden bitin ardışıl okunması, senkronizasyonun kayboldugu anlamına gelip alıcıda hata oluşturmaktadır.Bu yüzden aynı lojik seviyede beş ardışıl bit gönderildikten sonra araya karşı seviyeden bir bit sıkıştırılır. Bunu CAN donanımı yapmaktadır ve bu işlemin adına bit stuffing denilmektedir.
BIT Süresi
Çoğu diğer seri protokolün aksine, CAN protokolünde bit hızı direk olarak baud rate önbölü-cüsünü kurarak ayarlanmaz. CAN donanımlarında baud rate önbölücüsü vardır fakat kuanta denilen küçük bir zaman dilimini üretmek için kullanılır.Bir bitlik süre 3 kısma bölünmüştür.Birinci kısım senkronizasyon kısmıdır ve sabit olarak bir kuanta uzunluğundadır.Takip eden kısımlar ise Tseg1 ve Tseg2 olarak isimlendirilir ve kullanıcı tarafından uzunlukları kuanta cinsinden ayarlanabilir.Bir bitlik periyot minimum 8 maksimum 25 kuanta uzunluğunda olmalıdır.Gönderilen bitin alıcıda alındığı nokta örnekleme noktası diye isimlendirilir ve Tseg1 sonundadır.
Tseg1 ve Tseg2 oranı ayarlanarak örnekleme noktası bir bitlik zaman içerisinde kaydırılabilir. Bunu yapmamızdaki amaç iletim hattının uzunluğuna göre sistemin kararlı çalışabilmesini sağlamak-tır.Uzun iletim hatları kullanıyorsak örnekleme noktası geri çekilmelidir.Osilatörümüz hassas değil ve kesinliği düşük ise örnekleme noktası ileri kaydırılır.Ek olarak alıcılar bit zamanlamalarını ayarlayarak vericiye kilitlenebilirler.Bu vericinin bit hızındaki ufak sapmaları telafi eder.Her bit, kullanıcı tarafından ayarlanabilen, synchronous jump width denilen, 1-4 kuanta süresi arasında değer alan bir değişken tarafından ayarlanır. Bit hızı aşağıdaki bağıntı ile hesaplanır(BRP=Baud Rate Presaler).
Bit Rate = PCLK / ( BRP * ( 1 + Tseg1 + Tseg2 ) )
Bu bağıntı birkaç bilinmeyene sahiptir.Bit hızını 125Khz, PCLK yı 60Mhz ve örnekleme noktasını %70 olarak kullandığımızı varsayalım.Bir bitlik periyot toplam kuanta sayısı ile hesaplanır ve bu değer (1+Tseg1+Tseg2) dir.Bu değere KUANTA diyelim ve yukarıdaki bağıntıyı tekrar düzenleyelim.
BRP = PCLK / ( Bit Rate * KUANTA )
Bilinen değerlerimizi denklemde yerine koyalım.
BRP = 60M / ( 125K * KUANTA)
Bir bitlik periyodun 8 ila 25 kuanta arasında olduğunu biliyoruz.Bu bilgiyi kullanarak BRP tam sayı olacak şekilde KUANTA yerine 8 ile 25 arasında uygun bir sayı seçelim. KUANTA =16 , BRP=30 olacak şekilde denklemi çözeriz. Şimdi Tseg1 ile Tseg2 arasındaki oranı ayarlayalım.
16 = (1+Tseg1+Tseg2)
olduğuna göre hedeflenen örnekleme noktasının periyodun %70 ine denk gelmesi için
Örnekleme Noktası = (KUANTA * 70) / 100
dür. Dolayısıyla 16 * 0.7 = 11.2 olur. Buradan Tseg1 = 10 ve Tseg2 = 5 olarak bulunur.Bu durumda örnekleme noktası %68.8 e denk gelir.Synchronous jump width değeride aşağıdaki şekilde hesaplanır.
Tseg2 >= 5 TKUANTA ise SJW =4 tür.
Tseg2 < 5 TKUANTA ise SJW = ( Tseg2 -1 ) TKUANTA dır.
Bizim örneğimizde SJW=4 tür.
CAN Hata Önleme
CAN protrokolünün beş adet hata önleme yöntemi vardır.Herhangi bir hata oluştuğunda gönderici veriyi tekrar gönderir böylece işlemcinin olaya müdehale etmesine gerek kalmaz.Hata önleme yöntemlerinden 3 tanesi çerçeve düzeyinde 2 tanesi ise bit düzeyindedir. Çerçeve düzeyinde olanlar çerçeve formatı kontrolü, CRC kontrolü ve ACK (onay) kontrolü dür. Bit düzeyinde olanlar ise bit kontrolü ve bit stuffing kontrolüdür.
CAN çerçeve formatında birden fazla alan olduğunu ve neler olduklarını yukarıda anlattık.Alıcı veriyi aldıktan sonra verinin formatını kontrol eder ve çerçeve yapısı ile uyumlu olup olmadığını karşı-laştırır.Alınan veride eksik alan varsa veri reddedilir ve veri yoluna hata çerçevesi bırakılır.Bu sistem doğru formatta veri alımını sağlar.Çerçeve düzeyindeki ikinci hata önleme yöntemi ise CRC kontrolü-dür.SOF bitinden CRC bitlerinin başına kadar olan bitler bir takım işlemlerden geçirilerek CRC kodu üretilir.Alıcıda bu CRC kodu alınan veri ile karşılaştırılır ve alınan bitlerin doğru olup olmadığı sınanır. Format kontrolünden sonra alıcının bitleri kontrol etmesi ile formata uyan fakat hatalı mesajların önüne geçilmiş olur.Çerçeve düzeyindeki son hata kontrolü ise ACK mesajının göndericiye ulaşmama-sıdır.ACK bitinin anlamı alınan mesajı alıcının onaylamasıdır.Gönderici CRC bitlerini gönderdikten sonra ACK bitini resesif olarak gönderir.Alıcılardan en az bir tanesinin hattaki resesif olan ACK bitini dominant bitle ezmesi beklenir.Eğer zaman aşımı sonucu ACK biti göndericiye ulaşmamışsa ACK bitinde hata oduğu şeklinde yorumlanır.Bunun sonucu göndericide hata oluşur ve ACK onayını alana kadar aynı mesajı tekrar gönderir.
Bit düzeyindeki hatalardan ilki bit stuffing hatasıdır.Gönderici ile alıcı arasıda saat darbeleri gönderilmez.Bunun yerine veri yolundaki CANL ve CANH hatlarındaki lojik değişimler ile senkronizas-yon sağlanır.Bunun sonucu olarak aynı lojik seviyeden (dominant) 5 ten fazla bitin ard arda gelmesi senkronizasyonun bozulduğu anlamına gelir ve alıcıda hataya sebebiyet verir.Bunu engellemek için gönderici aynı 5 seviyeden sonra karşı seviyeden bir bit göndererek iletişime devam eder.Bu olay aşağıdaki şekilde gösterilmiştir.
Bunun sonucu olarak herhangi bir düğüm herhangi bir anda hata mesajı oluşturmak istediğinde veri yoluna 6 adet dominant bit yazar ve hataya sebebiyet verir.Bit düzeyindeki diğer hata ise bit kontrolüdür.Veri yolu boşaldığında düğümlerin mesaj göndermek için veri yolunu mesajların ID lerine göre ele geçirdiğini söylemiştik.Her düğüm veri yoluna yazdığı biti tekrar geri okuyarak kendisinin gönderdiğinden daha önemli bir mesaj varmı diye bakar.Eğer daha önemli mesaj varsa geri çekilerek veri yolunun boşalmasını bekler.Böylece veri yolunu bir düğüm kazanmış olur ve bitleri göndermeye devam eder.Aynı zamandada gönderdiği bitleri geri okur.Eğer veri yolunu kazanan düğüm gönderdiği seviyeden farklı bir seviye okursa hata oluşturur.
CAN yapısının temelinde her mesajın farklı bir ID ile etiketlendiğini söylemiştik. Mesajları etiketlerken bu kurala dikkatle uymamız gerekmektedir.Yoksa farklı düğümlerin aynı ID ye ait farklı veriler göndermesi alıcıda CRC hatasına sebeb olacaktır.
CAN donanımı oluşan hatalara göre hata durumları arasında geçiş yapmaktadır.İki adet hata sayıcısı vardır.Bunlar göndericide oluşturulan hataları ve alınan hataları sayarlar.Herhangi bir sayıcı 127 ve büyük bir değere ulaşırsa donanım pasif hata moduna girer.Bu modda gelen hata çerçevelerini cevaplamaya devam eder fakat hata oluşturduğunda dominant bitler yerine resesif bitler gönderir. Eğer gönderim hata sayısı 255 i geçerse donanım kapatılır ve hattaki iletişime karışmaz ve etkilenmez. Haberleşmeyi tekrar başlatmak için işlemcinin olaya müdehale etmesi gerekmektedir.CAN donanı-mını resetler ve tekrar konfigüre eder.Bu mekanizmalar düğüm hatalı duruma düştüğünde ard arda hata mesajları göndererek veri yolunu meşgul etmesini önlemek içindir.
CAN üzerine söyleyeceklerim bu kadar.Buraya kadar okuyarak geldiyseniz CAN protokolünü anlamışsınız demektir :) Burdan sonrası özelleşmiş donanım kısmına girmekte ve örnek yapmamız gerekmektedir.Çalışma mantığı üzerine kod arıyorsanız LPC2000 programlama klavuzu adlı ekitabım altındaki donanım yapısına ve örnek kodlara bakabilirsiniz.
Başka bir yazıda görüşmek dileğiyle hoşcakalın :)