อัตราบัส CAN บัส (ข้อความ) สูงสุดที่ 125 kbit / s คืออะไร?


18

รถบัส CAN ของฉันทำงานที่ 125 kbit / s และใช้รูปแบบเฟรมแบบขยายโดยเฉพาะ ฉันอยากรู้ว่าอัตราเฟรม CAN สูงสุดที่ฉันสามารถส่งได้คือเท่าไหร่ สมมติว่าความยาวข้อมูลอยู่ที่แปดไบต์เสมอ

ตามหน้า Wikipedia นี้แต่ละเฟรมมีความยาวเฟรมสูงสุดเป็น(1+11+1+1+18+1+2+4+64+15+1+1+1+7) = 128บิต:

ป้อนคำอธิบายภาพที่นี่

โดยคำนึงถึงระยะห่างระหว่างเฟรมอย่างน้อยสามบิตอัตราแพ็กเก็ตสูงสุดต่ำกว่า 125 kbit / s ควรเป็น: 125000 / ( 128 + 3) = 954เฟรมต่อวินาที

แต่ในการทดสอบของฉันฉันไม่สามารถสูงได้ อัตราเฟรมสูงสุดที่ฉันสามารถทำได้ (ด้วยข้อมูลทั้งแปดไบต์) คือประมาณ 850 เฟรมต่อวินาที

มีอะไรผิดปกติในการคำนวณหรือวิธีทดสอบของฉัน


ดูด้วยขอบเขตและดูสิ่งที่คุณได้รับจริง บางทีฮาร์ดแวร์ของคุณยังไม่พร้อมที่จะส่งเฟรมใหม่หลังจากส่งทันที นอกจากนี้คุณยังคำนึงถึงเวลา ACK ด้วยหรือไม่ จำนวนบิตที่ไม่มีป้ายกำกับของคุณไม่มีประโยชน์ในการบอกเราว่าคุณกำลังนับอะไรอยู่
Olin Lathrop

ในทางปฏิบัติมันยากที่จะได้รับประโยชน์จากบัส 100% สำหรับการขยายเวลาใด ๆ บนบัส CAN เนื่องจากความต้องการเวลา ACK และระยะห่างระหว่างเฟรม คอนโทรลเลอร์ CAN ของคุณอาจไม่สามารถรองรับการใช้งานบัสได้ 100% เป็นระยะเวลานาน ๆ
Tristan Seifert

2
การบรรจุบิตสามารถเพิ่มขนาดเฟรมได้สูงสุด 10% ขึ้นอยู่กับข้อมูลที่คุณส่ง
WhatRoughBeast

1
@xiaobai - ไม่ความยาวของเขตข้อมูลเปลี่ยนแปลง สำหรับลิงก์คุณได้มอบมันไว้แล้ว อ่านทั้งหน้า หากการทดสอบของคุณกำลังส่งเลขศูนย์ทั้งหมดหรือทั้งหมดนั้นจะอธิบายได้มาก
WhatRoughBeast

1
ACK สามารถส่งผลกระทบต่อเวลาการส่งหากคุณไม่ได้คิดบัญชี อีกครั้งความยุ่งเหยิงที่ไม่มีป้ายกำกับของตัวเลขรวมไม่ได้บอกเราว่าคุณกำลังรวมอะไรกันอยู่และดังนั้นสิ่งที่คุณอาจขาดหายไป
Olin Lathrop

คำตอบ:


18

ตามคำแนะนำของแลง Lathrop ฉันจะขยายตัวในการบรรจุบิต

สามารถใช้การเข้ารหัส NRZ และไม่มีความสุขกับการรันนานหรือศูนย์ (มันสูญเสียการติดตามที่ขอบนาฬิกาควรจะเป็น) มันแก้ปัญหาที่อาจเกิดขึ้นโดยการบรรจุบิต เมื่อทำการส่งสัญญาณหากพบการทำงาน 5 ครั้งต่อเนื่องหรือเลขศูนย์มันจะแทรกบิตของขั้วอื่น ๆ และเมื่อได้รับหากพบการต่อเนื่อง 5 ครั้งหรือเลขศูนย์จะไม่สนใจบิตถัดไป (เว้นแต่บิตจะเหมือนกับก่อนหน้านี้ บิตในกรณีนี้มันจะออกธงข้อผิดพลาด)

หากคุณกำลังส่งเลขศูนย์ทั้งหมดหรือทั้งหมดสำหรับข้อมูลการทดสอบของคุณสตริง 64 บิตที่เหมือนกันจะส่งผลให้มีการแทรกบิตยัดจำนวน 12 บิต สิ่งนี้จะเพิ่มความยาวเฟรมทั้งหมดเป็น 140 บิตด้วยอัตราเฟรมที่ดีที่สุด 874 เฟรม / วินาที หากบิตข้อมูลเหมือนกับ MSB ของ CRC คุณจะได้บิตยัดอีกหนึ่งตัวและอัตราเฟรมจะลดลงเหลือ 868 เฟรม / วินาที หากซีอาร์ซีมีจำนวนศูนย์หรือศูนย์นานกว่าจะช่วยลดอัตราเฟรมให้ดียิ่งขึ้น ข้อพิจารณาเดียวกันนี้ใช้กับตัวระบุของคุณ

บิตที่ยัดไว้ทั้งหมด 16 บิตจะให้อัตราเฟรมที่ดีที่สุดที่ 850.3 เฟรม / วินาทีดังนั้นคุณควรพิจารณา การทดสอบอย่างรวดเร็วคือการใช้ข้อมูลทดสอบกับบิตที่สลับกันและดูว่าเกิดอะไรขึ้นกับอัตราเฟรมของคุณ


3
ใช่ในการทดสอบครั้งแรกของฉันมีศูนย์จำนวนมากในส่วนของข้อมูลและ ID หลังจากที่ฉันตรวจสอบให้แน่ใจว่าไม่มีเลขศูนย์ 5 ต่อเนื่องในข้อมูลหรือ ID ตอนนี้ฉันสามารถรับ940เฟรม / วินาทีใกล้กับขีด จำกัด ที่คำนวณได้ ขอบคุณมากสำหรับคำตอบที่ดี
Penghe Geng

1

แลงมีคำอธิบายของเขาเกี่ยวกับการบรรจุบิตและวิธีการที่สามารถส่งผลกระทบเชิงลบต่อปริมาณงานในเชิงทฤษฎีได้ อีกสิ่งหนึ่งที่สามารถลดทรูพุตที่เกิดขึ้นจริงจากทางทฤษฎีต่อไปคือความหน่วง แม้ว่าตัวควบคุม CAN ของคุณจะสามารถใช้งานบัสได้ 100% ตัวประมวลผลโฮสต์อาจไม่สามารถจัดการ Tx และ / หรือ Rx ในอัตรานั้นได้ นี่อาจเป็นผลมาจากตัวประมวลผลที่ช้าและ / หรือเฟิร์มแวร์ที่ไม่มีประสิทธิภาพซึ่งใช้ CAN สแต็ก


1

เฟรม 2.0a (มาตรฐาน) ที่เล็กที่สุดที่คุณสามารถสร้างได้คือ 47 บิต ... เฟรม 2.0b (ขยายเพิ่ม) ที่เล็กที่สุดที่คุณสามารถสร้างได้คือ 67 บิต ... รวมถึงระยะห่างระหว่างเฟรม 3 บิตและไม่รวมการบรรจุบิต ... ใน ทางทฤษฎีเราสามารถสร้างเฟรมที่ไม่มีวันจะได้ ในความเป็นจริงการบรรจุบิตจะเกิดขึ้นค่อนข้างมาก!

Baud สูงสุดสำหรับ CANBus 2.0a / b คือ 1Mbit
ที่ 1Mb / S บิตเดียว (เด่น / ถอย) คือ 1uS ยาวเช่น 0.000'001 S
ดังนั้นเฟรม 67 บิต [ตามทฤษฎีที่เล็กที่สุด 2.0b ] จะใช้เวลา 67uS ในการส่ง - ก่อนที่เฟรมอื่น (67 บิต) อาจถูกส่ง
1'000'000 / 67 ให้เฟรมสมบูรณ์ 14,925 เฟรม (เพิ่มอีก 25 บิตจากเฟรมถัดไป)

ในขณะที่คุณกำลังวิ่งที่ 1 / 8th ของความเร็วนั้นคุณจะได้รับ 1 / 8th ของแพ็กเก็ตมากที่สุด
14'925 / 8 = 1'865 เฟรม / วินาที @ 125Kb

เมื่อถึงเวลาที่คุณใช้ข้อมูล 64 บิต (8bytes) ทั้งหมดและการสันนิษฐานว่าคุณยังไม่ได้เรียกบิต "ข้อผิดพลาด" การบรรจุบิตโดยมีสตริงที่ต่อเนื่องกัน 1 หรือ 0
1'000'000 / (67 + 64) = 7'633
7 ' 633/8 = 954

และนั่นก็สมมติว่าการเดินสายของคุณสมบูรณ์แบบ รถบัสของคุณทำจากสายเคเบิล UTP 120 โอห์มและแยกประจุที่ปลายทั้งสองได้หรือไม่? หรือบางสายแบบสุ่มที่มีตัวต้านทาน 120ohm ข้ามปลายด้านหนึ่ง?

โดยรวมแล้วฉันว่าคุณทำได้ดีมากเพื่อให้ได้ 90% ของปริมาณงานสูงสุดทางทฤษฎี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.