วิธีแก้ไขการขัดแย้งกันของที่อยู่ I2C?


39

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

มีวิธีการเชื่อมต่ออุปกรณ์หลายเครื่องด้วยที่อยู่เดียวกันหรือไม่?

บางทีโมดูลการแปลที่อยู่ I2C บางประเภทกับแต่ละอุปกรณ์ที่มีที่อยู่ที่กำหนดค่าได้ดังนั้นฉันจึงสามารถกำหนดที่อยู่ของตัวเองให้กับแต่ละคนได้

คำตอบ:


24

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

อุปกรณ์ส่วนใหญ่มีฮาร์ดแวร์เฉพาะที่จัดการการสื่อสาร I2C นั่นคือ slave ACK อยู่ในฮาร์ดแวร์ดังนั้นคุณจึงไม่สามารถแฮ็คมันได้

สำหรับโมดูลการแปลคุณสามารถซื้อ PIC ของ $ 0.50 ด้วยรถบัส I2C 2 คันและเขียนโค้ดด่วนเพื่อให้พวกเขาทำหน้าที่เป็นนักแปลที่อยู่ฉันเดา


ขอบคุณ ใช่อุปกรณ์เหล่านี้มีที่อยู่ที่เลือก แต่ระหว่างที่อยู่สองแห่งเท่านั้นและฉันต้องการเชื่อมต่ออุปกรณ์มากกว่า 5 ตัวดังนั้นฉันจึงยังคงขัดแย้งกัน ฉันไม่เคยคิดที่จะใช้ PIC ว่าควรจะทำงาน ไม่มีชั้นวางที่ทำสิ่งนี้หรือไม่?
Simon P Stevens

11
NXP สร้างมัลติเพล็กเซอร์ / สวิทช์สำหรับ I2C คุณอาจจะสามารถทำสิ่งต่าง ๆ เหล่านั้นได้: ics.nxp.com/products/i2cmuxesตัวอย่างเช่นคุณสามารถสร้างสาขาย่อยย่อยของคุณได้ 3 กรณีแต่ละอุปกรณ์มี 2 อุปกรณ์ และใช้สวิตช์ตัวใดตัวหนึ่งของ NXP เพื่อให้บรรลุเป้าหมายของคุณ
ทำเครื่องหมาย

เยี่ยมมากนั่นเป็นสิ่งที่ฉันกำลังมองหา ฉันไม่รู้ชื่อ ขอบคุณ
Simon P Stevens

คำตอบนี้มีอายุ 7 ปีดังนั้นฉันเชื่อว่าน่าจะดีที่สุดในเวลาที่เสนอ สำหรับคนอื่นที่มาถึงตอนนี้ แต่คำตอบที่ใหม่กว่าบางคำตอบ (ปัจจุบันอยู่ในอันดับที่ต่ำกว่าในรายการ) เสนอวิธีการที่ดีกว่าที่อาจเกิดขึ้นบนพื้นฐานของส่วนประกอบที่ใหม่กว่าซึ่งขณะนี้อยู่ในตลาด
อิฐ

6

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

อุปกรณ์ I2C หลายตัวที่มีที่อยู่เดียวกัน

ตัวต้านทานบนสาย SDA สำหรับอุปกรณ์ที่ไม่ได้ใช้งานจะทำหน้าที่เป็นตัวดึงสำหรับบัสดังนั้นค่าที่แน่นอนจะขึ้นอยู่กับจำนวนอุปกรณ์ที่คุณมีและสิ่งที่ต้องการสำหรับบัสของคุณ ดังนั้นถ้าคุณเลือกตัวต้านทาน 10K ดังนั้นอุปกรณ์ที่ไม่ได้ใช้งาน 3 ตัวจะให้แรงดึง 3K3

ไดโอด schottky ให้ความมั่นใจว่าอุปกรณ์ยังสามารถดึงสาย SDA ต่ำพอเมื่อส่งข้อมูลกลับไปยังโฮสต์


ฉันขอขอบคุณที่คุณได้ติดตามและโพสต์สิ่งนี้ นี่เป็นวิธีที่ชาญฉลาดฉันมั่นใจว่ามันจะเป็นประโยชน์กับผู้อื่น
Simon P Stevens

ช่องที่ดีที่สามารถใช้กับแอพพลิเคชั่นบางตัวได้ ผมชอบมันมาก.
Harry Svensson

5

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


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

5

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

บัสสวิตช์มักมีลักษณะแปลกหนึ่งอย่างซึ่งไม่สำคัญสำหรับ I2C เนื่องจากใช้อุปกรณ์ open-drain: สวิตช์บัสมีความต้านทานต่ำเมื่อทำการรวมแรงดันใกล้ 0 (Vss) แต่ความต้านทานเพิ่มขึ้นอย่างมากเมื่อแรงดันเข้าใกล้ แหล่งจ่ายไฟ Vdd (นี่เป็นเพราะพวกเขาส่วนใหญ่ MOSFETs ที่มีแรงดันไฟฟ้าเกตที่แหล่งจ่ายไฟเมื่อพวกเขาเปิดดังนั้นเมื่อแรงดันไฟฟ้าที่เปลี่ยนวิธีการ Vdd, Vgs ที่มีอยู่จะต่ำกว่ามาก)


1
ลิงก์เสีย fairchildsemi.com/product-technology/bus-switchทำงานได้ดีขึ้น
florisla

4

ฉันมีเซ็นเซอร์แสงสี TCS3414 สองตัวที่ฉันต้องการเปรียบเทียบ (แพ็คเกจ FN และ CS ซึ่งมีตัวกรองต่างกัน) ที่อยู่ I2C นั้นถูกเดินสายแล้ว หลังจากดูว่าการทำงานของ I2C ในแง่ของ SCL (นาฬิกา) และ SDA (ข้อมูล) ดูเหมือนว่าการปิดสาย SDA จะป้องกันชิปจากการเริ่มต้นหรือหยุดบิตและทำให้มันหยุดนิ่ง ดังนั้นจึงใช้สวิตช์อะนาล็อก CMOS (4066B) เพื่อเปิดหรือปิดสาย SDA ไปยังแต่ละอุปกรณ์ สิ่งนี้ใช้งานได้ดีสำหรับการสลับระหว่างอุปกรณ์ทั้งสอง ฉันรู้ว่ามันเป็นแฮกและ PCA9548 จะดีกว่ามาก แต่ฉันไม่มีประโยชน์


จริงๆแล้วนี่ไม่ใช่การแฮ็กเลยและฉันขอเถียงว่านี่ควรเป็นคำตอบที่ยอมรับได้ ฉันเคยเห็นสิ่งนี้ใช้ในผลิตภัณฑ์เชิงพาณิชย์หลายอย่างและฉันไม่สามารถนึกถึงโซลูชันที่ดีกว่าได้ (เว้นแต่คุณจะไม่มี GPIO ให้ใช้งานและต้องการโซลูชัน I2C ที่บริสุทธิ์เช่น Mux เฉพาะของ I2C) อะนาล็อกที่ดีของ ol มีแบนด์วิดท์มากมายและราคาถูกบ้า
Jay Carlson

4

ขณะนี้มีคำตอบ - เทคโนโลยีเชิงเส้นมีรุ่น LTC4316 / 17/18 ของนักแปลที่อยู่ ค่อนข้างใหม่และความพร้อมใช้งานไม่แน่นอน


องค์ประกอบที่น่าสนใจมาก อุปกรณ์ I2C ส่วนใหญ่มี 2 ที่อยู่ที่แน่นอนและสิ่งนี้สามารถ LTC4316 อาจเป็นสองเท่าของที่อยู่ในราคาที่สมเหตุสมผล
Mehrad

4

ผู้ผลิตหลายรายเสนอ I2C บัสมัลติเพล็กซ์ - และสวิตช์ไอซี

mux สามารถเปิดใช้งานได้ครั้งละหนึ่งแชนเนล สวิตช์สามารถเปิดใช้งานหลายคนพร้อมกัน

ตรวจสอบตัวอย่างเช่นข้อเสนอของNXP , TIและแม็กซิม

สำหรับการทดลอง Adafruit มีคณะกรรมการ TCA9548a

หากคุณมีชิปเป้าหมาย 8 ตัวที่มีที่อยู่เหมือนกันให้เลือก MUX แบบ 8 ต่อหนึ่ง ก่อนเข้าถึงชิปเป้าหมายใด ๆ ให้กำหนดค่า MUX เพื่อเปิดใช้งานบัส I2C ที่ถูกต้อง

ข้อดี

  • ไม่ต้องเขียนโปรแกรม (เทียบกับวิธีไมโครคอนโทรลเลอร์)
  • สามารถรองรับคุณสมบัติ I2C และความเร็วที่คุณต้องการ (เทียบกับ mux แบบอะนาล็อก / ดิจิตอลบัสปกติ) ตัวอย่างเช่น MUX ปกติ (ไม่ใช่ I2C) จะไม่ส่งที่อยู่การโทรทั่วไปไปยังทุกช่องทาง

-1

ใช้ชิป demux ง่าย ๆ (เช่น 74HC139 afaik) และเชื่อมต่อ I2C CLK pin เข้ากับอินพุต (เนื่องจาก I2C CLK pin เป็นเอาต์พุตเท่านั้น) ใช้หมุด GPIO เพื่อควบคุมผลลัพธ์ที่ต้องการ จากนั้นหมุดข้อมูล I2C สามารถแบ่งปันระหว่างทาสทั้งหมดได้


6
SCL ไม่ได้เป็นเอาต์พุตเท่านั้น ทาสอาจยืดเวลาหากจำเป็นต้องทำให้ช้าลง
stevenvh

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