จะเกิดอะไรขึ้นถ้าฉันละเว้นตัวต้านทาน pullup บนบรรทัด I2C


33

เพิ่งทราบว่าข้อมูลและสายสัญญาณI 2 C (SDA และ SCL) ต้องมีตัวต้านทานแบบดึงขึ้น

ฉันได้สร้างนาฬิกาสองสามดวงโดยใช้ DS1307 RTC (ดูแผ่นข้อมูล ) ตามแผนผังด้านล่าง สังเกตว่าฉันได้ตัดตัวต้านทานแบบดึงขึ้นมาทั้งสองตัวแล้ว

แผนผังของนาฬิกาของฉันโดยไม่มีตัวต้านทานแบบ pullup บนบรรทัด I2C

นาฬิกาทั้งสองทำงานได้ดีหนึ่งในนั้นทำงานมานานกว่า 3 เดือนแล้ว เป็นไปได้อย่างไร? ไม่ว่าในกรณีใดฉันอยากรู้ว่า:

  1. จะเกิดอะไรขึ้นเมื่อละเว้นการดึงข้อมูลI 2 C

  2. การขาด pullups มีแนวโน้มที่จะสร้างความเสียหายให้กับไอซีทั้งสองในบอร์ดของฉันหรือไม่?

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

PS ฉันค้นหาเครือข่ายอินเทอร์เน็ตเพื่อค้นหาคำตอบ แต่สามารถหาบทความเกี่ยวกับการวัดขนาดการดึง

อัปเดต:ฉันใช้ Arduino IDE 1.03 และเฟิร์มแวร์ของฉันจัดการ RTC โดยใช้DS1307RTC Arduino lib (ผ่านฟังก์ชั่นRTC.read()และRTC.write()) lib นั้นจะใช้Wire.hเพื่อพูดคุยกับ RTC

อัปเดต 2:ด้านล่างเป็นชุดภาพขอบเขตที่ฉันถ่ายเพื่อช่วยอธิบายว่า I 2 C ทำงานอย่างไรโดยไม่มีการดึงจากภายนอก

ขอบเขตการยิง 1 ขอบเขตการยิง 2

อัปเดต 3 (หลังจากเพิ่ม I 2 C pullups):ด้านล่างเป็นชุดภาพช็อตขอบเขตอีกชุดที่ฉันถ่ายหลังจากเพิ่มตัวต้านทาน pullup (4K7) ที่เหมาะสมลงในบรรทัดI 2 C (บนบอร์ดเดียวกัน) เวลาที่เพิ่มขึ้นลดลงจากประมาณ 5 tos เป็น 290 ns ฉัน2 C มีความสุขมากตอนนี้

ขอบเขตการยิง 3 Scope shot 4


2
รหัสของคุณปิดการใช้งาน pullups บนหมุดเหล่านั้นหรือไม่?
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams ไม่มีการเอ่ยถึง SDA และหมุด SCD (18 & 19) โดยตรงในรหัสของฉัน ฉันจัดการ RTC โดยใช้DS1307RTC lib Arduino lib และฟังก์ชั่นของ RTC.read () และ RTC.write ()
Ricardo

lib นั้นจะใช้ Wire.h เพื่อพูดคุยกับ RTC
Ricardo

3
ใช่แน่นอนใช้ pullups ภายใน สังเกตเส้นโค้งแทนขอบคม
Ignacio Vazquez-Abrams

คำตอบ:


28

1) จะเกิดอะไรขึ้นเมื่อละเว้นการดึง I2C

จะไม่มีการสื่อสารบน I 2 C บัส เลย MCU จะไม่สามารถสร้างเงื่อนไขการเริ่มต้นI 2 C MCU จะไม่สามารถส่งที่อยู่ I 2 C ได้

สงสัยว่าทำไมมันใช้งานได้ 3 เดือน อ่านต่อ.

2) การขาด pullups มีแนวโน้มที่จะสร้างความเสียหายใด ๆ ของทั้งสองไอซีในบอร์ดของฉัน?

อาจจะไม่. ในกรณีนี้ (MCU, RTC ไม่มีอะไรอื่น) ไม่แน่นอน

3) เหตุใด MCU จึงสามารถสื่อสารกับอุปกรณ์ I 2 C slave ได้ตั้งแต่แรก I 2 C ต้องการตัวต้านทานแบบดึงขึ้น แต่พวกเขาไม่ได้รวมอยู่ในแผนผัง

อาจเป็นไปได้ว่าคุณเปิดใช้งาน pull-ups ภายในบน ATmega จากสิ่งที่ฉันอ่าน1 ATmega มี pull-ups ภายใน20kΩซึ่งสามารถเปิดใช้งานหรือปิดใช้งานจากเฟิร์มแวร์ 20kΩนั้นอ่อนแอเกินไปสำหรับการดึงI 2 C แต่ถ้ารถบัสมีความจุต่ำ (ขนาดเล็ก) และการสื่อสารช้าพอ20kΩก็ยังสามารถทำให้รถบัสทำงานได้ อย่างไรก็ตามนี่ไม่ใช่การออกแบบที่น่าเชื่อถือที่ดีเมื่อเทียบกับการใช้ตัวต้านทานแบบแยกส่วน

1ไม่ใช่ ATmega guy ด้วยตัวเอง

ปรับปรุง:ในการตอบสนองฉัน2 C รูปคลื่นซึ่งถูกเพิ่มใน OP
รูปแบบของคลื่นใน OP มีค่าคงที่เวลาเพิ่มขึ้นนานมาก นี่คือสิ่งที่ฉัน2 C รูปแบบของคลื่นมักจะมีลักษณะ

enter image description here

PIC18F4550, Vcc = + 5V, 2.2kΩ pull ups รูปคลื่นแสดงให้เห็นว่า SCL เวลาที่เพิ่มขึ้นของ SDA นั้นใกล้เคียงกัน ขนาดทางกายภาพของบัสอยู่ในระดับปานกลาง: อุปกรณ์ทาส 2 ตัวความยาว PCB ≈100มม.


ขอบคุณสำหรับคำตอบ! ใช่ ATmega มี pullups ที่ต้องเปิดใช้งานในกรณีของฉัน ฉันจะตรวจสอบรหัสและ libs ที่ฉันใช้อีกครั้งและวางกระดานผ่านขอบเขต ฉันหวังว่าจะล้างสิ่งต่าง ๆ เล็กน้อย
Ricardo

1
คุณอาจต้องการตรวจสอบอีกครั้งกับแผ่นข้อมูลของอุปกรณ์ทาสของคุณก่อน ถ้าฉันจำได้ถูกต้อง pullups ของ ATMega สามารถอยู่ที่ใดก็ได้ตั้งแต่ 30k-60k (ขึ้นอยู่กับ Vcc อุณหภูมิและปัจจัยอื่น ๆ อีกหลายอย่างคุณไม่สามารถพึ่งพามันได้จริงสำหรับการต้านทานที่เชื่อถือได้) คุณต้องการให้แน่ใจว่าคุณกำลังส่งกระแสที่เพียงพอให้กับทาสเพื่อให้แน่ใจว่ามีตรรกะที่ถูกต้อง 1. หากการต่อต้านมีขนาดใหญ่เกินไปอุปกรณ์ทาสของคุณจะไม่ได้รับกระแสมากพอและคุณจะอยู่ในจุดเดียวกับที่คุณอยู่ ตอนนี้
audiFanatic

4
@audiFanatic +1 BTW, IMO รวมถึงตัวต้านทานแบบดึงขึ้นในแผงฝ่าวงล้อมและการติดตั้งโดยค่าเริ่มต้นเป็นข้อผิดพลาด ลองนึกภาพว่าจะเกิดอะไรขึ้นถ้าใครบางคนมีบอร์ดฝ่าวงล้อมหลายอันบนรถบัส I2C คันเดียว การดึงขึ้นแต่ละครั้งมักจะ2.2kΩหรือมากกว่านั้น ตัวต้านทานแบบดึงขึ้นบนแผงแยกทั้งหมดจะปรากฏในแนวขนาน การดึงขึ้นแบบรวมจะกลายเป็นความแข็งเกินไปสำหรับ I2C [เพิ่มเติมเกี่ยวกับปัญหาที่อาจเกิดขึ้นที่นี่และที่นี่ ]
Nick Alexeev

2
@Ricardo นั่นไม่ใช่บัส I2C ที่มีความสุขในการถ่ายภาพขอบเขตของคุณ [การถ่ายภาพขอบเขตแรกใน OP] ฉันได้เพิ่มขอบเขตการยิงให้กับคำตอบของฉันด้วย
Nick Alexeev

3
บทความนี้มีรูปคลื่นสัญญาณของสัญญาณ i2c ที่ดีและไม่ดี: dsscircuits.com/index.php/articles/ …
ฟอร์ด

16

ไลบรารีที่คุณใช้และไลบรารีที่ขึ้นอยู่กับ (Wire) จะเปิดใช้งานการดึงข้อมูลภายในของ ATMega สิ่งเหล่านี้คือ pull-ups ที่อ่อนแอและในการใช้งานปกติจะเสริม pull-ups ภายนอก (ตัวต้านทานสองตัวขนาน) เนื่องจากความต้านทานสูงถึง 20k ถึง 70k จึงไม่ทำให้เกิดปัญหามากหากมีปัญหาภายนอกที่ใช้งานอยู่

จะเกิดอะไรขึ้นเมื่อละเว้นการดึง I2C

ตอนนี้ไม่มีตัวต้านทานภายนอกการดึงภายในที่อ่อนแอเป็นเพียงสิ่งเดียวที่ทำให้สายสูง ความเร็วของสาย i2c ของคุณขึ้นอยู่กับเลย์เอาท์บอร์ดของคุณความถี่ที่คุณเข้าถึงสัญญาณรบกวนจากภายนอก ฯลฯ อาจใช้งานได้ คุณโชคดี คุณมีพูลอัพไม่ใช่ที่คุณคาดหวัง

การขาด pullups มีแนวโน้มที่จะสร้างความเสียหายให้กับไอซีทั้งสองในบอร์ดของฉัน?

แม้จะไม่มี pull-ups ภายใน แต่การขาด pull-ups ใด ๆ ก็ไม่ทำให้ IC เสียหายทั้งคู่ บิลด์ภายในของอุปกรณ์ i2c SCl และ SDA เป็นเหมือนทรานซิสเตอร์ NPN พวกมันคือOpen Collectorซึ่งเป็นไดโอดควบคุมแบบสวิตช์ปัจจุบัน / เป็นหลัก

สิ่งสุดท้ายที่ควรทราบว่าการมี pull-ups ภายในเมื่อ ATMega ของคุณอยู่ที่ 5v และอุปกรณ์ i2c เป็นอุปกรณ์ 3.3v เท่านั้นอาจทำให้เกิดปัญหา หรือถ้าคุณมี pull-ups ภายในและตัวต้านทานภายนอกที่เชื่อมต่อกับ 3.3v หรือแรงดันไฟฟ้าอื่น ๆ ก็สามารถทำให้เกิดปัญหาได้เช่นกัน โดยพื้นฐานแล้วมันเป็นข้อผิดพลาดที่ไม่ได้ตั้งใจในไลบรารีลวด


4
+1 - You do have pull-ups, just not ones you expected.- ฉันเดาว่าคุณถูกจับ ขอบคุณ!
Ricardo

เพื่อให้คุณรู้ว่าฉันได้เพิ่มขอบเขตการยิงเล็กน้อยเพื่อช่วยให้ชัดเจนว่าเกิดอะไรขึ้นกับการตั้งค่าของฉัน
Ricardo

2
@ Ricardo yep, เห็นพวกมัน, เวลา 33khz หนึ่งในสามของความเร็วที่กำหนดต่ำที่สุดของ i2c และสัญญาณยังคงแย่มาก ที่ 100khz หรือ 400khz คุณจะไม่สามารถสื่อสารได้ สิ่งที่ยอดเยี่ยมคืออุปกรณ์ i2c จำนวนมากทำงานด้วยความเร็วเพียงเล็กน้อย เพียงจำที่ pullups ภายในสามารถเป็นได้ถึง 70k โอห์มต้านทาน I2C ทั่วไปคือ 4.7k
เดินผ่านไปผ่าน

8

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

อุปกรณ์บางอย่างอาจมีตัวต้านทานการดึงขึ้นบนชิปในช่วง 20K ถึง 100K โอห์มเพียงเพื่อยึดหมุดอินเทอร์เฟซในระดับที่ไม่ได้ใช้งานสูงเมื่อไม่ได้ใช้อินเตอร์เฟสI 2 C ในส่วน สำหรับอินเทอร์เฟซที่เรียบง่ายและสั้นตัวต้านทานการดึงเหล่านี้อาจเพียงพอที่จะให้กระแสที่จำเป็นในการดึงเส้นสูงในขณะที่นาฬิกาและ / หรือข้อมูลกำลังถูกส่งสัญญาณ

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

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


4

จะเกิดอะไรขึ้นเมื่อ I2C pullups เป็น ommited?

เป็นไปได้มากว่าบัส I2C จะไม่ทำงาน

การขาด pullups มีแนวโน้มที่จะสร้างความเสียหายให้กับไอซีทั้งสองในบอร์ดของฉัน?

ส่วนใหญ่ไม่น่า


3

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

การขาดแรงดึงไม่ควรทำให้ IC เสียหาย


หมุด I2C เป็นท่อระบายน้ำเปิด
Matt Young

1

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

แผนผัง

จำลองวงจรนี้ - แผนผังที่สร้างโดยใช้CircuitLab


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

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


1
ดีใจที่มันช่วย
audiFanatic

2
ไม่ว่าจะเป็นอุปกรณ์ที่ใช้ TTL หรือ CMOS ลอจิกไม่สำคัญ - TTL ปกติและเอาท์พุท CMOS ปกติจะดึงสัญญาณทั้งขึ้นและลง สัญญาณ I2C เป็นแบบ open-collector TTL หรือ (มีแนวโน้มมากกว่า) แบบ open-drain CMOS - ในทั้งสองกรณีทรานซิสเตอร์ที่จะดึงสัญญาณสูงจะหายไปจากช่วงเอาต์พุตของแหล่งสัญญาณดังนั้นตัวต้านทานแบบดึงขึ้นจึงจำเป็นต้อง ดึงสัญญาณสูง มีความเป็นไปได้ที่ไมโครคอนโทรลเลอร์จะมี pull-ups ภายในกับไพนต์เหล่านั้น
Peter Bennett

3
-1 อย่างที่ Peter Bennett พูดคำตอบนี้มากมายผิดปกติ การเรียกสัญญาณ TTL ว่า "open-drain" เป็นของแถม
Joe Hass

โปรดทราบว่ามีข้อดีในการทำ I2C ด้วย TTL คือคุณมักไม่ต้องการตัวแปลระดับเพื่อจัดการส่วนประกอบที่มีแรงดันไฟฟ้าที่แตกต่างกันที่ติดอยู่กับบัสเดียวกัน เพียงแค่ตั้งค่าแรงดันไฟฟ้า pullup กับแรงดันไฟฟ้าอินพุตยอมรับสูงสุดของชิปแรงดันไฟฟ้าต่ำสุดมีหลายครั้งที่เพียงพอกับ TTL ป้อนข้อมูลขั้นตอน บน CMOS นั่นมันใช้งานไม่ได้
Ben Voigt

@BenVoigt: ไม่ - การเรียก "การกำหนดค่า" ต้องมีตัวต้านทานแบบดึงขึ้น "TTL" ผิดเนื่องจากการจัดการนี้สามารถทำได้ทั้ง CMOS หรือ TTL และ DS1307 เป็นส่วน CMOS แผ่นข้อมูล Maxim ระบุไว้อย่างชัดเจนว่าเอาต์พุตเป็นท่อระบายน้ำแบบเปิดและไดอะแกรมบล็อกแสดง FET สำหรับเอาต์พุตเดียว
Peter Bennett

0

เมื่อฉันกัดปัง I2C ด้วยไมโครเป็นหลักที่ส่งสัญญาณนาฬิกาฉันสามารถขับ SCL ได้โดยไม่ต้องดึงออก

อย่างไรก็ตาม SDA ไม่จำเป็นต้องเป็น OC ด้วยการดึงเพื่อให้อุปกรณ์ทาสสามารถดึงลงและตอบสนองได้อย่างถูกต้อง

ความนับถือ

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