ฉันพยายามสื่อสารกับ 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_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
- ตัวเปลี่ยนระดับ I2C นั้นอยู่ในโหมดสถานะสามโหมดก่อนที่จะใส่การ์ดที่ฝัง FRAM ไว้ สัญญาณ FRAM_SDA และ FRAM_SCL ถูกดึงต่ำ
- หลังจากใส่ "การ์ด FRAM" แล้วจะมีการเพิ่มการหน่วงเวลา 100ms เพื่อให้แน่ใจว่าแหล่งจ่ายไฟมีเสถียรภาพ (อย่างน้อย 11ms ที่จำเป็นก่อนที่จะเริ่มเงื่อนไขแรกตามแผ่นข้อมูล)
- ตัวเปลี่ยนระดับ I2C ถูกเปิดใช้งาน
- เพิ่มการหน่วงเวลา 1ms เพื่อให้แน่ใจว่าตัวเปลี่ยนระดับ I2C ถูกเปิดใช้งานและดึงบรรทัดขึ้น (~ 4us ต้องการโดยแผ่นข้อมูล) สัญญาณ FRAM_SDA และ FRAM_SCL ถูกดึงขึ้นมา
- เข้าถึงเฟรมได้แล้ว
สัญญาณ FRAM_SDA และ FRAM_SCL ถูกวัดหลังจากแต่ละขั้นตอน
ปัญหายังคงเกิดขึ้น
หยุด / เริ่มเงื่อนไขแทนที่จะเริ่มซ้ำ
@gbarry
ฉันพยายามที่จะหยุดก่อนที่จะเริ่มซ้ำแล้วซ้ำอีกในระหว่างการถ่ายโอนไบต์ ฉันวัดการถ่ายโอนไบท์ด้วยออสซิลโลสโคป: เงื่อนไข STOP ตามด้วยเงื่อนไขเริ่มต้นคือตกลง
น่าเสียดายที่วิธีนี้ไม่สามารถแก้ปัญหาได้
ความคิด
ปัญหานี้เกิดขึ้นเฉพาะหลังจากที่การ์ดที่ฝังการเชื่อมต่อ FRAM ฉันใช้งานการเข้าถึงการอ่านที่ประสบความสำเร็จหลายพันครั้ง (การระบุที่อยู่และการอ่านของทาส) หลังจากใส่ "การ์ด FRAM" และใส่อย่างถูกต้อง
มันฟังดูสำหรับฉันมากขึ้นเรื่อย ๆ เช่นปัญหาฮาร์ดแวร์ แต่ฉันไม่รู้ว่ามันจะเกี่ยวข้องกับ I2C shifter level หรือกับ slaves อื่น ๆ บน I2C bus
คุณมีความคิดหรือคำแนะนำอื่น ๆ หรือไม่?
แก้ไข (2013-04-18)
ดูเหมือนว่าปัญหาจะได้รับการแก้ไข
ฉันเปลี่ยนขั้วต่อโมดูล FRAM และหาวิธีการวัดโดยตรงบน FRAM ดูเหมือนว่าทุกอย่างจะทำงานได้ดีกับตัวเชื่อมต่อใหม่นี้
ฉันจะทำการทดสอบเพิ่มเติมเพื่อให้แน่ใจว่าปัญหามาจากการเชื่อมโยงที่ไม่ดี