125 kbit / s'de maksimum CAN veri yolu çerçeve (mesaj) hızı nedir?


19

CAN veriyolum 125 kbit / s hızında çalışıyor ve yalnızca genişletilmiş çerçeve formatı kullanıyor. Gönderebileceğim maksimum CAN çerçevesinin oranının ne olduğunu bilmek istiyorum. Veri uzunluğunun her zaman sekiz bayt olduğunu varsayalım.

Bu Wikipedia sayfasına göre , her karenin maksimum kare uzunluğu (1+11+1+1+18+1+2+4+64+15+1+1+1+7) = 128bitleri vardır:

Resim açıklamasını buraya girin

Minimum üç bit çerçeveler arası aralık dikkate alındığında, 125 kbit / sn altındaki maksimum paket hızı: 125000 / ( 128 + 3) = 954saniye başına kare olmalıdır .

Ama testimde bu kadar yükselemedim. Ulaşabileceğim maksimum kare hızı (sekiz bayt verisinin tümü ile) saniyede yaklaşık 850 karedir.

Burada sorun nedir - hesaplamam mı yoksa test yöntemim mi?


Bir kapsamla bakın ve gerçekte ne elde ettiğinizi görün. Belki de donanımınız, gönderdikten hemen sonra yeni bir çerçeve iletmeye hazır değildir. Ayrıca, ACK zamanını da dikkate alıyor musunuz? Etiketlenmemiş bit miktarınız bize tam olarak neyi saydığınızı söylemede yardımcı olmaz.
Olin Lathrop

Uygulamada, ACK süreleri ve çerçeveler arası boşluk ihtiyacı nedeniyle CAN veri yolu üzerinden herhangi bir uzun süre% 100 veri yolu kullanımı elde etmek zordur. CAN denetleyiciniz, uzun bir süre boyunca% 100 veri yolu kullanımını destekleyemeyebilir.
Tristan Seifert

2
Tam olarak hangi verileri gönderdiğinize bağlı olarak, bit doldurma çerçeve boyutunuzu% 10'a kadar artırabilir.
WhatRoughBeast

1
@xiaobai - Hayır, veri alanının uzunluğu değişir. Bir bağlantıya gelince, zaten sağladınız. Tüm sayfayı okuyun. Testleriniz tüm sıfırları veya hepsini gönderiyorsa, bu çok açıklar.
WhatRoughBeast

1
ACK, muhasebeleştirmiyorsanız iletim süresini etkileyebilir. Yine, toplanmamış sayıların etiketlenmemiş karışıklığı bize gerçekten neyi eklediğinizi ve dolayısıyla neyi kaçırmış olabileceğinizi söylemiyor.
Olin Lathrop

Yanıtlar:


19

Olin Lathrop'ın önerisine göre, bit doldurmaya genişleyeceğim.

CAN, NRZ kodlamasını kullanır ve bu nedenle uzun veya sıfır veya uzun sıfır işlemlerinden memnun değildir (Saat kenarlarının nerede olması gerektiğini izler). Bu potansiyel problemi bit doldurma ile çözer. İletim sırasında, birbirini izleyen 5 veya sıfırdan oluşan bir çalışma ile karşılaşırsa, diğer polaritenin bir kısmını ekler ve alırken, birbirini izleyen 5 veya sıfırla karşılaşırsa, sonraki bit göz ardı edilir (bit önceki ile aynı değilse) (bu durumda bir hata bayrağı yayınlar).

Test verileriniz için tüm sıfırları veya tümünü sıfırlarsanız, 64 özdeş bitlik bir dize, 12 doldurulmuş bitin eklenmesiyle sonuçlanır. Bu, toplam kare uzunluğunu 140 bite çıkaracak ve en iyi kare hızı 874 kare / sn olacaktır. Veri bitleri CRC'nin MSB'si ile aynıysa, orada başka bir doldurulmuş bit alırsınız ve kare hızı 868 kare / saniyeye düşer. CRC'nin uzun çalışma süreleri veya sıfırları varsa, kare hızını daha da azaltacaktır. Aynı husus tanımlayıcılarınız için de geçerlidir.

Toplam 16 doldurulmuş bit, 850,3 kare / sn'lik ideal bir kare hızı üretecektir, bu yüzden bunu düşünmelisiniz. Hızlı bir test, test verilerini alternatif bitlerle kullanmak ve kare hızınıza ne olduğunu görmek olacaktır.


3
Evet, orijinal testimde faydalı yükte ve kimlikte çok sayıda sıfır var. Veri veya kimlikte birbirini takip eden 5 sıfır olmadığından emin olduktan sonra , hesaplanan sınıra çok yakın 940 kare / sn alabilirim . Harika cevap için çok teşekkürler.
Penghe Geng

1

Olin, bit doldurma açıklaması ve bunun teorik CAN iş hacmini nasıl olumsuz etkileyebileceği konusunda haklı. Gerçek çıktıyı teorik olarak daha da kötüleştirebilen bir diğer şey de gecikmedir. CAN denetleyiciniz% 100 veri yolu kullanımını başarabilse bile, ana bilgisayar işlemcisi bu hızda Tx ve / veya Rx'i işleyemeyebilir. Bu, CAN yığınını uygulayan yavaş bir işlemcinin ve / veya verimsiz bellenimin sonucu olabilir.


1

Yapabileceğiniz en küçük 2.0a (standart) çerçeve 47 bittir ... Yapabileceğiniz en küçük 2.0b (genişletilmiş) çerçeve 67 bittir ... 3 bit çerçeve içi aralık içerir ve bit doldurmayı içerir ... Teoride asla bir şey yapmayacak bir çerçeve oluşturabiliriz; Gerçekte, biraz doldurma oldukça fazla olacak!

CANBus 2.0a / b için maksimum baud 1Mbit'tir.
1Mb / S'de, tek bir (baskın / resesif) bit 1 uS uzunluğundadır, yani. 0.000'001 S
Yani 67 bitlik bir çerçevenin [en küçük teorik 2.0b çerçeve] iletilmesi 67 uS alacak - başka bir (67bit) çerçeve iletilmeden önce.
1'000'000 / 67, 14.925 tam kare verir (bir sonraki karenin + 25 biti)

Bu hızın 1 / 8'inde koşarken, paketlerin en fazla 1 / 8'ini elde edebilirsiniz
koşarken 8'ini 14'925 / 8 = 1'865 kare / Saniye @ 125Kb elde edebilirsiniz

64 bitlik (8bayt) verinin tamamını kullandığınızda ve ASSUMING, ardışık 1'ler veya 0'lar dizeleri içererek bit doldurma "hatalarını" tetiklemediniz. 1'000'000
/ (67 + 64) = 7.633
7 ' 633/8 = 954

Bu da kablo tesisatınızın mükemmel olduğunu varsayar. Kutu veri yolunuz 120ohm UTP kablodan yapılmış ve her iki uçta kapasitif olarak ayrılmış mı? Veya bir ucunda 120ohm dirençli rastgele bir tel mi?

Genel olarak, teorik maksimum verimin% 90'ını elde etmek için oldukça iyi yaptığınızı söyleyebilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.