ที่อยู่ทาส I2C ไม่ได้รับการยอมรับ (บางครั้ง)


11

ฉันพยายามสื่อสารกับ FRAM (FM24C04 จาก Ramtron) ที่เชื่อมต่อจากระยะไกลโดยใช้ I2C หน่วยความจำนี้ถูกฝังอยู่ในบอร์ดที่สามารถเสียบและถอดออกได้ตลอดเวลาถึง / จากระบบ (การสื่อสารถูกยกเลิกอย่างเหมาะสมก่อนที่จะลบหน่วยความจำ)

ปัญหาคือ: หลังจากใส่การ์ดที่มีเฟรมบางครั้งก็ไม่ยอมรับที่อยู่

การวัดสัญญาณ

ฉันวัดสัญญาณเพื่อดูว่าเกิดอะไรขึ้นและดูเหมือนว่าการกำหนดเวลาจะใช้ได้ในทั้งสองกรณี (ทำงานและไม่ทำงาน)

การสื่อสาร I2C ที่ถูกต้อง (อ่าน 3 ไบต์): ป้อนคำอธิบายรูปภาพที่นี่

ที่อยู่ I2C FRAM ไม่ได้รับการยอมรับ (ที่อยู่สลาฟถูกส่งอย่างถูกต้อง): ป้อนคำอธิบายรูปภาพที่นี่

การทำงานได้ดำเนินการแล้วเพื่อแก้ไขปัญหานี้ (ไม่สำเร็จ)

  • เพิ่มความล่าช้าหลังจากใส่การ์ดที่มี FRAM ในตัวเพื่อให้แน่ใจว่าลำดับพลังงานนั้นได้รับการเคารพ
  • I2C หยุดการสร้างหลังจากการตรวจจับสลาฟแอดเดรสไม่ได้รับการยอมรับ

การกำหนดค่าบัส I2C

  • ต้นแบบหนึ่ง (ไมโครคอนโทรลเลอร์ STM32F205 จาก ST)
  • สามทาส (EEPROM 24AA1025 จาก Microchip, RTC DS1339C จาก Maxim IC และ FRAM FM24C04 ระยะไกลจาก Ramtron
  • ตัวเปลี่ยนระดับ I2C หนึ่งตัว (MAX3373E จาก Maxim IC) ใช้เพื่ออนุญาตการสื่อสารระหว่างต้นแบบและ FRAM
  • ตั้งค่าความถี่บัสเป็น 100 kHz

แก้ไขแล้ว (2013-04-17)

ประการแรกขอขอบคุณทุกท่านสำหรับความคิดเห็นของคุณ

เนื่องจากมีข้อเสนอแนะมากมายนี่คือคำอธิบายของการสืบสวนที่ฉันได้ทำไป

แผนงาน

ภาพต่อไปนี้แสดงแผนผังแบบเรียบง่ายของบัส I2C:

แผนผังบัส I2C

สัญญาณ I2C_SDA และ I2C_SCL เชื่อมต่อโดยตรงกับไมโครคอนโทรลเลอร์และสัญญาณ FRAM_SDA และ FRAM_SCL เชื่อมต่อกับ FRAM โปรดทราบว่าสัญญาณ SDA และ SCL ที่เชื่อมต่อกับ FRAM จะถูกกรองโดยใช้เฟอร์ไรต์ BLM18 จาก Murata

FRAM เชื่อมต่อดังนี้:

  • NC (ขา 1) -> ไม่ได้เชื่อมต่อ
  • A1 (พิน 2) -> GND
  • A2 (พิน 3) -> GND
  • VSS (พิน 4) -> GND
  • SDA (พิน 5) -> FRAM_SDA
  • SCL (พิน 6) -> FRAM_SCL
  • WP (พิน 7) -> GND (ไม่ป้องกันการเขียน)
  • VDD (พิน 8) -> + 5V

คำอธิบายการ์ด FRAM

การ์ดใบนี้เป็นการ์ด "ISA like" ที่ฝังเฉพาะ FRAM

สืบสวน

ชะลอความถี่

ฉันทดสอบด้วยชุดความถี่ SCL ที่ 50kHz และ 10kHz ฉันวัดสัญญาณ SCL ด้วยออสซิลโลสโคปเพื่อให้แน่ใจว่าเป็นไปตามความถี่ที่คาดหวัง

การแก้ไขเหล่านี้ไม่สามารถแก้ปัญหาได้ ฉันตรวจสอบการกำหนดเวลาและอยู่ในข้อมูลจำเพาะของแผ่นข้อมูล FRAM

มั่นใจลำดับพลังงาน

@jippie

  1. ตัวเปลี่ยนระดับ I2C นั้นอยู่ในโหมดสถานะสามโหมดก่อนที่จะใส่การ์ดที่ฝัง FRAM ไว้ สัญญาณ FRAM_SDA และ FRAM_SCL ถูกดึงต่ำ
  2. หลังจากใส่ "การ์ด FRAM" แล้วจะมีการเพิ่มการหน่วงเวลา 100ms เพื่อให้แน่ใจว่าแหล่งจ่ายไฟมีเสถียรภาพ (อย่างน้อย 11ms ที่จำเป็นก่อนที่จะเริ่มเงื่อนไขแรกตามแผ่นข้อมูล)
  3. ตัวเปลี่ยนระดับ I2C ถูกเปิดใช้งาน
  4. เพิ่มการหน่วงเวลา 1ms เพื่อให้แน่ใจว่าตัวเปลี่ยนระดับ I2C ถูกเปิดใช้งานและดึงบรรทัดขึ้น (~ 4us ต้องการโดยแผ่นข้อมูล) สัญญาณ FRAM_SDA และ FRAM_SCL ถูกดึงขึ้นมา
  5. เข้าถึงเฟรมได้แล้ว

สัญญาณ FRAM_SDA และ FRAM_SCL ถูกวัดหลังจากแต่ละขั้นตอน

ปัญหายังคงเกิดขึ้น

หยุด / เริ่มเงื่อนไขแทนที่จะเริ่มซ้ำ

@gbarry

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

น่าเสียดายที่วิธีนี้ไม่สามารถแก้ปัญหาได้

ความคิด

ปัญหานี้เกิดขึ้นเฉพาะหลังจากที่การ์ดที่ฝังการเชื่อมต่อ FRAM ฉันใช้งานการเข้าถึงการอ่านที่ประสบความสำเร็จหลายพันครั้ง (การระบุที่อยู่และการอ่านของทาส) หลังจากใส่ "การ์ด FRAM" และใส่อย่างถูกต้อง

มันฟังดูสำหรับฉันมากขึ้นเรื่อย ๆ เช่นปัญหาฮาร์ดแวร์ แต่ฉันไม่รู้ว่ามันจะเกี่ยวข้องกับ I2C shifter level หรือกับ slaves อื่น ๆ บน I2C bus

คุณมีความคิดหรือคำแนะนำอื่น ๆ หรือไม่?


แก้ไข (2013-04-18)

ดูเหมือนว่าปัญหาจะได้รับการแก้ไข

ฉันเปลี่ยนขั้วต่อโมดูล FRAM และหาวิธีการวัดโดยตรงบน FRAM ดูเหมือนว่าทุกอย่างจะทำงานได้ดีกับตัวเชื่อมต่อใหม่นี้

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


คุณช่วยโพสต์แผนผังได้ไหม? ลองใช้ความถี่บัสที่ช้าลงเพื่อดูว่ามันสร้างความแตกต่างหรือไม่
Suirnder

มีปัญหาเกิดขึ้นหลังจากการแทรกและไม่ใช่เวลาอื่นเท่านั้นหรือไม่ "หลังจาก" เร็วแค่ไหน?
Kaz

นอกเหนือจากการทดสอบอื่น ๆ คุณสามารถลองลบทาสอื่น ๆ และดูว่ามีผลต่อพฤติกรรมหรือไม่
Ben Gartner

หมุดที่อยู่สองตัวถูกดึงต่ำหรือลอยไปทางซ้ายหรือไม่
fm_andreas

@Suirnder ฉันโพสต์แผนผังไว้ในคำตอบของฉัน
johsey

คำตอบ:


6

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

ก่อนเริ่มต้นฮาร์ดแวร์ Master I2C ให้ตั้งค่า SDA เป็นอินพุตและทดสอบ SDA ต่ำ

ถ้ามันอยู่ในระดับต่ำให้ตั้ง SCL pin high

จากนั้นสลับขา SCL ต่ำและสูงจนกว่า SDA จะสูง (เช่นออกบิตที่เหลือที่อุปกรณ์ต่อพ่วงอาจยังคงพยายามส่ง) สิ่งนี้ไม่สามารถใช้เวลามากกว่า 8 รอบนาฬิกา - หากเป็นเช่นนั้นจะมีปัญหาอื่น ๆ

ฉันไม่สามารถรับประกันได้ว่าสิ่งนี้จะแก้ปัญหาของคุณได้ แต่มันก็แก้ปัญหาของฉันได้!


ไม่ใช่ความคิดที่ดีที่จะเพิ่ม "อัลกอริทึมการกู้คืนบัส" นี้ก่อนเริ่มต้นแบบ ฉันจะใช้มัน ขอขอบคุณ.
johsey

2

สำหรับ FRAM:

  • เชื่อมต่อ GND และ Vcc เป็นอันดับแรก
  • จากนั้นตรวจสอบให้แน่ใจว่า A1, A2 และ WP มีระดับที่ถูกต้อง
  • จากนั้นเชื่อมต่อพินข้อมูล

การเชื่อมต่อพินอื่นนอกเหนือจากแหล่งจ่ายไฟก่อนที่ชิปจะเปิดขึ้นอาจทำให้เกิดปัญหา


2

ดูเหมือนว่า 10k จะค่อนข้างใหญ่สำหรับ pullups ของคุณและขอบนำของคุณดูช้า ลดตัวต้านทานไปที่ประมาณ 3k และดูว่าจะช่วยได้หรือไม่

นอกจากนี้ทำไมแรงดันไฟฟ้านอกกับเวลา?


ฉันลดตัวต้านทานแบบ pull-up เป็น 3.3k และนั่นก็ไม่ได้ช่วยอะไร ฉันไม่รู้เกี่ยวกับการดริฟท์นี้
johsey

มันดูเล็กบนหน้าจอ แต่คิดว่าประมาณ 250 mV คุณอาจประสบปัญหาแหล่งจ่ายไฟทางด้าน 3.3V
Scott Seidman

คุณพูดถูกลอยอยู่ที่ประมาณ 300mV บนทั้งสองด้านของระดับ I2C จำแลง ดูเหมือนว่าแหล่งจ่ายไฟ + 3.3V ทำงานได้ดี (ไม่มีการดริฟท์ในเอาต์พุตเมื่อเกิดการดริฟท์ที่สัญญาณ SCL) มันอาจเกี่ยวข้องกับ shifter ระดับ I2C หรือไม่?
johsey

ไม่แน่ใจเลย 3.3V มาจากไหน เปลี่ยนคอนเวอร์เตอร์? ไม่ว่าในกรณีใด ๆ มันก็น่าสงสัย คุณกำลังวาดกระแสไฟต่ำสุดที่อุปกรณ์ต้องการให้ 3.3V ต่อแผ่นข้อมูลหรือไม่? หากไม่โหลดของคุณด้วยตัวต้านทาน จะเกิดอะไรขึ้นถ้าคุณรอสักครู่หรือสองวินาทีก่อนเริ่มการสื่อสาร
Scott Seidman

3.3V มาจาก SMPS (LM3103MH จาก TI) ฉันไม่ได้เป็นผู้เชี่ยวชาญด้านอุปกรณ์จ่ายไฟ แต่อย่างที่ฉันเข้าใจด้วยอุปกรณ์นี้ไม่จำเป็นต้องมีกระแสไฟขั้นต่ำเพราะสามารถทำงานในโหมดการนำไฟฟ้าไม่ต่อเนื่องที่โหลดเบา ปัญหาเดียวกันนี้เกิดขึ้นถ้าฉันรอสองวินาทีก่อนเริ่มการสื่อสาร
johsey

2

มีโอกาสอื่นอีกไหมที่พยายามพูดคุยกับกระดานนี้ ฉันมีปัญหาเช่นนั้นครั้งเดียว; ฉันได้รับ ack 60% ของเวลา แต่ฉันจำไม่ได้ว่าเคยเห็นการปะทะกัน ฉันสงสัยว่า i2c ที่ฉันให้มานั้นแยกได้จากรถบัสภายในจริง ฉันสามารถเรียกใช้งานได้อย่างต่อเนื่องและจะลดลง 30% ของข้อความ ปัญหาหายไปทันทีที่เราเริ่มพูดคุยโดยตรงกับอุปกรณ์ (แหล่งจ่ายไฟ) โดยไม่ต้อง "backplane" แทรกแซง

ฉันไม่เห็นลำดับการหยุดหลังจากข้อผิดพลาด NAK ของคุณ ฉันเดาว่าคุณมีเบรกพอยต์ที่หยุดโปรแกรม ณ จุดนั้นหรือไม่

สุดท้ายถ้าคุณคิดว่าคุณเป็นคนเดียวบนรถบัสคุณอาจลองเปลี่ยนการเริ่มต้นซ้ำด้วยการหยุด / เริ่ม ฉันเคยเห็นอุปกรณ์ (โดยเฉพาะ FPGA ที่กำหนดเอง) ซึ่งไม่ค่อยรู้วิธีจัดการ RS

[ตอบกลับความคิดเห็น]: มีหลายสิ่งที่คุณไม่ได้พูดเกี่ยวกับบอร์ด FRAM เช่นว่าเป็นเพียงหน่วยความจำหรือระบบย่อยทั้งหมด แต่ถ้าคุณสามารถวาง 'ขอบเขต' ลงบนสายนำของอุปกรณ์ i2c ที่ทำให้คุณมีปัญหาและคุณยังเห็นภาพที่แสดงอยู่ฉันก็จะแยกแยะการรบกวน I2C นั้นง่ายพอที่ถ้าคุณเห็นสัญญาณที่ถูกต้องของอินพุทดังนั้นชิพควรเล่นอย่างถูกต้องเว้นแต่ว่ามันจะมีปัญหาภายใน

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

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


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

บอร์ด FRAM ฝังอยู่แค่ FRAM เป็นกระดาน "ISA like" เป็นการยากที่จะวัดสัญญาณโดยตรงบนหมุด FRAM เนื่องจากการ์ดนี้ฝังอยู่ในแผ่นพลาสติก อย่างไรก็ตามฉันจะพยายามหาวิธีวัดสัญญาณเหล่านี้ให้ใกล้เคียงที่สุดกับ FRAM
johsey

การเดินทางไปยังด้าน FRAM ของ U13 นั้นเป็นขั้นตอนที่ยิ่งใหญ่
gbarry

2

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

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

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

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


0

ลักษณะของปัญหาที่เกิดขึ้นเป็นระยะ ๆ แสดงให้เห็นว่าอาจเป็นปัญหาเรื่องเวลา

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

ฉันจะไม่คิดว่าอุปกรณ์ของคุณอยู่ในโหมดเร็ว คุณสามารถลดการกำหนดเวลาลงได้ 2-4 วิธีหรือไม่ตรวจสอบให้แน่ใจว่าคุณอยู่ในการกำหนดเวลามาตรฐานสำหรับเวลาเริ่มต้นของการพักสภาพนาฬิกาสูงและต่ำนาฬิกาและดูว่าปัญหานี้ยังคงเกิดขึ้นอยู่หรือไม่?


อุปกรณ์ของฉันอยู่ใน "โหมดมาตรฐาน" (SCL ความถี่ 100kHz) แน่นอนความถี่นี้อยู่ที่ชายแดนของโหมดนี้ ฉันจะพยายามลดให้เหลือเพียงสองและทำการทดสอบ
johsey

0

คุณมี 24c04a, b หรือ c หรือไม่ ถ้ามันเป็น c04a มันเป็นการออกแบบที่แข็งแกร่ง ส่วน b มีความไวต่อทางลาดของแหล่งจ่ายไฟ คุณกำลัง decoupling บน pin8 ถึง gnd คืออะไร? ฉันจะพูดบางอย่างเกี่ยวกับระดับสัญญาณ แต่ฉันเห็นว่าคุณใช้นักแปลระดับ คุณอาจต้องการตรวจสอบว่าคุณไม่ได้รับความผิดพลาดใน SCL ที่ชิปจะตีความเป็นนาฬิกาพิเศษ


3
คุณพิมพ์สิ่งนี้ลงในโทรศัพท์มือถือรุ่นเก่าที่มีเพียงเก้าปุ่มเท่านั้นหรือไม่?
angelatlarge

FRAM ที่ใช้เป็นFM24C04B คุณได้รับข้อมูลเกี่ยวกับพลังงานความรู้สึกของหน่วยความจำนี้ที่ไหน คุณช่วยเพิ่มอินพุตให้ฉันได้ไหม ไม่มีการแยกชิ้นส่วนบนพิน 8 การออกแบบของโมดูลนี้ได้ทำไปเมื่อไม่กี่ปีที่ผ่านมาและเราต้องใช้การผลิตทั้งหมด จากการวัดด้วยออสซิลโลสโคปดูเหมือนว่าไม่มีความผิดพลาดใด ๆ ในสาย SCL เมื่อเชื่อมต่อโมดูล FRAM และเชื่อมต่อกับตัวเปลี่ยนระดับ
johsey

1
ฉันรู้ว่าการตอบสนองนี้ช้ามาก แต่ข้อมูลของฉันเกี่ยวกับความไว Vcc นั้นมาจากการสนับสนุนแอพของ Ramtron เมื่อหลายปีก่อน ฉันไม่จำรายละเอียดที่แน่นอน แต่ภายใต้อัตราการเล่นและอุณหภูมิที่แน่นอนชิปจะล็อคและไม่อนุญาตให้มีการสื่อสาร I2C จนกว่าคุณจะเพิ่มพลังด้วยทางลาดที่ 'ดี' การไม่มีฝาครอบแยกออกใกล้กับชิปนั้นไม่ดี คุณอาจพบว่าการใช้ decoupling 0.1uF กับ 10uF เปลี่ยนทางลาด Vcc ที่หนึ่งใช้งานและอีกอันไม่ทำงาน @angelat large ใช่ขอโทษฉันพิมพ์คำตอบแรกจากโทรศัพท์
gman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.