I2C Read のはなし
I2C Readとは
I2Cはデバイスを組み込みCPUなどからコントロールする簡単なシリアル通信方法です。PLLやDACなどパラメーターの設定だけで事足りることが多くて、EEPROMなどを使用する以外はI2Cバスで読み込みを行う機会が少なく、実際読んでみたら読めないなんてことがあります。今回は読み込みを考えてみます。
ハード的には
やっぱり読み込みの代表例はEEPROMなどのメモリーでしょう。ここでは256Byte以下の小さなメモリをアクセスする基本を見てみます。Microchip社の24LCXXシリーズデーターシートを参考にしました。
まず書き込みを上図でおさらいしてみましょう。I2Cにはデバイスのアドレスと読み書きをコントロールする ControlByte があります。アクセス順は
1) START コンディション
2) Control Byte <---- デバイスからACK返答
3) Addres Byte <---- デバイスからACK返答
4) Dtata Byte <---- デバイスからACK返答
5) STOP コンディション
でデバイスからの応答は ACKのみです。
次に読み込みを行う場合です。
1) START コンディション
2) Control Byte <---- デバイスからACK返答
3) Addres Byte <---- デバイスからACK返答
( ここまでは、書き込みと同じですね。)
4)ここで再度スタートコンディションを送る
5) Control Byte <---- デバイスからACK返答
違う点は最後のビットがREAD モード( High)です。
(読み込みを改めて指定するコマンドです)
6) マスターがクロックを9クロック同じように送りながら
CLKの Low->Highの時にデーターをデバイスから読み込みます。
7) 通常のプロトコルならば、マスターはデバイスからのデーター受信完了を示す ACKを送るべきですが、1バイトだけの場合・最終バイトの場合には ACKを返しません。
8) STOPコンディションを送る
この場合、もしACKを返しますとデバイスはさらにクロックに応じて次のアドレスのデーターを返します。これを利用すると連続バイト読み込みが可能です。
ソフト的には
過去I2Cを使い始めた頃、上記シーケンスのようにして1バイト読み込みが完成したので、全く同じように8バイト連続受信しようとしてクロックを送ってはみたものの、最初の1バイトしか受信できずに困ったあげく、上記全部のシーケンスを8回繰り返してとりあえずOKにしてました。
悪いのはデバイスにせいにしてたんですが、よくマニュアルを読んだら連続して読む場合ACKを返す必要があったことを知って反省しました。その他にもページ書き込み(連続書き込み)の制限を知らずにサイズを超えて一度に書き込もうとして失敗・書き込み時間が5mSほどかかることを知らずに、なぜか書けなくて悩んでたなんてことはまた別の項目で...
| 固定リンク
「DIGITAL」カテゴリの記事
- 謹賀新年 2024(2024.01.03)
- I2C信号を見る はなし(2022.09.13)
- TTL レベルのはなし ふたたび(2022.02.13)
- 2022 新年あけましておめでとうございます。(2022.01.04)
- 12Bit DAコンバーターのはなし(2016.08.12)
コメント
こんにちは
以前何度か質問したものです。
またI2Cでなやんでしまいました。
PICへI2Cの信号を送って制御するプログラムを作成しているのですが、1バイトのデータを送ることは成功しています。
ただ、連続して1バイト送信のルーチンを使用すると、送らない現象が起きてしまいます。試しに10msほど1バイト送信後ディレイを入れて次のデータを送りますと送るのですが、タイミングがバラバラで正確なデータが送れません。
現在使用しているコンパイラはXC16
PICはdsPIC30F4012です。
オシロで確認しますと通信が途切れている感じです。
どこをチェックすると良いのでしょうか。
アドバイスをお願いします。
投稿: 菊地すすむ | 2019年7月 1日 (月) 21時16分
送る相手が判ると答えやすいですが、EEPROM などの書き込みは、アドレスによって連続書き込みに時間がかかります。例えば アドレス 0FH から 10H へは時間がかかる場合があります。8バイトや 16バイト毎に時間がかかる場合が多いです。
また、相手が BUSY の場合クロックストレッチといって自らCLOCK ラインを LOWにしたままでいて BUSYを知らせる機能もあります。そのあたりチェック下さい。
投稿: SUDOTECK | 2019年7月 2日 (火) 08時08分