ฉันสามารถใช้ I2C ผ่านสายเคเบิลยาว 2 มได้หรือไม่


24

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

คุณคิดว่าเป็นไปได้ไหมที่จะสื่อสารในโครงแบบนี้? ฉันควรค้นหาข้อมูลใดเพื่อให้แน่ใจว่าสามารถทำได้หรือไม่สามารถทำได้ คุณมีคำแนะนำไหม?

นี่เป็นครั้งแรกที่ฉันได้สื่อสารกับ IC นอก PCB


5
กรุณาเพิ่มข้อมูลเพิ่มเติม ความเร็วของ i2c คืออะไร ความต้านทานแบบดึงขึ้น? สายเคเบิลใช้แล้วและความจุ โฮสต์ MCU คืออะไรและเซ็นเซอร์คืออะไร แต่โดยทั่วไปแล้ว I2C ​​ทำงานได้ดีกว่าสายเคเบิลหลายอย่างเช่น HDMI ดังนั้นมันจึงควรทำงานเมื่อสิ่งต่าง ๆ ถูกต้อง
Justme


6
"ฉันไม่สามารถเลือกโปรโตคอลอื่นได้" คุณสามารถวางไมโครคอนโทรลเลอร์ตัวที่สองไว้ใกล้กับเซ็นเซอร์อ่านข้อมูลและส่งโปรโตคอลใด ๆ ที่คุณต้องการ
FooBar

1
คุณมีความเร็วขั้นต่ำเป็น kbit / s หรือไม่?
เสา

2
หากคุณชะลอนาฬิกาลงคุณสามารถไปได้ไกลพอสมควร
copper

คำตอบ:


36

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

เพื่อให้แน่ใจว่ามันจะทำงานได้คุณควรใช้ตัวขยายบัส I2C เช่น P82B715

อย่างไรก็ตามแผ่นข้อมูลของ PB2B715กล่าวว่าต่อไปนี้ในส่วน 8.2:

สำหรับคู่บิดทั่วไปหรือสายเคเบิลแบนที่ใช้สำหรับโทรศัพท์หรือ Ethernet (Cat5e) สายไฟ, ความจุที่มีอยู่ประมาณ 50 pF ถึง 70 pF / เมตรเพื่อให้สายเคเบิลสามารถในทางทฤษฎีจะขึ้นถึง 50 เมตรยาว จากประสบการณ์จริง30 ม. ได้พิสูจน์ความยาวสายเคเบิลที่ปลอดภัยเพื่อขับเคลื่อนด้วยวิธีง่าย ๆ นี้สูงสุด 100 kHzด้วยค่าที่แสดง ระยะทางไกลกว่าและความเร็วที่สูงขึ้นเป็นไปได้ แต่ต้องมีการออกแบบอย่างระมัดระวังมากขึ้น

ดังนั้นผู้เชี่ยวชาญ (NXP เป็นอดีตฟิลิปส์ผู้ประดิษฐ์ของ I2C) กล่าวว่า 30 เมตรได้รับการพิสูจน์แล้วว่าเป็นระยะทางที่ทำได้ ประสบการณ์ของฉันบอกว่า 2 เมตรเป็นระยะทางที่ทำได้และประสบการณ์ที่ได้รับรายงานกลับมาให้ฉันระบุว่ารถบัส I2C ที่โหลดหนักกว่าโดยไม่ต้องมีตัวขยายใด ๆ

จุดสำคัญในการใช้งานบัส I2C ในระยะทางไกลคือ:

  • การใช้สายเคเบิลความจุต่ำ (คู่บิด / Ethernet);
  • การ จำกัด ความเร็วบัส
  • มีพูลอัพที่มีขนาดที่ถูกต้อง

การคำนวณแบบพูลอัพ

Texas Instruments มีดีทราบโปรแกรมประยุกต์ (SLVA689) เกี่ยวกับการคำนวณดึงขึ้น

  • ขอบเขตล่างของ pullup (ค่าต่ำสุด) ถูกกำหนดโดยกระแสต่อพ่วงที่อ่อนแอที่สุดบนบัสสามารถดึงได้และแรงดันไฟฟ้าสูงสุดที่แทน 0 สำหรับอุปกรณ์ต่อพ่วงใด ๆ ดังนั้นถ้า 1V ยังคงเป็น 0 VCC ของคุณคือสูงสุด 3V6 และอุปกรณ์ที่อ่อนแอที่สุดของคุณสามารถดึงได้เพียง 20mA ความต้านทานของคุณจะถูกกำหนดโดยการสูญเสียแรงดันไฟฟ้าผ่านตัวต้านทานและอุปกรณ์ที่ดึงมาปัจจุบัน:\(3.6 V1 V) / 20 mA=130 Ω
  • ขอบเขตสูงสุดถูกกำหนดโดยเวลาเพิ่มขึ้นสูงสุด: ความถี่ I2C สูงสุดของคุณเกี่ยวข้องโดยตรงกับความถี่นั้น แต่ก็มีขีด จำกัด สูงสุดที่กำหนดโดยโปรโตคอล ขีด จำกัด บนเป็นC_b) โดยที่คือเวลาเพิ่มขึ้นสูงสุดและคือความจุบัส ดังนั้นหากเป็น 400pF และรถบัสที่มีการดำเนินงานในโหมดปกติ ( = 1 มิลลิวินาที) แล้วคุณจะพบ\ ใบสมัครของ TI มีกราฟเพื่อให้คุณสามารถค้นหาค่าที่เหมาะสมได้อย่างรวดเร็วRmax=tr/(0.8473Cb)trCbCbtrRmax=2950 Ω
  • แน่นอนว่าค่าของการดึงคือมูลค่าที่เท่ากันของพูลอัพทั้งหมดรวมกัน คุณอาจมีการดึงที่ปลายต้นแบบปลายทาสและทาสอื่น ๆ บนรถบัส
  • ยิ่งคุณเป็น "ขีด จำกัด " ยิ่งคุณต้องคำนึงถึง "ปรสิต" เช่นแรงดันไฟฟ้าตกที่สายเคเบิล

มีพูลอัพที่ปรับขนาดอย่างถูกต้องหรือไม่ วิธีการกำหนดค่าและการจัดอันดับพลังงาน?
Quantum0xE7

ดังที่Nick B แสดงความคิดเห็นในคำตอบอื่น ๆ โปรดระวังความเป็นไปได้ของชิปตัวขยายบัสหรืออะไรก็ตามที่ทำให้เซ็นเซอร์อุณหภูมิร้อนขึ้นสององศา
Peter Cordes

14

โดยทั่วไปคุณจะถูก จำกัด โดยความจุบัสสูงสุด 400 pF

มันควรจะทำงานได้ดีถ้าคุณลดความถี่ลงเหลือ 1 kHz และให้แหล่งจ่ายไฟ decoupling ถัดจากเซ็นเซอร์

ถ้าคุณต้องการบางสิ่งบางอย่างที่แข็งแกร่งมากขึ้นแล้วคุณสามารถใช้แปลง I2C ค่าที่ปลายทั้งสองเหมือนPCA9615


ฉันจำเซ็นเซอร์บางตัวที่มีความถี่ I2C ขั้นต่ำ (ไม่แน่ใจว่าทำไม)
ไมเคิล

14

คุณทำได้ แต่ไม่แนะนำ

รถบัสที่แตกต่างกันเพื่อวัตถุประสงค์ที่แตกต่างกัน

I2C เช่น SPI ออกแบบมาเพื่อการสื่อสารภายในบอร์ดหรือกลุ่มบอร์ด (คิดว่า Raspberry Pi และหมวกหรือ arduino และ shields ของมัน) มันสามารถทำงานในระยะทางไกลกว่า (ดูคำตอบอื่น ๆ ) แต่ไม่ควรใช้ในกรณีเหล่านั้นเพียงเพราะนั่นไม่ใช่สิ่งที่ได้รับการออกแบบปรับให้เหมาะสมและมีคุณสมบัติเหมาะสม

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

สิ่งที่คุณควรมองหาคือ Field Bus, เช่น 1-wire, CAN, RS-485, ethernet, เป็นต้น

ระบบไร้สายเช่นบลูทู ธ หรือ zigbee อาจเป็นตัวเลือก


9

ตามที่ระบุไว้โดย @filo, I2C โดยทั่วไปจะถูก จำกัด โดยความจุของบัส อย่างไรก็ตามมีวิธีแก้ไขปัญหาดังนี้:

  1. ใช้ตัวขยายบัส P82B96หรือPCA9600ทั้งสองจะเป็นตัวเลือกที่ดีในกรณีของคุณ
  2. หากคุณต้องการความเร็วสูงหรือสายเคเบิลยาวมากคุณสามารถใช้ตัวรับส่งสัญญาณ I2C ค่าเช่นPCA9600 อย่างไรก็ตามสิ่งนี้จะทำให้วงจรของคุณซับซ้อนมากขึ้นและคุณต้องมี IC ที่ปลายทั้งสองของสายเคเบิล

ลองดูที่AN10658และAN11084จาก NXP สำหรับข้อมูลเพิ่มเติม


1
สิ่งนี้จะทำงานได้ดีกับตัวขยายรถบัสตามที่คนอื่น ๆ พูด สิ่งที่มองไม่เห็นได้ในทันทีคือตัวขยายบัสที่ปลายเซ็นเซอร์สามารถกระจายความร้อนได้มากพอที่จะยกระดับเซ็นเซอร์วัดอุณหภูมิที่อ่านได้สองสามองศาหากเซ็นเซอร์และตัวขยายบัสอยู่ใกล้กัน
Nick B

4

ฉันชอบคำตอบของ filo และ Caleb

อีกทางเลือกหนึ่งคือการใช้สะพาน Master Master DS28E17 1-Wire-to-I2Cหนึ่งตัวหรือหลายตัวที่เซ็นเซอร์แต่ละตัวและต่อสายบัสเป็น Onewire เหมาะสำหรับรถบัสที่มีความยาวมากกว่า 100 เมตรและเหมาะสำหรับการใช้งานแอพพลิเคชั่นเซ็นเซอร์ความเร็วต่ำเช่นการกระจายอุณหภูมิและการจัดการแบตเตอรี่


ความคิดที่น่าสนใจแม้ว่ามันอาจจะแนะนำค่าใช้จ่ายซอฟต์แวร์เพิ่มเติมหากต้นแบบไม่มีอินเตอร์เฟส 1-Wire
Caleb Reister

ส่วนใหญ่จะเป็นตัวเลือกถ้าคุณมีโฮสต์ Linux เนื่องจากมีสแต็คไดรเวอร์เต็มสำหรับสตั๊นต์นี้ ใน Raspberry Pi คุณเพียงแค่ต้องเชื่อมต่อ GPIO4 กับอินพุต 1W ของ DS28E17 ผ่านสาย 100 เมตร (บวกกับ GND แน่นอน) แก้ไข config.txt และทำเสร็จแล้ว มันโปร่งใสอย่างเต็มที่ดูเหมือนว่าI²Cในพื้นที่ ช้าลง
Janka

ขอบคุณ ฉันประหลาดใจจริงๆที่ 1-Wire สามารถทำระยะทางแบบนั้นได้ ฉันเดาว่ามันสมเหตุสมผลแล้วเนื่องจากตัวต้านทานมีขนาดเล็กลง
domen

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