แลกเปลี่ยนเมื่อพิจารณา SPI หรือ I2C


117

ฉันควรพิจารณาสิ่งใดบ้างเมื่อตัดสินใจใช้อินเทอร์เฟซ SPI หรือ I2C

คณะกรรมการฝ่าวงล้อม accelerometer / ไจโรนี้มีสองรุ่นหนึ่งแบบสำหรับแต่ละอินเตอร์เฟส หนึ่งจะง่ายกว่าที่จะรวมเข้ากับโครงการ Arduino?

http://www.sparkfun.com/products/11028

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


13
I2C และ SPI มีความแข็งแกร่ง I2C นั้นซับซ้อนกว่าในการตั้งค่าเมื่อคุณสามารถขยายได้อย่างมั่นคง (ตราบใดที่การเดินสายบัสของคุณไม่ใหญ่หรือยาวเกินไป) SPI นั้นง่ายต่อการติดตั้ง .. คุณสามารถ bitbang ได้อย่างง่ายดายถ้าต้องการ การขยายตัวกิน I / O พร้อมกับชิปทั้งหมดที่เลือก ถ้าฉันมีความหรูหราของ I / O และพื้นที่ตัวเชื่อมต่อและไม่จำเป็นต้องใช้บัสฉันจะไปกับ SPI เสมอ
Hans

I2C ซับซ้อนอย่างไร? ฉันใช้ทั้งสองบัสในไมโครไซต์ที่แตกต่างกัน (PIC ขนาดเล็กและ ARM ขนาดที่เหมาะสม) และในทุกกรณีการติดตั้ง I2C นั้นง่ายกว่า (เช่นลงทะเบียนน้อยกว่าในการเขียน) ถ้ามีอะไร SPI นั้นซับซ้อนกว่าเพราะมีขั้วสัญญาณนาฬิกาและตัวเลือกการสุ่มตัวอย่างข้อมูล
Armandas

6
@Armandas - ไม่มีทาง! SPI มีโหมดที่เป็นไปได้ 4 โหมดสำหรับขั้วสัญญาณนาฬิกา / ข้อมูลและสองโหมดใช้กัน - อุปกรณ์ SPI เกือบทั้งหมดอัปเดตเอาต์พุต MISO ของพวกเขาบนขอบของนาฬิกาและอ่านอินพุต MOSI บนขอบที่เพิ่มขึ้นของนาฬิกา คุณสามารถคิดได้ว่าจะดูแบบใดภายในหนึ่งนาทีโดยดูจากแผ่นข้อมูลจากนั้นคุณก็ทำเสร็จแล้ว หากคุณเลือกโหมดที่ไม่ถูกต้องโดยไม่ตั้งใจคุณจะเข้าใจได้อย่างรวดเร็วเมื่อคุณดูที่ร่องรอยของออสซิลโลสโคป ข้อผิดพลาดข้อมูล SPI นั้นหายากและไม่ทำให้คุณติดสถานะแปลก ๆ อย่างที่ I2C ทำ
Jason S

6
ฉันบอกว่า I2c นั้นซับซ้อนกว่าเพราะฉันเคยเขียนไดรเวอร์ I2C ที่ ARM ARM Proccesor ฉันติดตามเครื่องสถานะของเอกสาร NXP และมันก็ยาวประมาณ 20 รัฐ ฉันใช้เวลาพอสมควรในการหาคำตอบเมื่อไบต์สุดท้ายถูกอ่าน / เขียน ฯลฯ ฉันไม่เคยมีปัญหาเหล่านี้กับ SPI เพียงแค่ได้รับนาฬิกาและข้อมูลเรียงกัน
ฮันส์

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

คำตอบ:


98

สรุป

  • SPI เร็วขึ้น
  • I2C นั้นซับซ้อนกว่าและไม่ใช้งานง่ายถ้าไมโครคอนโทรลเลอร์ของคุณไม่มีคอนโทรลเลอร์ I2C
  • I2C ต้องการเพียง 2 บรรทัด

I2C เป็นระบบบัสพร้อมข้อมูลสองทิศทางในสาย SDA SPI เป็นการเชื่อมต่อแบบจุดต่อจุดที่มีข้อมูลเข้าและออกนอกเส้น (MOSI และ MISO)

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

NN+3N+2

เช่นเดียวกับ 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 มาก


7
ฉันยังไม่ได้พบไมโครคอนโทรลเลอร์ที่จัดการทุกกรณีมุมของ I2C ต้องจัดการการตรวจจับข้อผิดพลาดที่เหมาะสมและการกู้คืนในลักษณะที่สามารถใช้งานได้โดยไม่ต้องเป็นผู้เชี่ยวชาญ I2C ฉันเคยมีที่จะเลื่อนกลับลงมาจาก "มาร์ท" I2C ต่อพ่วงกับ bitbanging ชั่วคราวเพื่อจัดการกับกรณีพลาดนาฬิกาเมื่อ SDA จะถูกจัดขึ้นที่ต่ำซึ่งเป็น pain./ สมบูรณ์
เจสัน S

( แต่ +1 ตั้งแต่ผมเห็นด้วยกับส่วนที่เหลือของคำตอบของคุณ)
เจสัน S

มีแม้กระทั่งอุปกรณ์ I2C รอบ ๆ ที่ใช้งานที่ 3.4MHz แต่ฉันไม่แน่ใจว่าสามารถใช้งานร่วมกับอุปกรณ์ที่ช้ากว่าได้หรือไม่ (เนื่องจากอุปกรณ์ทั้งหมดต้องสามารถติดตามรถบัสได้) ฉันยังเชื่อว่าเวลาของ 3.4MHz I2C นั้นแตกต่างกันเล็กน้อย
ฮันส์

@Hans - HS I2C ดูเหมือนว่าจะเข้ากันได้กับอุปกรณ์ 400kbit ทั่วไป ตรงไปตรงมา (ไม่มีการวิจัยอย่างละเอียด) ฉันไม่เคยเห็นไมโครคอนโทรลเลอร์ที่รองรับ HS (ยัง) นั่นคือเหตุผลที่ฉันไม่ต้องการพูดถึงมัน
stevenvh

@stevenvh: การใช้งานสองสายของตัวควบคุม (เช่น Cypress PSOC) กำหนดให้ SCK อยู่ในระดับต่ำอย่างน้อยหนึ่งหรือสองรอบของนาฬิกาภายในก่อนที่พวกเขาจะสลักมันและจะทำงานผิดพลาดอย่างรุนแรง ฉันไม่รู้ว่าทำไมพวกเขาไม่สามารถตรวจจับและยืดเงื่อนไขการเริ่มต้น I2C โดยไม่มีพัลส์นาฬิการะบบ แต่พฤติกรรมดังกล่าวหมายความว่าเมื่อชิปดังกล่าวทำงานที่ความเร็วสัญญาณนาฬิกาต่ำระบบธุรกรรม I2C ทั้งหมดบนบัสต้อง วิ่งช้า) แม้แต่การทำงาน 400Khz ก็เร็วเกินไปสำหรับ PSOC ที่ทำงานที่ 3MHz
supercat

39

(แก้ไข: เพื่อให้ชัดเจนข้อกังวลหลายข้อต่อไปนี้เกี่ยวข้องกับความสมบูรณ์ของสัญญาณที่เกิดจากการใช้บอร์ด 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


5
ศาสนาของคุณไม่ชอบ IIC ไม่มีที่นี่ ทั้ง IIC และ SPI นั้นเก่งในสิ่งที่พวกเขาทำ การคัดค้านของคุณต่อ IIC ส่วนใหญ่มาจากการใช้งานอย่างไม่เหมาะสม IIC ควรพิจารณาเป็นออนบอร์ดเท่านั้นถึงแม้ว่าจะถูกใช้เป็นประจำในอุตสาหกรรมแหล่งจ่ายไฟสำหรับการควบคุมอุปกรณ์อัจฉริยะ หากคุณพบว่าคุณต้องการบัฟเฟอร์ IIC นั่นเป็นข้อบ่งชี้ที่แข็งแกร่งว่า IIC ไม่ใช่ทางออกที่เหมาะสม อย่างไรก็ตาม IIC ทำงานได้ดีมากสำหรับอุปกรณ์ความเร็วต่ำทั้งหมดบนกระดานเดียวกัน
Olin Lathrop

2
เกณฑ์ระดับตรรกะของ I2C ขึ้นอยู่กับ Vcc ดังนั้นคุณจะต้องระมัดระวังจริงๆถ้าคุณใช้ 3V / 3.3V และ 5V อุปกรณ์ในระบบเดียวกัน ไม่ผิด ขีด จำกัด ตรรกะ IIC อยู่ที่แรงดันไฟฟ้าคงที่ คุณสามารถผสมระบบ 5 V และ 3.3 V ได้เพียงเล็กน้อยโดยการลากเส้นเป็น 3.3 V เท่านั้น
Olin Lathrop

5
มันไม่ได้เป็นความเกลียดชังทางศาสนาของ I2C แต่เป็นสิ่งที่ไม่ชอบในทางปฏิบัติของ I2C คุณพูดถูกมันง่ายกว่ามากกับระบบออนบอร์ด ฉันจะใช้มันเมื่อมันสมเหตุสมผล แต่มันเพิ่มค่าใช้จ่ายซอฟต์แวร์และวิศวกรฮาร์ดแวร์จำนวนมากเพียงแค่ติดตั้งอุปกรณ์ I2C บนบอร์ดโดยไม่พูดถึงการแลกเปลี่ยนที่ทำให้เกิดปัญหาซอฟต์แวร์มาก
Jason S

3
IIC นั้นง่ายกว่าที่จะติดตั้งระบบไฟฟ้าและ SPI อาจจะง่ายกว่าเล็กน้อยในเฟิร์มแวร์ อย่างไรก็ตามทั้งคู่นั้นค่อนข้างง่ายและตรงไปตรงมาทั้งสองประการ
Olin Lathrop

2
@Olin - เกณฑ์ 1.5 V คงที่ดูเหมือนว่าจะถูกใช้ในอดีต แต่ตามข้อมูลจำเพาะรุ่นล่าสุดที่แน่นอนคือ 0.3 Vcc และ 0.7 Vcc ใบเสนอราคาจากข้อมูลจำเพาะนี้กล่าวถึง 1.5 V สำหรับอุปกรณ์รุ่นเก่า
stevenvh

16

กระดานฝ่าวงล้อมสำหรับอุปกรณ์ที่ 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 - ไม่แตกต่างกันมากนัก


3
อีกเหตุผลหนึ่งในการเลือก SPI ผ่าน I2C: เส้นทั้งหมดเป็นแบบทิศทางเดียวซึ่งทำให้สิ่งต่าง ๆ เช่นระดับเปลี่ยนระดับง่ายขึ้นเล็กน้อย
markrages

3
I2C นั้นง่ายกว่า SPI เหรอ! สิ่งเดียวที่เกี่ยวกับ I2C ที่ง่ายกว่าคือการเชื่อมต่อหากคุณสามารถเชื่อมต่อทุกอย่างเข้าด้วยกัน มิฉะนั้นความสมบูรณ์ของสัญญาณจะรุนแรงขึ้นใน I2C และการติดตั้งซอฟต์แวร์ที่มีประสิทธิภาพนั้นแข็งแกร่งกว่าใน I2C
Jason S

2
@ JasonS ฉันได้ทำโครงการซอฟต์แวร์ฝังตัวหลายสิบโครงการโดยใช้ I2C และไม่เคยพบปัญหาการล็อคที่คุณพูดถึงในโพสต์ของคุณ ฉันสามารถเข้าใจคุณไม่ชอบมันเนื่องจากประสบการณ์ที่ไม่ดีของคุณ ขณะนี้ฉันมีผลิตภัณฑ์ออกสู่ตลาดโดยใช้ I2C DAC เพื่อส่งสัญญาณเสียงในขณะที่อ่านบัฟเฟอร์ข้อมูลถัดไปจากการ์ด SD ผ่าน SPI ใช้งานได้ดี ฉันไม่สามารถใช้ SPI ได้ทั้ง DAC และการ์ด SD เนื่องจากฉันได้รับการโต้เถียงในรถบัสและเสียงก็พัง ไมโคร (อันต่ำสุด) มีเพียงหนึ่ง SPI และหนึ่งพอร์ต I2C
tcrosley

1
ฉันประทับใจที่คุณสามารถส่งสัญญาณเสียงไปยัง I2C DAC! (อัตรานาฬิกาสูงสุดคืออะไร) หากคุณใช้ IC ของออนบอร์ดกับการวิ่งระยะสั้นความน่าจะเป็นที่จะวิ่งเข้าล็อคมีขนาดเล็กมาก แต่ก็ยังมีอยู่ (และคุณจะไม่เคยพบเจอมันหากคุณเพิ่งเขียนข้อมูลไปยัง I2C มันต้องการให้คุณอ่านจากอุปกรณ์ที่ยินดีที่จะรอตลอดไปสำหรับสิ่งที่คิดว่าเป็นนาฬิกาที่ขาดหายไป / นาฬิกาเสริม)
Jason S

1
@ JasonS เสียงนั้นมีคุณภาพเสียงเพียง 8KHz - ฉันใช้ 128 us เพื่อขัดจังหวะเอาต์พุตแต่ละตัวอย่าง 16 บิต I2C ยังทำงานบนการขัดจังหวะของตัวเอง เวลาว่างใช้เพื่ออ่านข้อมูลจากการ์ด SD ข้อดีของการล็อคไม่เคยเกิดขึ้นกับการเขียน ยกเว้น ADC ฉันมักจะใช้ I2C สำหรับอุปกรณ์ส่งออก อย่างไรก็ตาม - คุณรู้หรือไม่ว่าอินเตอร์เฟซแบบอ่านอย่างเดียว (2 ปุ่ม, accelerometer และจอยสติ๊ก) ระหว่าง Wii ระยะไกลและ Wii Nunchuck (ซึ่งมีสายมากกว่า 3 ') คือ I2C ที่ 400 KHz? มีข้อมูลจำนวนมากบนเว็บที่แฮ็คอินเทอร์เฟซอุปกรณ์นี้
tcrosley

15

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

I2C ต้องการเพียง 2 บรรทัดโดยไม่คำนึงถึงจำนวนอุปกรณ์ที่คุณมี (ภายในขีด จำกัด แน่นอน) อย่างไรก็ตามความเร็วอยู่ในช่วงของ kHz (ปกติ 100-400kHz)

ปัจจุบันไมโครคอนโทรลเลอร์ส่วนใหญ่รองรับฮาร์ดแวร์สำหรับรถบัสทั้งสองคันดังนั้นทั้งสองจึงใช้งานได้ง่ายอย่างเท่าเทียมกัน


4
@ Jason: คุณดูเหมือนจะมีอคติต่อ IIC แต่มันไม่ยุติธรรมที่จะหลอกคนอื่นเพราะมัน ทั้ง IIC และ SPI นั้น "ง่าย" โดยที่แต่ละคนมีริ้วรอยเป็นของตัวเอง SPI ต้องการบรรทัดพิเศษซึ่งอาจไม่ใช่เรื่องง่าย IIC นั้นซับซ้อนกว่าเล็กน้อย แต่ก็ยังคงง่ายต่อการปรับใช้เฟิร์มแวร์ทั้งหมดซึ่งฉันได้ทำไปหลายครั้ง มันไม่ได้ใช้รหัสมากทั้งหมด ทั้งสองมีสถานที่และทั้งสองนั้นง่ายพอที่จะไม่เป็นปัจจัยสำหรับทุกคนที่รู้ว่าพวกเขากำลังทำอะไรอยู่
Olin Lathrop

5
@ Jason: ฉันเพิ่งตรวจสอบและรหัส IIC ทั่วไปของฉันสำหรับการติดตั้งเฟิร์มแวร์ของ IIC บน PIC 8 บิตเป็นเพียง 311 บรรทัดและอาจมากกว่าครึ่งหนึ่งของความคิดเห็นนั้น นั่นทำให้คุณได้รับส่วนต่อประสานกับโพรซีเดอร์ไปยัง IIC บัสในระดับของรูทีนสำหรับการเริ่มต้นวางรับหยุด ฯลฯ เรื่องใหญ่ โมดูลที่เรียกว่าการขับ EEPROM แบบง่าย ๆ คือ 272 บรรทัดอาจเป็น 1/2 ความคิดเห็นอีกครั้งและนั่นรวมถึงการจัดการระดับสูงบางอย่างเช่นข้อมูลเริ่มต้นอินเทอร์เฟซการดีบัก UART ฯลฯ นี่เป็นเรื่องเล็กน้อยที่เถียงว่า กว่า SPI ไม่มีจุดหมาย
Olin Lathrop

2
@Andrew Kohlsmith - 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
Connor Wolf

5
@FakeName คุณไม่ถูกต้อง ฉันใช้เวลา 13 ปีในการทำอุปกรณ์อิเล็กทรอนิกส์กำลังทางอุตสาหกรรม (เริ่มต้นและตรวจสอบขนาดใหญ่สามเฟส mtors เป็นสภาพแวดล้อมที่มีเสียงดังมาก) มันไม่เกี่ยวกับ SPI ความน่าเชื่อถือมากขึ้นมันเป็นเรื่องของการออกแบบระบบที่มีโหมดความล้มเหลวทั้งหมดที่วางแผนและคิดและมีตัวเลือกการกู้คืนในระบบที่จำเป็น ฉันไม่เคยเคยมีสัญญาณรบกวนฆ่า I2C ของฉัน (หรือ SPI สำหรับเรื่องนั้น) comms แต่ฉันยังไม่เคยอาศัยเฉพาะในการควบคุม I2C ที่จะทำทุกอย่างสำหรับฉัน มันเป็นเรื่องของการวางแผนและออกแบบไม่ใช่หนึ่งบัสจะดีกว่า
akohlsmith

2
@akohlsmith: Single-master I-slave แบบ Single-Master ควรจะแข็งแกร่งด้วย "bit-bang" master หากมีทาสหลายคนและอีกสองคน "สับสน" พร้อมกันในวิธีที่ต่างกันบัสอาจถูกล็อคอย่างไม่สามารถกู้คืนได้ (เช่นถ้าชิปหน่วยความจำสองตัวขึ้นไปที่เต็มไปด้วยศูนย์ทั้งคู่คิดว่าเจ้านายกำลังพยายามอ่าน ไม่มีการซิงค์จากนั้นแต่ละรุ่นจะปล่อย SDA ในช่วงเวลาที่อีกคนหนึ่งยืนยันเท่านั้นและไม่มีสิ่งใดที่ผู้ชำนาญจะทำให้รถบัสว่างจนกว่าจะสามารถขับรถ "สูง" ที่ทรงพลังเพียงพอที่จะขับทาสทั้งหมด
supercat

12

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 มีจำนวนมากที่จะแนะนำ


มี I2C รุ่นความเร็วสูงซึ่งอนุญาตให้ 1MHz I2C ปกติคือ 400kHz
ความต้านทาน

@TheResistance: ฉันรู้ว่า I2C ปกติคือ 400kHz แต่รุ่นนั้นมีสเป็คสูงถึง 1MHz สิ่งที่ฉันไม่รู้คือการระบุรุ่นที่เร็วกว่า
supercat

ตามข้อกำหนด 400kbps (ไม่ใช่ kHz ฉันใช้หน่วยผิดที่นั่น) คือโหมดเร็ว, 1Mbps คือโหมดเร็ว Plus และมีโหมดความเร็วสูงสูงสุด 3.4Mbps ความเร็วสูงพิเศษสูงถึง 5Mbps แต่เป็นทิศทางเดียว
ความต้านทาน

@TheResistance: ขอบคุณ ฉันไม่เคยได้ยินรุ่นต่อมา คุณหมายถึงอะไรโดย 'ทิศทางเดียว'? ฉันรู้ว่าความเร็วของการสื่อสารแบบทาส - โท - เอสพีอีสามารถทำได้เร็วกว่าแบบนายต่อทาสเพราะทาสรับประกันว่าจะได้รับนาฬิกาหลังจากนาย แต่ฉันไม่แน่ใจเกี่ยวกับแนวคิดที่เทียบเท่าสำหรับ I2C มีลิงค์?
supercat

ค้นหาข้อมูลจำเพาะที่นี่ ในหน้า 23 มีข้อความระบุว่า Ultra-fast สามารถใช้กับอุปกรณ์ที่ไม่ส่งข้อมูลกลับ (เขียนอย่างเดียว) หรือแม้แต่ ACK
ความต้านทาน

8

คำถามนี้ได้รับการสำรวจอย่างละเอียดในคำตอบที่ยอดเยี่ยมที่นี่ แต่บางทีอาจมีมุมมองอีกข้อหนึ่งสำหรับฉัน2 C ที่ฉันสามารถเสนอได้จากมุมมองของผู้ผลิตชิป

ผม2 interface ไฟฟ้าซีเป็นนักสะสมเปิด ตอนนี้หายใจและคิดถึงความหมาย ใช้ I 2 C ฉันสามารถออกแบบชิปที่ไม่เชื่อเรื่องแรงดันไฟฟ้าของบัส สิ่งที่ฉันต้องทำคือดึงสาย SDA ให้ต่ำถ้ามันทำให้ฉันพอใจและเปรียบเทียบแรงดันไฟฟ้าของ SCL และ SDA กับแรงดันธรณีประตูที่อ้างอิงพื้นดินซึ่งฉันสามารถเลือกได้ และถ้าฉันออกจากโครงสร้างการป้องกันด้านสูงตามปกติและแทนที่ด้วยโครงสร้างอื่นฉันสามารถสร้างชิปที่สามารถใช้ชีวิตของตัวเองโดยไม่เป็นอิสระจากส่วนที่เหลือของระบบ - SCL, SDA จะไม่ป้อนกระแสใด ๆ กับชิปของฉันและฉัน แน่นอนว่าจะไม่ป้อนกระแสใด ๆ ให้กับหมุดเหล่านั้น นั่นเป็นเหตุผลที่เป็นรถบัสที่ดีสำหรับนาฬิกาแบบเรียลไทม์และสิ่งอื่น ๆ ที่มีพลังงานต่ำเช่นนั้น


4

สิ่งหนึ่งที่ฉันไม่ได้เห็นได้กล่าวถึงในคำตอบอื่น ๆ คือ I2C รองรับเจ้านายหลายคนบนรถบัสเดียวกัน หากคุณต้องการการสื่อสารแบบสองทิศทางและไม่ต้องการใช้วิธีการลงคะแนนเลือกตั้ง I2C จะทำงานให้เสร็จ

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


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

0

ใช้โปรโตคอล SPI และเขียนบิตของคุณโดยตรงไปยังอุปกรณ์เมื่อใดก็ตามที่นาฬิกาซิงค์เพิ่มขึ้น วงจรลอจิก xnor สามารถใช้เพื่อจับคู่ที่อยู่ "โฮมเมด" จากหน่วยความจำเพื่อเลือกอุปกรณ์ที่ต้องการราวกับว่ามันเป็นอุปกรณ์ i2c

i2c กำลังรวมวงจร authorial ภายในรูปแบบของอุปกรณ์มาตรฐาน ... ฯลฯ นั้นซับซ้อนและแตกต่างกันด้วย spi คุณสามารถใช้หน่วยความจำ spi เพื่อแสดงวิดีโอบนหน้าจอ แต่ไม่ใช่ i2c

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