I2Cを使用して、リモート接続されたFRAM(RamtronのFM24C04)と通信しようとしています。このメモリはボードに組み込まれており、システムにいつでもシステムから着脱できます(メモリを取り外す前に通信は適切に終了します)。
問題は次のとおりです。ちょうどFRAMが含まれているカードを挿入した後、時々、それはアドレスを認識しません。
信号測定
信号を測定して何が起こっているのかを確認しましたが、タイミングはどちらの場合も(正常に機能していても機能していなくても)良いようです。
正しいI2C通信(3バイトの読み取り):
I2C FRAMアドレスが確認されていません(スレーブアドレスは正しく送信されています):
この問題を解決するために既に行われたアクション(成功なし)
- 電源シーケンスを確実に順守するために、FRAMが埋め込まれたカードが挿入された後に追加される遅延。
- I2Cは、確認応答しないスレーブアドレスの検出後に生成を停止します
I2Cバス構成
- 1つのマスター(STのSTM32F205マイクロコントローラー)
- 3つのスレーブ(MicrochipのEEPROM 24AA1025、Maxim ICのRTC DS1339C、およびRamtronのリモートFRAM FM24C04
- 1つのI2Cレベルシフター(マキシムICのMAX3373E)を使用して、マスターとFRAM間の通信が可能
- バス周波数を100 kHzに設定
編集済み(2013-04-17)
まず、コメントありがとうございます。
たくさんの提案があるので、これが私が行った調査の説明です。
回路図
次の図は、I2Cバスの簡略図を示しています。
I2C_SDAおよびI2C_SCL信号はマイクロコントローラーに直接接続され、FRAM_SDAおよびFRAM_SCL信号はFRAMに接続されます。FRAMに接続されたSDAおよびSCL信号は、MurataのBLM18フェライトを使用してフィルタリングされることに注意してください。
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カードの説明
このカードは、FRAMのみを組み込んだ「ISAのような」カードです。
調査
周波数を遅くする
SCL周波数を50kHzと10kHzに設定してテストを実行しました。SCL信号をオシロスコープで測定して、期待した周波数であることを確認しました。
これらの変更は問題を解決しませんでした。タイミングを確認したところ、FRAMデータシートの仕様の範囲内でした。
電源シーケンスの確保
@jippie。
- I2Cレベルシフターは、FRAMを組み込んだカードが挿入される前に、3ステートモードになります。FRAM_SDAおよびFRAM_SCL信号がLowにプルされます。
- 「FRAMカード」を挿入した後、電源が安定するように100msの遅延が追加されます(データシートによると、最初の開始条件の前に少なくとも11msが必要です)。
- I2Cレベルシフターがアクティブになります。
- I2Cレベルシフターがアクティブになり、ラインがプルアップされるようにするために、1msの遅延が追加されます(データシートでは約4usが必要です)。FRAM_SDAおよびFRAM_SCL信号はプルアップされています。
- FRAMがアクセスされます。
FRAM_SDAおよびFRAM_SCL信号は、各ステップの後に測定されています。
問題はまだ発生します。
繰り返し開始する代わりに停止/開始条件
@gbarry。
バイト転送中に繰り返しスタートする前にストップしようとした。オシロスコープでバイト転送を測定しました。STOP条件に続いてSTART条件で問題ありません。
残念ながら、このソリューションは問題を解決しません。
考え
この問題は、FRAMを組み込んだカードが接続された直後にのみ発生します。「FRAMカード」が挿入されて正しくアドレス指定された後、数千回の正常な読み取りアクセス(スレーブアドレス指定と読み取り)を実行しました。
ハードウェアの問題のように聞こえてきます。しかし、それがI2CレベルシフターまたはI2Cバス上の他のスレーブに関連している可能性があるかどうかはわかりません。
他にアイデアや提案はありますか?
編集済み(2013-04-18)
問題は解決したようです
FRAMモジュールコネクタを交換し、FRAMで直接測定する方法を見つけました。すべてがこの新しいコネクタでうまく機能しているようです。
問題が悪い接続に起因することを確認するために、さらにテストを行います。