ฉันควรพิจารณาสิ่งใดบ้างเมื่อตัดสินใจใช้อินเทอร์เฟซ SPI หรือ I2C
คณะกรรมการฝ่าวงล้อม accelerometer / ไจโรนี้มีสองรุ่นหนึ่งแบบสำหรับแต่ละอินเตอร์เฟส หนึ่งจะง่ายกว่าที่จะรวมเข้ากับโครงการ Arduino?
ฉันควรพิจารณาสิ่งใดบ้างเมื่อตัดสินใจใช้อินเทอร์เฟซ SPI หรือ I2C
คณะกรรมการฝ่าวงล้อม accelerometer / ไจโรนี้มีสองรุ่นหนึ่งแบบสำหรับแต่ละอินเตอร์เฟส หนึ่งจะง่ายกว่าที่จะรวมเข้ากับโครงการ Arduino?
คำตอบ:
สรุป
I2C เป็นระบบบัสพร้อมข้อมูลสองทิศทางในสาย SDA SPI เป็นการเชื่อมต่อแบบจุดต่อจุดที่มีข้อมูลเข้าและออกนอกเส้น (MOSI และ MISO)
โดยพื้นฐานแล้วSPIประกอบด้วยการลงทะเบียนกะคู่ซึ่งคุณเก็บข้อมูลในการลงทะเบียนกะหนึ่งในขณะที่คุณเก็บข้อมูลจากที่อื่น โดยทั่วไปข้อมูลจะถูกเขียนเป็นไบต์โดยให้แต่ละครั้งที่ 8 พัลส์ต่อเนื่องกัน แต่นั่นไม่ใช่ข้อกำหนด SPI คุณสามารถมีความยาวของคำ 16 บิตหรือ 13 บิตได้ถ้าต้องการ ในขณะที่การซิงโครไนซ์ I2C ทำได้โดยลำดับการเริ่มต้นใน SPI มันทำโดย SS กำลังสูง (SS กำลังทำงานต่ำ) คุณตัดสินใจด้วยตัวคุณเองหลังจากที่มีสัญญาณนาฬิกาเป็นจำนวนเท่านี้ หากคุณใช้คำ 13 บิต SS จะสลักนาฬิกาสุดท้ายเป็นบิตหลังจาก 13 นาฬิกาพัลส์
เนื่องจากข้อมูลสองทิศทางอยู่ในสองบรรทัดแยกกันจึงง่ายต่อการเชื่อมต่อ
เช่นเดียวกับ tcrosley กล่าวว่า SPI สามารถทำงานที่ความถี่สูงกว่า I2C ได้มาก
I2Cนั้นซับซ้อนกว่าเล็กน้อย เนื่องจากเป็นรถบัสคุณจึงต้องการวิธีในการจัดการกับอุปกรณ์ การสื่อสารของคุณเริ่มต้นด้วยลำดับการเริ่มต้นที่ไม่ซ้ำกัน: data line (SDA) ถูกดึงต่ำขณะที่ clock (SCL) สูงสำหรับข้อมูลการสื่อสารที่เหลือจะได้รับอนุญาตให้เปลี่ยนเฉพาะเมื่อนาฬิกาต่ำ ลำดับการเริ่มต้นนี้ซิงโครไนซ์การสื่อสารแต่ละรายการ
เนื่องจากการสื่อสารรวมถึงการกำหนดแอดเดรสเพียงสองบรรทัดจึงจำเป็นสำหรับอุปกรณ์จำนวนเท่าใดก็ได้ (มากถึง 127)
แก้ไข
เห็นได้ชัดว่าสายข้อมูลเป็นแบบสองทิศทาง แต่ก็คุ้มค่าที่จะสังเกตว่านี่เป็นความจริงสำหรับสายนาฬิกา ทาสอาจยืดนาฬิกาเพื่อควบคุมความเร็วบัส สิ่งนี้ทำให้ I2C สะดวกน้อยลงสำหรับการเลื่อนระดับหรือการบัฟเฟอร์ (สาย SPI ในโหมดมาตรฐานเป็นแบบทิศทางเดียว)
หลังจากแต่ละไบต์ (ที่อยู่หรือข้อมูล) ถูกส่งผู้รับจะต้องตอบรับโดยวางชีพจรตอบรับใน SDA หากไมโครคอนโทรลเลอร์ของคุณมีอินเทอร์เฟซ I2C สิ่งนี้จะได้รับการดูแลโดยอัตโนมัติ คุณยังคงสามารถบิตได้ถ้าไมโครคอนโทรลเลอร์ของคุณไม่รองรับ แต่คุณจะต้องเปลี่ยนพิน I / O จากเอาท์พุทเป็นอินพุทสำหรับรับทราบหรืออ่านข้อมูลทุกครั้งยกเว้นว่าคุณใช้พิน I / O เพื่ออ่านและ หนึ่งสำหรับการเขียน
ที่ 400kHz มาตรฐาน I2C นั้นช้ากว่า SPI มาก มีอุปกรณ์ I2C ความเร็วสูงที่ทำงานที่ 1MHz ยังช้ากว่า 20MHz SPI มาก
(แก้ไข: เพื่อให้ชัดเจนข้อกังวลหลายข้อต่อไปนี้เกี่ยวข้องกับความสมบูรณ์ของสัญญาณที่เกิดจากการใช้บอร์ด I2C / SPI แบบบอร์ดต่อบอร์ดเนื่องจาก Olin ชี้ให้เห็นอย่างถูกต้อง)
หากคุณมีข้อ จำกัด ที่จะผลักดันคุณไปยังสายที่น้อยลง (เรามีโครงการหนึ่งที่มีตัวเชื่อมต่อที่ปิดผนึกอย่างแน่นหนาซึ่งการติดต่อเพิ่มเติมแต่ละรายการนั้นค่อนข้างแพง) หลีกเลี่ยง I2C เมื่อเป็นไปได้และติดกับ SPI
SPI นั้นค่อนข้างง่ายในการจัดการกับฮาร์ดแวร์และซอฟต์แวร์ ในฮาร์ดแวร์มีสองบรรทัดข้อมูลที่ใช้ร่วมกันคือ Master In Slave Out (MISO หรือ SOMI) และ Master Out Slave In (MOSI หรือ SIMO), นาฬิการ่วมที่สร้างโดย Master และเลือกหนึ่งชิปต่ออุปกรณ์ บรรทัด CS ต่ำลงรอบสัญญาณนาฬิกาและเลื่อนไปเป็นบิตอินพุตและเลื่อนเอาท์พุทบิตจนกว่าการทำธุรกรรมจะเสร็จสิ้น ณ จุดที่ CS บรรทัดสูง เมื่อสาย CS ของพวกเขาสูงอุปกรณ์ทาสจะไม่สื่อสาร: พวกเขาเพิกเฉยต่อสาย CLK และ MOSI และวาง MISO ของพวกเขาเข้าสู่สถานะความต้านทานสูงเพื่อให้คนอื่นใช้มัน
หากคุณมีไมโครคอนโทรลเลอร์ใช้อุปกรณ์ SPI หลายตัวและมีอุปกรณ์ต่อพ่วง SPI ในตัวให้ส่งเอาต์พุต CS ของไมโครคอนโทรลเลอร์ไปยังอุปกรณ์แยกส่งสัญญาณ (เช่น 74HC138) และควบคุมบรรทัดที่อยู่เพื่อเลือกอุปกรณ์ระหว่างธุรกรรม SPI คุณเขียนคำศัพท์ไปยังรีจิสเตอร์เพื่อจัดคิวเอาต์พุตและอ่านมันกลับมาหลังจากที่พิน CS ยกสูงขึ้น
เนื่องจากสัญญาณ SPI เป็นแบบทิศทางเดียวจึงสามารถถูกบัฟเฟอร์ใช้ข้ามสิ่งกีดขวางที่แยกด้วยตัวแยกดิจิตอลและสามารถส่งจากบอร์ดหนึ่งสู่อีกกระดานโดยใช้ไดรเวอร์บรรทัดเช่น LVDS สิ่งเดียวที่คุณต้องกังวลคือความล่าช้าในการแพร่กระจายไปกลับซึ่งจะ จำกัด ความถี่สูงสุดของคุณ
I2C เป็นเรื่องราวที่แตกต่างอย่างสิ้นเชิง ในขณะที่มันง่ายกว่ามากจากจุดเชื่อมต่อที่มีเพียงสองสาย SCL และ SDA ทั้งสองเส้นนี้เป็นเส้นสองทิศทางที่ใช้ร่วมกันที่ใช้อุปกรณ์ open-drain กับ pullup ภายนอก มีโปรโตคอลสำหรับ I2C ที่เริ่มต้นด้วยการส่งที่อยู่อุปกรณ์เพื่อให้สามารถใช้อุปกรณ์ได้หลายเครื่องหากแต่ละอันมีที่อยู่ของตนเอง
จากมุมมองของฮาร์ดแวร์เป็นเรื่องยากมากที่จะใช้ I2C ในระบบที่มีเสียงดังมาก ในการบัฟเฟอร์หรือแยกสาย I2C คุณต้องหันไปใช้ไอซีแปลกใหม่ - ใช่มีอยู่ แต่มีไม่มาก: เราใช้หนึ่งต่อหนึ่งโครงการและตระหนักว่าคุณสามารถใช้ตัวแยกได้หนึ่งตัว แต่คุณไม่สามารถทำได้ ใช้สองชุดต่อไป - ใช้แรงดันไฟฟ้าหยดเล็ก ๆ เพื่อหาว่าด้านใดเป็นจุดสิ้นสุดของการขับขี่และสองซีรีย์หยดนั้นมีสองเท่า
เกณฑ์ระดับตรรกะของ I2C นั้นขึ้นอยู่กับ Vcc ดังนั้นคุณต้องระมัดระวังอย่างยิ่งหากคุณใช้อุปกรณ์ 3V / 3.3V และ 5V ในระบบเดียวกัน
สัญญาณใด ๆ ที่ใช้สายเคเบิลมากกว่าฟุตหรือสองต้องกังวลเกี่ยวกับความจุของสายเคเบิล ความจุ 100pf / เมตรไม่ได้ผิดปกติสำหรับสายเคเบิลหลายเซมิคอนดักเตอร์ สิ่งนี้ทำให้คุณต้องชะลอความเร็วบัสหรือใช้ตัวต้านทานแบบดึงด้านล่างเพื่อให้สามารถจัดการกับความจุพิเศษได้อย่างเหมาะสมและตอบสนองความต้องการด้านเวลาที่เพิ่มขึ้น
สมมติว่าคุณมีระบบที่คุณคิดว่าคุณออกแบบมาอย่างดีและคุณสามารถจัดการกับปัญหาความสมบูรณ์ของสัญญาณส่วนใหญ่และเสียงรบกวนนั้นหาได้ยาก (แต่ยังคงมีอยู่) คุณต้องกังวลเรื่องอะไร
มีเงื่อนไขข้อผิดพลาดมากมายที่คุณต้องเตรียมพร้อมในการจัดการ:
อุปกรณ์สลาฟไม่ยอมรับไบต์ที่เจาะจง คุณต้องตรวจจับสิ่งนี้และหยุดและเริ่มลำดับการสื่อสารใหม่ (ด้วย SPI คุณมักจะสามารถอ่านข้อมูลที่คุณส่งกลับหากคุณต้องการให้แน่ใจว่าได้รับข้อมูลโดยไม่มีข้อผิดพลาด)
คุณกำลังอ่านข้อมูลจำนวนหนึ่งจากอุปกรณ์ทาสและอุปกรณ์นั้นถูก "สะกดจิต" เนื่องจากเสียงรบกวนบนสายนาฬิกา: คุณได้ส่ง 8 นาฬิกาที่จำเป็นเพื่ออ่านไบต์นั้น แต่เนื่องจากเสียงอุปกรณ์ทาสคิดว่า ได้รับ 7 นาฬิกาและยังคงส่งสัญญาณ 0 บนสายดาต้า หากอุปกรณ์ได้รับสัญญาณนาฬิกาที่ 8 มันจะปล่อยสายข้อมูลสูงเพื่อให้นายสามารถเพิ่มหรือลดสายข้อมูลเพื่อส่งบิต ACK หรือ NACK หรือต้นแบบสามารถส่งเงื่อนไขหยุด (P) แต่ทาสยังคงยึดสายข้อมูลอยู่ในระดับต่ำรอให้นาฬิกาอีกอันไร้ประโยชน์ หากต้นแบบไม่พร้อมที่จะลองนาฬิกาเพิ่มเติมบัส I2C จะติดอยู่ในการหยุดชะงัก ในขณะที่ฉันใช้ไมโครคอนโทรลเลอร์หลายตัวที่จัดการกับเงื่อนไข ACK / NACK ปกติ
กรณีที่น่ากลัวจริง ๆ คือเมื่อต้นแบบกำลังเขียนข้อมูลไปยังอุปกรณ์ทาสหนึ่งและทาสอีกคนตีความที่อยู่อุปกรณ์ไม่ถูกต้องและคิดว่าข้อมูลที่ส่งนั้นมีความหมายสำหรับมัน เรามีอุปกรณ์ I2C (ตัวขยาย I / O) ที่บางครั้งมีการตั้งค่าการลงทะเบียนไม่ถูกต้องเนื่องจากสิ่งนี้ แทบเป็นไปไม่ได้ที่จะตรวจพบกรณีนี้และเพื่อให้เกิดเสียงรบกวนคุณต้องตั้งค่าการลงทะเบียนทั้งหมดเป็นระยะดังนั้นหากคุณพบข้อผิดพลาดนี้อย่างน้อยก็จะได้รับการแก้ไขหลังจากช่วงเวลาสั้น ๆ (SPI ไม่เคยมีปัญหานี้ - หากคุณมีความผิดพลาดในสาย CS มันจะไม่คงอยู่เป็นเวลานานและคุณจะไม่ได้รับข้อมูลที่อ่านโดยอุปกรณ์ทาสผิดโดยไม่ตั้งใจ)
เงื่อนไขเหล่านี้จำนวนมากสามารถจัดการได้อย่างถูกต้องในโปรโตคอลหากมีการตรวจจับข้อผิดพลาด (รหัส CRC) แต่อุปกรณ์บางอย่างมีสิ่งนี้
ฉันพบว่าฉันต้องสร้างซอฟต์แวร์ที่ซับซ้อนในอุปกรณ์หลัก I2C ของฉันเพื่อจัดการกับเงื่อนไขเหล่านี้ ในความคิดของฉันมันไม่คุ้มค่าหากไม่มีข้อ จำกัด ในการเดินสายบังคับให้เราใช้ I2C และไม่ใช่ SPI
กระดานฝ่าวงล้อมสำหรับอุปกรณ์ที่ SparkFun เป็นจริงสำหรับรุ่น I2C เท่านั้น (MPU-6500) รุ่น MPU-6000 มีทั้งอินเตอร์เฟส SPI และ I2C บนชิปตัวเดียวกันและฉันไม่เห็นว่า SparkFun มีบอร์ดที่มีชิปนั้น ดังนั้นฉันเชื่อว่าคุณ จำกัด การใช้ I2C หากคุณต้องการใช้บอร์ดนั้น แต่ฉันจะแนะนำให้ใช้ I2C ต่อไปในสถานการณ์ของคุณด้วยเหตุผลดังต่อไปนี้
โดยทั่วไปแล้วคุณจะพบว่าบัส I2C นั้นใช้งานง่ายกว่าจากมุมมองของฮาร์ดแวร์มากกว่าบัส SPI I2C เป็น 2 สายบัส (SCL / SDA):
SCL – Serial clock.
SDA – Serial data (bidirectional).
SPI เป็นบัส 4 สาย (SCLK / MOSI / MISO / CS):
SCLK– Serial clock.
MOSI – Master-out, Slave-in. Data from the CPU to the peripheral.
MISO – Master-in, Slave out. Data from the peripheral back to the CPU.
CS – Chip select.
คุณสามารถเชื่อมต่ออุปกรณ์ต่าง ๆ กับบัส I2C หนึ่งบัส อุปกรณ์แต่ละชิ้นมีชิปแอดเดรสอยู่ในตัว ที่อยู่จะถูกถ่ายทอดผ่านบัสเป็นไบต์แรกของทุกคำสั่ง (พร้อมกับบิตอ่าน / เขียน) สิ่งนี้พร้อมกับค่าใช้จ่ายอื่น ๆ ต้องการบิตเพิ่มเติมที่จะส่งผ่านบัส I2C และ SPI สำหรับฟังก์ชันการทำงานเดียวกัน
อุปกรณ์ประเภทต่าง ๆ (หน่วยความจำ I / O, LCD ฯลฯ ) มีช่วงที่อยู่ต่างกัน อุปกรณ์บางอย่างซึ่งมักใช้มากกว่าหนึ่งครั้งในระบบ (เช่นตัวขยาย PCF8574 I / O) ใช้ที่อยู่หนึ่งบรรทัดหรือมากกว่า (AD0-2 สำหรับ PCF8574) ซึ่งสามารถเชื่อมโยงสูงหรือต่ำเพื่อระบุบิตต่ำ ของที่อยู่ MPU-6500 มีที่อยู่หนึ่งบรรทัดดังกล่าว (AD0) ดังนั้นจึงสามารถใช้สองบรรทัดในระบบเดียวกัน
นอกจากนี้คุณยังสามารถมีอุปกรณ์หลายชิ้นบนบัส SPI แต่อุปกรณ์แต่ละเครื่องจะต้องมีสายเลือกชิป (CS) ของตัวเอง ดังนั้นคำอธิบาย 4-wire เป็นบิตของการเรียกชื่อผิด - มันเป็นอินเตอร์เฟสแบบสามสาย + หนึ่งสายเพิ่มเติมต่ออุปกรณ์ ฉันไม่ได้มีประสบการณ์กับบอร์ดซีรีย์ Arduino แต่ฉันเชื่อว่านี่จะทำให้การใช้ SPI ยุ่งยากมากขึ้นใน Arduino เพราะถ้าคุณต้องการชิพจำนวนมากเลือกบรรทัดสิ่งนี้จะเริ่มยุ่งยากกับการกำหนดพินทั่วไปที่ใช้โดยโล่ต่างๆ .
ฉันเชื่อว่าบอร์ด Arduino ส่วนใหญ่ทำงานที่ 5 โวลต์โดยบางอันใหม่กว่าทำงานที่ 3.3 โวลต์ MPU-6500 ทำงานที่ 3.3v หากแรงดันไฟฟ้าต่ำสุด "สูง" สำหรับบัส I2C บน 5v CPU คือ 3v หรือต่ำกว่าคุณสามารถหลีกเลี่ยงปัญหาการแปลงระดับโดยเพียงแค่ให้ 10K pullup resistors เป็น 3.3v บน 3.3 SCL และ SDA เนื่องจากบัสเปิด - สะสม ตรวจสอบให้แน่ใจว่ามีการปิดใช้งานการดึงภายใน 5v บน CPU
อย่างไรก็ตามฉันได้ตรวจสอบแผ่นข้อมูลสำหรับ ATmega2560 (โดยใช้ตัวอย่าง ADK 5v Arduino) และแรงดันไฟฟ้าสูง 'ขั้นต่ำ' ของอินพุตคือ 0.7 * Vcc หรือ 3.5v ซึ่งมากกว่า 3.3v ดังนั้นคุณต้องมีระดับการทำงานบางอย่าง การแปลง TI PCA9306ซึ่งต้องใช้ตัวต้านทานแบบพูลอัพทั้งสองด้านของชิป 5v และ 3.3v มีราคาเพียง 78 เซ็นต์ในปริมาณเดียว
เหตุใดจึงเลือก SPI ผ่าน I2C สาเหตุหลักมาจาก SPI สามารถทำงานได้เร็วกว่ามาก - มากถึง 10 MHz ในบางกรณี โดยทั่วไปแล้ว I2C นั้น จำกัด ไว้ที่ 400 KHz แต่นี่ไม่ใช่ปัญหาสำหรับ accelerometer MPU-6050/6000 เนื่องจากมันทำงานที่ 400 KHz สำหรับ I2C และเพียง 1 MHz สำหรับ SPI - ไม่แตกต่างกันมากนัก
โดยทั่วไป SPI เป็นบัสที่เร็วขึ้น - ความถี่สัญญาณนาฬิกาอาจอยู่ในช่วง MHz อย่างไรก็ตาม SPI ต้องการอย่างน้อย 3 บรรทัดสำหรับการสื่อสารแบบสองทิศทางและเลือกทาสเพิ่มเติมสำหรับแต่ละอุปกรณ์บนรถบัส
I2C ต้องการเพียง 2 บรรทัดโดยไม่คำนึงถึงจำนวนอุปกรณ์ที่คุณมี (ภายในขีด จำกัด แน่นอน) อย่างไรก็ตามความเร็วอยู่ในช่วงของ kHz (ปกติ 100-400kHz)
ปัจจุบันไมโครคอนโทรลเลอร์ส่วนใหญ่รองรับฮาร์ดแวร์สำหรับรถบัสทั้งสองคันดังนั้นทั้งสองจึงใช้งานได้ง่ายอย่างเท่าเทียมกัน
I2C is designed for on-board applications.
- ผู้ผลิตอุปกรณ์ I2C ไม่เห็นด้วยกับคุณ ใช้TMP100 หน้าผลิตภัณฑ์ระบุอย่างชัดเจน: The TMP100 and TMP101 are ideal for extended temperature measurement in a variety of communication, computer, consumer, environmental, industrial, and instrumentation applications.
สิ่งนี้เป็นจริงสำหรับTMP75
SPI สามารถทำงานได้เร็วกว่า I2C มาก (อุปกรณ์ SPI บางรุ่นมีความเร็วมากกว่า 60MHz ฉันไม่ทราบว่าข้อมูลจำเพาะ I2C "เป็นทางการ" อนุญาตให้อุปกรณ์มากกว่า 1MHz) การใช้งานอุปกรณ์ทาสโดยใช้ทั้งสองโปรโตคอลต้องการการสนับสนุนฮาร์ดแวร์ในขณะที่ทั้งคู่อนุญาตให้ติดตั้งโทปัง "ซอฟต์แวร์บิต - ปัง" ได้ง่าย ด้วยฮาร์ดแวร์ที่ค่อนข้างน้อยเราสามารถสร้างทาสที่สอดคล้องกับ I2C ซึ่งจะทำงานได้อย่างถูกต้องแม้ว่าโฮสต์อาจตัดสินใจที่จะเพิกเฉยต่อบัสได้ไม่เกิน 500us ต่อครั้งโดยไม่จำเป็นต้องใช้สายจับมือเพิ่มเติม อย่างไรก็ตามการดำเนินการ SPI ที่เชื่อถือได้แม้จะมีการสนับสนุนฮาร์ดแวร์โดยทั่วไปต้องการให้เพิ่มการจับมือกันหรืออื่น ๆ ที่โฮสต์ "ด้วยตนเอง" เพิ่มการหน่วงเวลาหลังจากแต่ละไบต์เท่ากับเวลาตอบสนองที่เลวร้ายที่สุดของทาส
ถ้าฉันมี druthers ของฉันการสนับสนุน SPI ของคอนโทรลเลอร์จะมีคุณสมบัติพิเศษบางอย่างเพื่อให้การถ่ายโอนข้อมูลแบบสองทิศทาง 8 บิตโปร่งใสระหว่างตัวควบคุมที่มีการจับมือและความสามารถในการปลุกโดยใช้สายไฟทิศทางเดียวทั้งสาม (นาฬิกาและ MOSI [ต้นแบบ -out-slave-in] จาก master; MISO [master-in-slave-out] จาก slave) จากการเปรียบเทียบการสื่อสารที่มีประสิทธิภาพและเชื่อถือได้ระหว่างไมโครคอนโทรลเลอร์กับพอร์ต "หุ้น" SPI เมื่อตัวประมวลผลทั้งสองอาจล่าช้าอย่างอิสระสำหรับระยะเวลาโดยพลการต้องใช้สายไฟที่มากขึ้น (Chip-Select, Clock, MISO และ MOSI เพื่อเริ่มต้น ด้วยบวกรับทราบสายจากทาสหากทาสอาจเริ่มมีข้อมูลที่จะส่ง (เช่นเพราะมีคนกดปุ่ม) แล้วหนึ่งจะต้องใช้สายอื่นเป็น "ปลุก"
I2C ไม่ได้ให้ความสามารถทั้งหมดของ SPI ที่ "ปรับปรุง" ของฉันจะมี แต่มันมีความสามารถในการจับมือในตัวที่ SPI ขาดและในการใช้งานหลายอย่างมันสามารถถูกตัดให้ปลุกด้วยเช่นกันแม้ว่าต้นแบบจะเป็น ซอฟต์แวร์ bit-bang สำหรับการสื่อสารระหว่างโปรเซสเซอร์ดังนั้นฉันขอแนะนำ I2C อย่างมากให้กับ SPI ยกเว้นเมื่อต้องการความเร็วสูงกว่า SPI ที่สามารถจ่ายได้และการใช้พินพิเศษนั้นเป็นที่ยอมรับ สำหรับการสื่อสารระหว่างตัวประมวลผลที่ต้องการจำนวนพินต่ำ UART มีจำนวนมากที่จะแนะนำ
คำถามนี้ได้รับการสำรวจอย่างละเอียดในคำตอบที่ยอดเยี่ยมที่นี่ แต่บางทีอาจมีมุมมองอีกข้อหนึ่งสำหรับฉัน2 C ที่ฉันสามารถเสนอได้จากมุมมองของผู้ผลิตชิป
ผม2 interface ไฟฟ้าซีเป็นนักสะสมเปิด ตอนนี้หายใจและคิดถึงความหมาย ใช้ I 2 C ฉันสามารถออกแบบชิปที่ไม่เชื่อเรื่องแรงดันไฟฟ้าของบัส สิ่งที่ฉันต้องทำคือดึงสาย SDA ให้ต่ำถ้ามันทำให้ฉันพอใจและเปรียบเทียบแรงดันไฟฟ้าของ SCL และ SDA กับแรงดันธรณีประตูที่อ้างอิงพื้นดินซึ่งฉันสามารถเลือกได้ และถ้าฉันออกจากโครงสร้างการป้องกันด้านสูงตามปกติและแทนที่ด้วยโครงสร้างอื่นฉันสามารถสร้างชิปที่สามารถใช้ชีวิตของตัวเองโดยไม่เป็นอิสระจากส่วนที่เหลือของระบบ - SCL, SDA จะไม่ป้อนกระแสใด ๆ กับชิปของฉันและฉัน แน่นอนว่าจะไม่ป้อนกระแสใด ๆ ให้กับหมุดเหล่านั้น นั่นเป็นเหตุผลที่เป็นรถบัสที่ดีสำหรับนาฬิกาแบบเรียลไทม์และสิ่งอื่น ๆ ที่มีพลังงานต่ำเช่นนั้น
สิ่งหนึ่งที่ฉันไม่ได้เห็นได้กล่าวถึงในคำตอบอื่น ๆ คือ I2C รองรับเจ้านายหลายคนบนรถบัสเดียวกัน หากคุณต้องการการสื่อสารแบบสองทิศทางและไม่ต้องการใช้วิธีการลงคะแนนเลือกตั้ง I2C จะทำงานให้เสร็จ
ในระยะทางไกลกว่า CAN สามารถมีความสามารถเหมือนกันและแข็งแกร่งกว่า แต่ CAN เป็นโปรโตคอลแบบอะซิงโครนัสที่ต้องการการสนับสนุนฮาร์ดแวร์และตัวรับส่งสัญญาณดังนั้นจึงอาจไม่ใช่ตัวเลือกในระบบต้นทุนต่ำ
ใช้โปรโตคอล SPI และเขียนบิตของคุณโดยตรงไปยังอุปกรณ์เมื่อใดก็ตามที่นาฬิกาซิงค์เพิ่มขึ้น วงจรลอจิก xnor สามารถใช้เพื่อจับคู่ที่อยู่ "โฮมเมด" จากหน่วยความจำเพื่อเลือกอุปกรณ์ที่ต้องการราวกับว่ามันเป็นอุปกรณ์ i2c
i2c กำลังรวมวงจร authorial ภายในรูปแบบของอุปกรณ์มาตรฐาน ... ฯลฯ นั้นซับซ้อนและแตกต่างกันด้วย spi คุณสามารถใช้หน่วยความจำ spi เพื่อแสดงวิดีโอบนหน้าจอ แต่ไม่ใช่ i2c