So-net無料ブログ作成
検索選択

SilentCが使っていないモジュールを探せ(7) [ColdFire V2]このエントリーを含むはてなブックマーク#

1990557

今日は、I2Cを走ります。

やっぱり、レジスタ・ダンプ・リスト

最初は、レジスタ領域のダンプ・リストをとります。

40000300  00 00 00 00 00 00 00 00  ........
40000308  00 00 00 00 81 00 00 00  ........
40000310  00 00 00 00 00 00 00 00  ........
40000318  00 00 00 00 00 00 00 00  ........

デフォルトのままです。 まあ、外部にI2Cデバイスをつないでいないのだから、当然ではあります。

I/O拡張チップでLEDピカピカ

2073160

I2Cインターフェースだけでは、遊べませんので、NXP社のI/O拡張チップPCA9554を接続して、LEDをピカピカさせました。


2073158

SDA/SCL端子は、PQS[3:2]を使用しています。 これは、単にブレッドボード上の配線の制約によるものです。


プログラムで使用したI2Cモジュールの主な設定は、以下の通りです。

I2Cのレジスタ設定
レジスタ備考
I2FDR0x38 (640) I2C通信で使用されるクロックを指定します。 バスクロック(60MHz)を640分周した94kHzの転送レートが使用されます。
I2CR [IEN]1 (enable) I2Cモジュールをイネーブルします。
I2CR [IIEN]0 (disable) I2C割り込みを使用するときにはセットします。 もちろん、割り込みは使いません。
I2CR [MSTA]0 → 1 → 0 マスタ・モードを意味するビットとされているのですが、実際には、マスタとして通信の開始・終了時のSTART状態とSTOP状態を作り出すために使用されます。
I2CR [MTX]1 (TX) I2C通信の方向を示します。 今回は、MCF52233からデータを送り込む方向の通信だけを行っているので、セットしたまま使います。
I2CR [TXAK]0 (ACK) データの受信確認のための符号としてACK/NAKのどちらを返すかを指定します。 前述のように送信方向のみに使用しているので、どちらでもかまいません。
I2CR [RSTA]0 (no Sr) I2C通信の二つのパケットをつなぐリピーテッド・スタートという特殊なSTART状態を作り出すかどうかを指定します。 今回は、リピーテッド・スタートは使用しないので、クリアしておきます。

単純な点滅をするプログラムは、こんなふうになりました。 ステータスレジスタのフラグをしつこくチェックしていますが、どこまで必要なのかは検証していません。

  int  *pqspar =0x4010006c;
  char *i2adr  =0x40000300;
  char *i2fdr  =0x40000304;
  char *i2cr   =0x40000308;
  char *i2sr   =0x4000030c;
  char *i2dr   =0x40000310;
main(){
  *pqspar =0x00A0; // PQSPAR[3:2]=10 (i2c)
  *i2fdr = 0x38; // (x640)
  *i2cr  = 0x90; // See table
  write(0x03,0x00); // config as OUT
  #stop 0
  for(;;){
    if(Getc(0)=='q')break;
    Sleep(25);
    write(0x01,0x00); // Turn ON
    Sleep(25);
    write(0x01,0xFF); // Turn OFF
  }
}
write(char com, char data){
  while ((*i2sr)&0x20) SystemSleep();
  *i2cr |= 0x20; // START
  *i2dr  = 0x40; // WRITE for 0100000
  while (!(*i2sr)&0x20) SystemSleep();
  *i2dr  = com; // command
  while (!(*i2sr)&0x20) SystemSleep();
  *i2dr  = data; // data
  while (!(*i2sr)&0x20) SystemSleep();
  *i2cr &= 0xDF; // STOP
}
このプログラムは、フラグの操作に問題があります。 それでも動作しているのは、SilentCの処理速度が遅いためだと思われます。 フラグ操作を修正した記事を MCF52233付録基板 - I2CでLEDピカピカ完全版に追加しました。

I2Cの書き込みを行う関数をくくりだしたことから、レジスタへのポインタ変数は大域変数になっています。 メイン・ループでは、Sleep(25)で250m秒ごとにI2C通信を行い、LEDを点滅させています。

参考文献

Interface (インターフェース) 2008年 09月号 [雑誌]

Interface (インターフェース) 2008年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/07/25
  • メディア: 雑誌

モジュールの使い方は、HCS08もColdFireも変わりないんですよね。

HCS08 Unleashed: Designer's Guide to the Hcs08 Microcontrollers

HCS08 Unleashed: Designer's Guide to the Hcs08 Microcontrollers

  • 作者: Fabio Pereira
  • 出版社/メーカー: Booksurge Llc
  • 発売日: 2007/11/13
  • メディア: ペーパーバック

nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。