ปัญหาความเร็วบัส i2c

Aug 23 2020

ฉันใช้ MSP430F6736A อุปกรณ์ต่อพ่วง eUSCI_B0 i2c บนชิปของฉันในโหมด INTERRUPT เพื่อสื่อสารกับชิป FRAM

ฉันกำลังพยายามหาคำตอบว่าทำไมฉันต้องลดนาฬิกา i2c ลงที่ 130KHz เพื่อที่จะสื่อสารได้อย่าง "น่าเชื่อถือ" ด้วยชิป Rohm FEDR44V100A fram 1Mb

เพื่อชี้แจงเมื่อฉันตั้งค่านาฬิกา i2c เป็น 400KHz ชิป FRAM 'บางครั้ง' ดูเหมือนจะส่งกลับเพียง 0 วินาที (กรณีที่ดีที่สุดหรือกรณีที่เลวร้ายที่สุดของข้อมูลแบบสุ่ม) แต่เมื่อฉันตั้งนาฬิกา i2c เป็น 130KHz ทุกอย่างก็ทำงานได้อย่างยอดเยี่ยม ฉันสมมติว่าเป็นชิป FRAM ที่ส่งข้อมูลที่ไม่ดี & ไม่ใช่พอร์ต i2c ที่รับข้อมูลที่ไม่ดีเนื่องจากฉันไม่สามารถสร้างข้อผิดพลาด "อย่างสม่ำเสมอ" เพื่อจับภาพบนเครื่องวิเคราะห์ตรรกะได้

จากแผ่นข้อมูล FRAM ชิปสามารถทำงานที่ความเร็วสัญญาณนาฬิกาสูงสุด 1MHz MSP430 ของฉันทำงานที่ 16.77MHz

เวลาเพิ่มขึ้นของ SCL & SDA น้อยกว่า 200nS ตัวต้านทานแบบพูลอัพบนบัส i2c คือ 2K

การตั้งค่าสำหรับ i2c คือ:

UCB0CTLW0 |= UCMST | UCMODE_3 |  UCSSEL__SMCLK;
UCB0BRW_L = 128; .................this is for 130KHz
UCB0BRW_L = 40;....................this is for 400KHz
UCB0BRW_H = 0;
UCB0I2COA0 = 0; 
UCB0I2CSA = theSalveAddress;

บิตขัดจังหวะของ UCB0IE ถูกตั้งค่า / ล้างตามเวลาที่เกี่ยวข้อง

ฉันอาจชี้ให้เห็นว่าฉันไม่มีปัญหาอะไรนอกจากนี้ในการสื่อสารกับชิป Microchip 47L16 EERAM ที่ 400KHz ซึ่งจะบ่งชี้ว่าปัญหาอยู่ (100%) กับชิป ROHM ... แต่ทำไม? คำแนะนำใด ๆ เกี่ยวกับสิ่งที่ฉันสามารถทำได้เพื่อลองและปรับปรุงความเร็วจะได้รับการชื่นชมเช่นเดียวกับคำแนะนำใด ๆ ที่ว่าทำไมการสื่อสารถึงต้องใช้ความเร็วต่ำขนาดนี้

ขอบคุณล่วงหน้า.

วงจร ...

คลื่นนาฬิกาที่ 129KHz ..

คลื่นนาฬิกาที่ 382KHz ..

คำตอบ

2 moshejay Aug 25 2020 at 14:41

ฉันพบวิธีแก้ปัญหาของฉัน

เมื่อฉันใช้ชิป Microchip EERAM ฉันพบว่าฉันต้องวางดัมมี่ไบต์ใน TxBUF ทันทีก่อนที่จะตั้งค่าการขัดจังหวะ Tx เช่นนี้:

UCB0TXBUF = 0x55; 
UCB0IE = UCTXIE0;

ถ้าฉันไม่ทำเช่นนี้ไบต์ที่ 1 ของที่อยู่ในชิปที่ฉันต้องการเขียนถึงจะไม่ถูกส่งไป

อย่างไรก็ตามบรรทัดนั้นทำให้เกิดปัญหากับชิป FRAM เนื่องจากบางครั้ง 0x55 ถูกส่งเป็นไบต์ที่ 1 เพื่อกำหนดที่อยู่ในชิปที่ฉันต้องการเขียนถึง

ผมไม่มีความชัดเจนว่าทำไมนี้เกิดขึ้นเฉพาะในบางครั้ง พบโดยใช้เครื่องวิเคราะห์ตรรกะเพื่อรับการสื่อสาร 2 วินาทีที่มีมูลค่าซ้ำ ๆ กันและฉันสังเกตเห็น 0x55 เมื่อควรมีการส่งค่าที่แตกต่างกัน (เช่นเดียวกับความจริงที่ว่ามีการส่ง 3 ไบต์สำหรับที่อยู่ & ไม่ใช่แค่ 2)

นอกจากนี้ใน ISR ฉันยังมีบรรทัดUCB0TXBUF = 0xFF;ทันทีก่อนที่ฉันจะล้างการขัดจังหวะ Tx เช่นนี้:

UCB0TXBUF = 0xff; // to prevent UCB0IFG from having TXBuf empty flag
UCB0IE &= ~UCTXIE0; // disable TX intr

ตอนนี้ฉันได้เปลี่ยนสิ่งนี้แล้วและตอนนี้ล้างการตั้งค่า IFG หลังจากปิดใช้งานการขัดจังหวะเช่นนี้:

UCB0IE &= ~UCTXIE0; 
UCB0IFG &= ~UCTXIFG0;

ดังนั้นขอขอบคุณทุกคนที่พยายามช่วยเหลือขอขอบคุณเป็นอย่างยิ่ง

ปล. ตอนนี้ฉันสื่อสารได้สำเร็จที่ 1 MHz