I2Cページ書き込みについて
I2Cページ書き込みとは
この間のI2Cのはなしで書き足りなかったI2Cページ書き込みを書きます。
ハード的には
まずは
1)EEPROMなどのページ読み書き方法
上図は16KB( 256x8Bit)以下のEEPROMへのアクセス方法です。読み書きするアドレスは8ビットで指定しますので、まずアドレス指定を書き込みモードのコントロールバイトで送り書き込み時は書き込む最後のデーターまで連続して送ります。読み込む時はアドレスまで送った後、再度スタートコンディションから読み込みモードのコントロールバイトを送ります。その後クロックに同期してデバイスからデーターが送られてきますが、次にデーターを受け取りたい時はマスター側からACKを返します。さいごのデーター時にACKを返さないことで終了を指示します。
次に、それ以上の容量のEEPROMです。これには2種類のタイプがあります。
A)アドレスバイトを High & Low バイトと2バイト送り、A0〜 A15まで64KBまで指定できるようにしたもの。Microchipの 24C01C,24LC024など
B)コントロールバイトに 3Bit 拡張して 1バイトのアドレスを送って A0〜 A10までのアドレスを使う方法、さらにアドレスを2バイト使って A0〜A18まで使って512KBまで指定できるようにしたものがあります。microchipの24LC512など。
C)さらにデバイスアドレスを変えて最大8個を同一I2Cバス上に接続してコントロールバイトで見かけ上大きな容量のEEPROMをアクセスするように使うことが出来ます。
2)ページ書き込みのサイズに注意
各EEPROMにはページサイズといって一度に書き込みできるサイズが決められています。たとえば1Kbの24LC01Bでは 8Byteです。この場合 0x00 から 0x07 ですね。このとき続けて 0x08に書こうとすると 0x00に戻って上書きされてしまいます。また EEPROMの構造上これらページ単位で書き込みますので、1回づつ 0x00から0x07までページ書き込みをしないで8回書くのとページ書き込みを1回にまとめてするのでは、寿命に関係しますので、長期書き込みで信頼性を重視するならばページ書き込みを積極的に使うのが良いでしょう。
3)書き込みには時間がかかる
EEPROMはSTOPコンディションを受け取ると受信したページのバッファから実際のメモリーに書き込みを行います。通常5mS程度かかりますので、連続書き込みを早く行うと途中から書けないなんてトラブルが起こります。
ソフト的には
EEPROMには他にアトメルやRohm、セイコーインスツルなどコンパチブルな製品が多く生産されていますが、ページサイズやアクセス方法などメーカーで異なる場合が多いので、必ずデーターシートを確認しましょう。
| 固定リンク
「DIGITAL」カテゴリの記事
- 謹賀新年 2024(2024.01.03)
- I2C信号を見る はなし(2022.09.13)
- TTL レベルのはなし ふたたび(2022.02.13)
- 2022 新年あけましておめでとうございます。(2022.01.04)
- 12Bit DAコンバーターのはなし(2016.08.12)
コメント
avagoのapdsー9960でカラーセンサーを使うためにシーケンスを組みましたが何故か各カラー読み出し時に一度読んだデータがラッチされて変わらない現象があります。i2cの通信波形は、正常であり原因がわかりません。何か通信上のトラブルでしょうか?
投稿: まさきち | 2016年11月24日 (木) 23時28分
以下ご確認ください
1) 正常に読めている場合がほとんどでしたら、読めていない時の、直前の命令(コマンド)を疑ってください。時として処理に時間がかかるコマンドがあります。基本的に書き込み後は時間待ちをするといいかと思います。
2) A/D入力を切り替えてカラーを読むような動作をしている場合、切り替えてから正常に変換するまで時間がかかるかと思います。できれば読み込み完了の最後に、次の読み込み設定をして、ループや時間待ちの間にA/D変換が終わるよう設計されるとスマートです。
3) デバイスが忙しくて処理が間に合わない場合は「クロックストレッチ」といって読み出しシーケンス中にクロックラインをスレーブ側から引き延ばす場合もあります。
なかなか見つけにくいので、対策としては上記処理待ちを入れてみて改善するかどうかですね。
投稿: SUDOTECK | 2016年11月25日 (金) 10時04分
ちょっと APDS-9960 で検索してみました。
その中で
==========================
[COLOR/ALS]データ
16ビット(0-65535)で、"CDATAL/H(clear)、RDATAL/H(red)、GDATAL/H(green)、BDATAL/H(blue)"の
レジスタにそれぞれ格納されます。(数値は明るくなる程に増えて行きます)
(CDATALを 読み出せば、他の7バイトはラッチされ読出すまでデータの更新はされません)
==========================
とあります。
全部のレジスタを読み出すまでラッチされているようですが、この現象ですか?
投稿: SUDOTECK | 2016年11月25日 (金) 10時14分