SPI หรือ I2C: ซึ่งใช้สำหรับบัสแบบ longish


36

ฉันใคร่ครวญโครงการที่ต้องใช้ AVR หลายเครื่องคุยกันผ่านบัส พวกมันจะแยกจากกันมากถึง 6 ฟุต

ดูเหมือนว่าทั้ง I2C และ SPI สามารถให้ micros หลายชุดสื่อสารบนรถบัส แต่ฉันไม่ได้เห็นอะไรที่พูดถึงว่าจะต้องใช้เวลานานเท่าใด มีใครลองเชื่อมต่อโปรโตคอลเหล่านี้ในระยะทางหลายฟุตหรือไม่?


ฉันใช้ I2C บัสผ่านสายเคเบิลในครั้งเดียว ในความเข้าใจย้อนหลังฉันควรใช้ CAN หรือ RS-485 แทน (มีไมโครคอนโทรลเลอร์ทั้งสองด้าน)
Nick Alexeev

คำตอบ:


19

ดังที่คนอื่น ๆ กล่าวว่า SPI และ I2C สามารถใช้งานได้ในระยะทางไกลตราบใดที่ตัวต้านทานแบบดึงขึ้นความถี่นาฬิกาและอื่น ๆ

ทางเลือกหลัก (ซึ่งจะทำให้ภูมิคุ้มกันเสียงที่ดีกว่า) มีRS485และCAN ทั้งสองใช้เส้นที่ต่างกันเพื่อลดปัญหาเสียงรบกวนและเหมาะกับความยาวของการส่งข้อมูลมากกว่า I2C หรือ SPI อย่างไรก็ตามฉันไม่คิดว่า AVR จะมีอุปกรณ์ต่อพ่วง CAN ในตัวซึ่งทำให้สามารถใช้งานได้ง่ายขึ้นมาก

ฉันจะบอกว่าสิ่งที่สำคัญที่สุดที่ควรพิจารณาเมื่อเลือกบัสคือเพื่อให้แน่ใจว่าโปรโตคอลที่คุณใช้สำหรับการสื่อสารระหว่างอุปกรณ์นั้นมีCRCหรือเทียบเท่าเพื่อให้คุณสามารถกำหนดได้ว่าได้รับข้อความอย่างถูกต้องหรือไม่ แพ็คเก็ต) เมื่อพิจารณาสิ่งนี้ยังมีประโยชน์ที่จะมีการตอบกลับประเภท ACK / NACK ซึ่งเป็นส่วนหนึ่งของโปรโตคอลเพื่อให้สามารถส่งข้อความที่เสียหายได้อีกครั้ง


ดูเหมือนว่าทั้งสองจะทำงาน ฉันกำลังคิดถึงโพรโทคอลเฉพาะเหล่านี้เป็นหลักเพราะ AVR ส่วนใหญ่สนับสนุนพวกเขาโดยกำเนิดโดยไม่ต้องเพิ่มส่วนประกอบเพิ่มเติม มิฉะนั้น RS485 หรือสามารถเป็นทางเลือกที่ดี
edebill

หากคุณไม่ได้ จำกัด อยู่ในแพ็คเกจผ่านรูเดียว ST ก็มีไมโครคอนโทรลเลอร์ STM32 และ STM8 ที่มีประสิทธิภาพพร้อม CAN, NXP มีไมโครคอนโทรลเลอร์ LPC17xx ที่หลากหลายและมีอีกไม่กี่เช่นกัน CAN กำลังกลายเป็นเรื่องธรรมดามากขึ้น (และราคาไม่แพง) ในไมโครคอนโทรลเลอร์
DrAl

1
มี AVR บางตัวที่มีตัวรับ CAN ในตัว แต่ก็เหมือนกับผู้ค้ารายอื่น ๆ มันอยู่ในชิปเซ็ตย่อย ๆ เท่านั้น
davr

1
Microchip มี PIC เพียงไม่กี่รูปที่มี CAN microchip.com/wwwproducts/Devices.aspx?dDocName=en010302 ฉันจะยอมรับว่าพวกเขาเป็นโปรแกรม "ขี้ขลาด" เล็กน้อยโดยเฉพาะในห้องสมุด C18 / C30 ของ Microchip ในการตรวจสอบรหัสเราได้ตรวจสอบรหัสห้องสมุดที่อ่านยากเนื่องจากรายละเอียดของการใช้งาน - บัฟเฟอร์การส่งที่ใช้เป็นบัฟเฟอร์การรับชื่อธงที่ตรงกันข้ามกับสิ่งที่พวกเขาเป็นตัวแทน แน่นอนว่าไม่ใช่สิ่งที่ฉันอยากจะแนะนำให้คนที่เพิ่งรู้จักพัฒนาไมโครคอนโทรลเลอร์
J. Polfer

2
CAN และ RS-485 เป็นแอปเปิ้ลและส้มจริงๆ สามารถกำหนดโปรโตคอลระดับบิตเช่นเดียวกับเลเยอร์ไฟฟ้าทางกายภาพ (PHY) RS-485 เป็นเพียงข้อมูลจำเพาะของเลเยอร์ทางกายภาพโดยไม่ได้ระบุอะไรเกี่ยวกับโปรโตคอล มันจะขึ้นอยู่กับคุณอย่างสมบูรณ์ในการค้นหาหรือใช้โปรโตคอลจริงที่อยู่ด้านบนของ RS-485 PHY CAN ได้รับการออกแบบมาสำหรับสภาพแวดล้อมที่มีสัญญาณรบกวนสูงซึ่งส่วนใหญ่จะใช้ในอุตสาหกรรมยานยนต์และอุตสาหกรรมการผลิต โปรโตคอลเป็นระบบส่งข้อความที่ค่อนข้างซับซ้อนและมีค่าใช้จ่ายสูงมาก (อัตราข้อมูลจริงต่ำ) แต่มีความสมบูรณ์ของข้อมูลสูง
Mark

10

หลายฟุตไม่น่ามีปัญหาแค่ใช้สายบิดถ้าทำได้ SPI นั้นง่ายต่อการบัฟเฟอร์ (ถ้าคุณต้องการ) มากกว่า I2C เนื่องจากสัญญาณ SPI นั้นเป็นทิศทางเดียวในขณะที่สัญญาณของ I2C นั้นอยู่บนสายที่ใช้ร่วมกัน

ไมโครคอนโทรลเลอร์ AVR สามารถจัดการโหมดทาส I2C และ SPI รวมถึงโหมดต้นแบบได้หรือไม่? (คุณต้องการทั้งคู่)


2
สายไฟบิด ไม่บิดข้อมูล I2C และสายสัญญาณนาฬิกา! ด้วย SPI นี่อาจเป็นปัญหาน้อยกว่า แต่ฉันจะไม่บิดสายสัญญาณเว้นแต่ว่ามันจะเป็นคู่ที่สมดุลในกรณีที่การบิดเป็นความคิดที่ดีมาก
Wouter van Ooijen

ไม่เคยพูดไม่เคย; ฉันจะใช้การมีเพศสัมพันธ์แบบ capacitive เล็กน้อย (เพราะบิด) ระหว่างข้อมูล + นาฬิกาทุกวันแทนการมีเพศสัมพันธ์แบบเหนี่ยวนำเล็กน้อยกับอุปกรณ์อิเล็กทรอนิกส์ที่มีเสียงดัง (เพราะไม่บิด)
Jason S

4
ขออภัยฉันไม่เห็นด้วยอย่างแน่นอน ในสถานะที่ 1 เส้นมีความต้านทานค่อนข้างสูง เห็นมันเสร็จแล้วเห็นว่ามันล้มเหลว ตัวเลือกที่ดีที่สุดคือการมีเส้นกราวด์กระแสต่ำระหว่างหรือดีกว่าทั้งสองด้านของเส้น I2C
Wouter van Ooijen

10

สำหรับ I2C ในระยะทางไกลคุณอาจต้องการค้นหาโซลูชัน "I2C bus repeater" โปรดทราบว่าระยะทางสูงสุดที่คุณอาจพบสำหรับการสื่อสาร I2C หรือ SPI นั้นส่วนใหญ่อ้างอิงถึงระยะทางบัสทั้งหมดและไม่ใช่ระยะห่างระหว่างสองโหนดในบัส

คุณอาจต้องการตรวจสอบ RS485 สำหรับปัญหาประเภทนี้ มันเป็นโปรโตคอลบัสแบบอนุกรมซึ่งสื่อสารผ่านสายต่างดังนั้นเมื่อใช้สายไฟบิดโอกาสลดเสียงรบกวนจะลดลง ด้วยระยะทางที่ไกลมาก ข้อเสียคือคุณจะต้องใช้ตัวเข้ารหัส RS485 IC เพิ่มเติม (เช่น MAX485, ไม่แพงมาก) ในวงจรของคุณ


RS485 เป็นวิธีที่ดีในการทำสิ่งนี้
สกอตต์เมอร์ฟี่

โปรดทราบว่า RS485 มีสองด้านที่แตกต่างจาก RS232 ที่ค่อนข้างอิสระนั่นคือระดับตรรกะทางกายภาพที่แตกต่างกันและมุมมอง Multimaster คุณสามารถเลือก + เลือกสิ่งเหล่านี้ได้เราได้ใช้ทั้งนักแปล LVDS และ RS485 กับ UART (RS232) สำหรับการจุดต่อจุดโดยไม่มีการเข้าสู่ส่วน multidrop ของ RS485
46499 Jason S

2
btw RS485 ไม่ใช่โปรโตคอล! มันกำหนดเลเยอร์ทางกายภาพเท่านั้น ต้องบอกว่าคุณสามารถใช้ SPI ผ่าน RS485 ได้แน่นอน !!! มันจะเป็นวิธีการที่เป็นระเบียบในการรักษาการสื่อสารในโหมด SPI หากจำเป็น (ฉันกำลังสันนิษฐานว่าอาจเชื่อมต่อกับ ADC ระยะไกลหรือคล้ายกัน) การใช้ SPI ผ่าน RS485 คุณจะต้องตรวจสอบอัตราการส่งสัญญาณการฆ่านั้นเข้ากันได้กับ SPI datarates ที่เสนอ
smashtastic

8

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

สำหรับโครงการของฉันฉันใช้โปรโตคอล SPI 3 สายที่ปรับเปลี่ยนเล็กน้อยและพบผลลัพธ์ที่น่าพอใจ ฉันส่งข้อมูลบิตแมปการแสดงผล (ซึ่งความเสียหายของข้อมูลเป็นครั้งคราวจะไม่ใช่เรื่องใหญ่) ที่ 10mbps และข้อมูลอื่น ๆ ที่ 2.5mbps โดยไม่ยาก


นี่เป็นคำตอบที่เก่ามาก แต่คุณจะบอกว่าระยะทางที่คุณส่งโปรโตคอล SPI ของคุณนั้นไกลแค่ไหน? (นั่นเป็นประเด็นของคำถาม ... )
Daniel Griscom

@DanielGriscom: โดยปกติแล้วจะมีความยาวประมาณ 3 ฟุตโดยการเดินสายที่ไม่น่าประทับใจ แต่บางครั้งก็นานกว่านั้น
supercat

6

ในขณะที่ทั้ง I2C และ SPI ได้รับการออกแบบมาสำหรับการลากระยะใกล้ (ไม่กี่นิ้ว) ทั้งสองสามารถใช้งานได้กับการลากอีกต่อไปด้วยสายเคเบิลที่เหมาะสมและการใส่ใจต่อความจุบัสโดยรวม

ในขณะที่ฉันมีประสบการณ์เล็กน้อยเกี่ยวกับ SPI แต่ I2C ก็ไม่ยากอย่างมากเพราะคุณจำเป็นต้องคำนวณขนาดที่เหมาะสมสำหรับตัวต้านทานแบบดึงขึ้นของคุณ นอกจากนี้ยังมีบัฟเฟอร์ I2C เฉพาะและราคาไม่แพงซึ่งค่อนข้างใช้งานง่าย อย่างไรก็ตามคุณจะต้องใช้ตัวต้านทานแบบดึงขนาดที่เหมาะสมสำหรับเครือข่ายของคุณ

ฉันใช้ I2C เป็นเครือข่ายระหว่าง AVR สองตัวที่ระยะ 8 ฟุตโดยใช้ตัวต้านทานแบบดึงขึ้นและสายเคเบิลบิดคุณภาพสูงที่มีการป้องกันที่ดี


คุณต้องระวัง w / I2C ด้วยสายเคเบิลแบบหลายเซมิคอนดักเตอร์ความจุอาจทำให้บัสช้าลงอย่างมาก
Jason S

6

อย่างที่หลายคนแนะนำไว้ I2C และ SPI นั้นใช้ดีที่สุดในระยะทางสั้น ๆ แม้ว่ามันจะเป็นไปได้ที่จะใช้วิธีแก้ปัญหาด้วยอินเทอร์เฟซเหล่านี้ แต่ฉันขอแนะนำให้คุณมองหาวิธีที่แตกต่างออกไปคือ "มาตรฐานที่มากขึ้น" (เช่น Ethernet, RS485, CAN, ฯลฯ ) - โดยเฉพาะอย่างยิ่งหากคุณวางแผนที่จะใช้สายเคเบิลเพื่อเข้าถึงระยะทาง 6 ฟุตระหว่างไมโครคอนโทรลเลอร์


6

เพียงแค่ FYI ส่วนต่อประสานระหว่างรีโมท Nintendo Wii ไร้สายและคู่หู Nunchuck นั้นใช้ I2C ผ่านสายเคเบิลที่มีความยาวประมาณ 3 ฟุต นอกจากนี้ยังมีสายเคเบิลยาว 3 ฟุตซึ่งขยายความยาวทั้งหมดเป็นประมาณ 6 ฟุต ไม่เหมือนกับการตั้งค่าของคุณ (เพียงสองอุปกรณ์ที่เชื่อมต่อกัน) แต่เป็นตัวอย่างของ I2C บนสายเคเบิลในผลิตภัณฑ์สำหรับผู้บริโภคที่ใช้กันอย่างแพร่หลาย


4

ฉันทำงานในโครงการที่เกี่ยวข้องกับ 80 AVR-based nodes ในเครือข่าย star ที่สื่อสารผ่าน I2C มันเป็นความยุ่งเหยิงโดยรวมและไม่ได้ผลในที่สุด การรับการอัปเดตไปยังโหนดทั้งหมดใช้เวลาไม่กี่วินาทีและการเชื่อมต่อที่ผิดพลาดเพียงครั้งเดียวจะทำให้เครือข่ายทั้งหมดไม่ทำงาน ล่าสุดฉันพูดกับคนที่สร้างโหนดเขาบอกว่าเขาหยุดใช้ I2C สำหรับโครงการเช่นนี้ น่าเสียดายที่ฉันไม่รู้ว่าทำไม I2C โดยเฉพาะนั้นไม่เพียงพอที่นี่


1
I2C ช้ากว่า SPI มาก ... มันอาจเป็นไปได้ว่าโครงการของคุณจัดการอนุญาโตตุลาการในกรณีที่มีการชนกัน ... หรือความจุอาจสูงพอกับโหนดเหล่านั้นทั้งหมดที่คุณต้องใช้อัตราสัญญาณนาฬิกาช้า
46499 Jason S

2

มันควรจะง่ายด้วยระยะทางสั้น ๆ นั้น สิ่งที่คุณสามารถทำได้คือหาระยะทางเหล่านั้นและการเดินสายเคเบิลของคุณในแง่ของความจุและความต้านทานของเส้นและดูว่าความถี่ (ขึ้น / ลงครั้ง) ชนิดใดที่คุณสามารถผ่านพวกเขา นอกเหนือจากบางจุดมันเป็นการดีที่สุดที่จะถือว่ามันเป็นสายส่ง หากดูไม่ดีคุณสามารถเปลี่ยนไปใช้สายอนุกรมอื่น ๆ เช่น EIA-232 หรือ 422 นั่นอาจหมายถึงชิปพิเศษที่ปลายทั้งสอง แต่จะยืดออกไปไกล หากคุณต้องการไปอย่างรวดเร็วและไกลคุณจะต้องมีอะไรมากกว่านี้ (อีเธอร์เน็ตอย่านับวิทยุหรือเลเซอร์ :)


2

หากคุณสามารถควบคุมความเร็วของนาฬิกาและคุณไม่ต้องการถ่ายโอนข้อมูลความเร็วสูงคุณควรพยายามที่จะทำให้นาฬิกาช้าลง สิ่งนี้จะทำให้ไวต่อเสียงรบกวนน้อยลง

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