มีค่าความต้านทานที่ถูกต้องสำหรับตัวต้านทานแบบดึงขึ้น I2C หรือไม่


72

แผ่นข้อมูลของ 24LC256 EEPROM ระบุว่า:

บัส SDA ต้องการตัวต้านทานแบบ pull-up ต่อ VCC (ปกติ 10 kΩสำหรับ 100 kHz, 2 kΩสำหรับ 400 kHz และ 1 MHz)

ฉันคิดว่าตัวต้านทานใด ๆ ที่มีค่าkΩจะทำงานได้ (และดูเหมือนว่า EEPROM ของฉันจะทำงานได้ดีในความถี่ที่แตกต่างกันด้วยตัวต้านทาน 10 kΩ)

คำถามของฉันคือ:

  • มีค่าที่ถูกต้องสำหรับตัวต้านทานแบบดึงขึ้นหรือไม่
  • มีกฎหมาย / กฎในการกำหนดค่านี้หรือไม่?
  • ค่าความต้านทานต่างกันมีผลต่อบัสข้อมูลI²Cอย่างไร

ค่อนข้างเกี่ยวข้อง: electronics.stackexchange.com/q/76376/2028
JYelton

คำตอบ:


66

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

สูตรจากแผ่นข้อมูล ATmega168 (ซึ่งฉันเชื่อว่ามาจากสเป็คอย่างเป็นทางการของ I 2 C) คือ -

Freq<100kHzRmin=Vcc0.4V3mA,Rmax=1000nsCbus

Freq>100kHzRmin=Vcc0.4V3mA,Rmax=300nsCbus

Microchip 24LC256 ระบุความจุพินสูงสุดที่ 10pF (ซึ่งเป็นเรื่องปกติ) นับจำนวนอุปกรณ์ที่คุณมีในบัสขนานกันและใช้สูตรด้านบนเพื่อคำนวณช่วงของค่าที่ใช้งานได้

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

ฉันขายชุดคิทด้วย I 2 C RTC (DS1337) ฉันรวมตัวต้านทาน 4K7 ไว้ในชุดซึ่งดูเหมือนว่าเป็นการประนีประนอมที่สมเหตุสมผลสำหรับผู้ใช้ส่วนใหญ่


โดยทั่วไปแล้วฉันจะนึกภาพรถบัสที่จะไม่ได้ใช้งาน (ส่วนใหญ่) เป็นเวลาส่วนใหญ่ดังนั้นสำหรับแอปพลิเคชันแบตเตอรี่มีปัญหาสำคัญที่ต้องจัดการมากกว่าการพยายามเพิ่มประสิทธิภาพการดึง I2C เพียงอย่างเดียว: P
Nick T

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

14

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

ดังนั้นข้อมูลจำเพาะของ I2Cให้ค่าสูงสุดสำหรับตัวต้านทานแบบดึงขึ้นเป็นฟังก์ชันของความจุบัสสำหรับคลาสความเร็วสามระดับ:

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

ค่าต่ำสุดถูกกำหนดไว้ในฟังก์ชั่นของแรงดันบัสและควร จำกัด กระแสผ่านไดรเวอร์


3
3 ปีต่อมา Texas Instruments ได้เขียนบันทึกย่อของแอปพลิเคชันซึ่งค่อนข้างใกล้เคียงกับคำตอบนี้
Nick Alexeev

บทความ EDN: การคำนวณการออกแบบสำหรับการสื่อสาร I2C แข็งแกร่ง [ซ้อนเอกสารอ้างอิง]
Nick Alexeev

11

มีช่วงของค่าที่ถูกต้องอย่างไรก็ตามมันยากที่จะอธิบายว่าช่วงนั้นคืออะไร โดยทั่วไป 10k ทำงาน

เอาต์พุตดิจิตอลมีความสามารถในการระบุแหล่งที่มาหรือจมในปัจจุบัน หากเอาต์พุตของคุณสามารถจมได้ 5 mA และเอาต์พุตเชื่อมต่อผ่าน pull-up ถึง 5 V แล้วตั้งค่าเป็น 0 คุณจะต้องมีความต้านทานขั้นต่ำ 1k หากคุณใช้น้อยกว่า 1k เอาท์พุทจะไม่สามารถจมกระแสพอที่จะดึงพินจนถึง 0V หากคุณใช้ค่าที่มากขึ้นเช่น 10k ดังนั้นหมุดจะต้องจม 0.5 mA ซึ่งน้อยกว่าการจัดอันดับ

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

เมื่อใช้เอาต์พุตดิจิตอลที่สามารถจมและแหล่งกำเนิดกระแส ("ไดรเวอร์โทเท็มโพล", "ไดรเวอร์แบบผลักดึง") คุณอาจถูกล่อลวงให้ไม่ใช้ตัวต้านทานแบบดึงขึ้นหรือดึงลง อย่างไรก็ตามมันเป็นเรื่องสำคัญมากที่จะไม่อนุญาตให้อินพุตของ CMOS ลอยหรือสามารถดึงกระแสที่มากเกินไป ... และมันง่ายมากที่จะลืมว่าขาของ MCU แบบสองทิศทางนั้นมักจะเป็นอินพุต!


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

หากมีการตั้งค่า / เวลาพักที่คุณไม่ได้รับอนุญาตให้ละเมิดเหล่านั้นจะช่วยให้คุณกำหนดค่าคงที่เวลา RC ความจุของบัสส่วนใหญ่จะถูกกำหนดโดยโครงร่าง PCB ดังนั้นคุณสามารถเลือกค่า R ที่รวมเข้ากับ C เพื่อให้ค่าที่สะดวกสบายภายในเวลาการตั้งค่า / พักสำหรับอินพุตดิจิตอลของคุณ


7

ค่า pull-up ต่ำ (ความต้านทานต่ำกว่า) สามารถปรับปรุงขอบของการเปลี่ยนสัญญาณ แต่บางครั้งอาจแข็งเกินไป - หากอุปกรณ์บนบัสไม่สามารถจมกระแส pull-up คุณจะได้รับตรรกะ 'ต่ำ' ซึ่งไม่จริง ซึ่งอาจทำให้เกิดข้อผิดพลาดในการสื่อสาร (และเจ็บปวดมาก)

ฉันจะไปกับความต้านทานแบบดึงขึ้นสูงสุดที่ให้การสื่อสารที่เชื่อถือได้กับคุณ


5

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


2

ปัญหาที่ฉันยังไม่ได้กล่าวถึงคือการใช้พลังงาน หากมีการใช้แหล่งจ่ายไฟ 3.3 โวลต์ตัวต้านทาน 3.3K ลงกราวด์จะสิ้นเปลืองกระแส 1mA (3.3mW ของกำลังไฟ) เมื่อใดก็ตามที่เอาต์พุตต่ำ การใช้ตัวต้านทาน 10K จะลดทั้งกระแสและกำลังไฟลงได้สามระดับ หากจะมีการสื่อสารจำนวนมากบนบัส I2C การใช้พลังงานนั้นอาจกลายเป็นส่วนสำคัญของการระบายพลังงานโดยรวมโดยเฉพาะอย่างยิ่งถ้าบัสอาจนั่งในระดับต่ำเป็นระยะเวลานาน ตัวอย่างเช่นหากมีการอ่าน 100 ไบต์ / วินาที แต่หลังจากอ่านแต่ละไบต์บัสจะถูกทิ้งไว้พร้อมกับอุปกรณ์ที่ส่งบิตแรกของไบต์ถัดไปและไบต์เหล่านั้นส่วนใหญ่มี MSB ที่ชัดเจนบัสอาจใช้ 90% ของ เวลาที่มี SCL และ SDA ต่ำ ขึ้นอยู่กับสิ่งที่ระบบกำลังทำอยู่นั่นคือการเพิ่มพลังดึงดูด

เพื่อประหยัดพลังงานการเชื่อมต่อตัวต้านทานแบบ "ดึงขึ้น" กับขา I / O แทนที่จะเป็น VDD ในขณะที่ฉันไม่ได้เห็นการใช้งานฮาร์ดแวร์ I2C ให้การสนับสนุนเรื่องนี้การมีข้อมูลเอาต์พุตหลักบนพิน I / O แยกต่างหากที่เชื่อมต่อกับรถบัสผ่านตัวต้านทานแทนที่จะใช้ไดรเวอร์ open-collector และตัวต้านทานแบบดึงขึ้นคงที่จะหลีกเลี่ยง สิ้นเปลืองกระแสไฟเมื่อเจ้านายต้องการเอาท์พุท "0" นอกจากนี้หากต้นแบบกำลังจะออกจาก SCK ต่ำในระยะเวลาหนึ่งโดยไม่สนใจว่ามีอะไรใน SDA ต้นแบบอาจปิดใช้งานการดึงขึ้นจนกว่าจะพร้อมสำหรับการสื่อสารเพิ่มเติม หากอุปกรณ์ใดไม่จำเป็นต้องใช้การยืดนาฬิกาต้นแบบสามารถใช้เอาต์พุตโดยตรงสำหรับ SCK และไม่ต้องกังวลกับการดึงขึ้นบนสายนั้น

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



-1

นี่คือรูปคลื่นสำหรับ 400kiloBits / วินาที (200KHz 101010 รูปแบบของคลื่น) RC คือ 4.7K โอห์มและ 212pF ค่า RC ช่วยให้การจับคู่ 2 TAU

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


คำตอบนี้ผิด นาฬิกา 200 kHz ให้ 200 kb / s ไม่ใช่ 400 เฉพาะขอบที่เพิ่มขึ้นเท่านั้นที่ได้รับผลกระทบจากความต้านทานแบบดึงขึ้น พล็อตดูสับสนเกือบจะเหมือนว่ามีการมอดูเลตเกิดขึ้นบ้าง ปริมาณทางกายภาพและหน่วยของพวกเขาถูกเขียนด้วยช่องว่าง (หรือพื้นที่บาง) ในระหว่าง เอกภาพเป็นสัญลักษณ์ไม่ใช่ตัวย่อ
venny

@venny นี่เป็นรูปแบบของคลื่นทั่วไปสำหรับรถบัสที่วิ่งเร็วเกินไปในเวลาที่กำหนด ด้วยการตกตะกอน 2 TAU เท่านั้นจึงไม่มีสัญญาณแบนราบกับรูปคลื่นดังนั้น "การปรับแบบบางอย่าง"; นี่เป็นรูปแบบหลอกหลอกความแปรปรวนของการทรุดตัวจะเห็นได้ชัดมาก อ่านข้อมูลเกี่ยวกับ "data eye" ในที่สุดนาฬิกา 200KHz มีสูงถึง 2.5uS และต่ำเป็น 2.5uS; ระยะเวลา 2.5uS เป็นข้อมูล 400KHz ที่ฉันพูดถึง
analogsystemsrf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.