i2cバス速度の問題

Aug 23 2020

チップ上のeUSCI_B0i2cペリフェラルを割り込みモードでMSP430F6736Aを使用して、FRAMチップと通信しています。

ロームFEDR44V100Aフレーム1Mbチップと「確実に」通信するために、i2cクロックを130KHzに落とさなければならない理由を理解しようとしています。

明確にするために、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の割り込みビットは、関連する時間にセット/クリアされます。

マイクロチップ47L16EERAMチップと400KHzで通信しても問題はなかったと指摘するかもしれませんが、これは問題がROHMチップにある(100%)ことを示しています...しかし、なぜですか?通信をこの低速にする必要がある理由についての提案と同様に、速度を向上させるために私ができることについてのポインタをいただければ幸いです。

前もって感謝します。

回路...

129KHzのクロック波。

382KHzのクロック波。

回答

2 moshejay Aug 25 2020 at 14:41

私は自分の問題の解決策を見つけました。

Microchip EERAMチップを使用したとき、Tx割り込みを設定する直前、ダミーバイトをTxBUFに配置する必要があることがわかりました。

UCB0TXBUF = 0x55; 
UCB0IE = UCTXIE0;

これを行わなかった場合、書き込みたいチップのアドレスの最初のバイトは送信されませんでした。

しかし、として、その行は、FRAMチップの問題を引き起こし、時には、0x55のは、実際に私が書きたかったチップ内のアドレスを設定するための第1バイトとして送信されました。

なぜこれがたまにしか起こらなかったのかわかりません。ロジックアナライザーを使用して2秒分の通信を繰り返し取得することで検出され、送信される値が異なるはずの0x55に気付きました(2つだけでなく3バイトがアドレスに送信されたという事実も同様です)。

さらに、ISRにUCB0TXBUF = 0xFF;は、Tx割り込みをクリアする直前、つまり次のような行もありました。

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

これを変更し、割り込みを無効にした、つまり次のようにIFG設定をクリアしました。

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

助けてくれたすべての人に感謝します。

PS私は現在1MHzで正常に通信しています。