SilentCが使っていないモジュールを探せ(7) [ColdFire V2]
今日は、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ピカピカ
I2Cインターフェースだけでは、遊べませんので、NXP社のI/O拡張チップPCA9554を接続して、LEDをピカピカさせました。
SDA/SCL端子は、PQS[3:2]を使用しています。 これは、単にブレッドボード上の配線の制約によるものです。
プログラムで使用したI2Cモジュールの主な設定は、以下の通りです。
レジスタ | 値 | 備考 |
---|---|---|
I2FDR | 0x38 (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月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
モジュールの使い方は、HCS08もColdFireも変わりないんですよね。
HCS08 Unleashed: Designer's Guide to the Hcs08 Microcontrollers
- 作者: Fabio Pereira
- 出版社/メーカー: Booksurge Llc
- 発売日: 2007/11/13
- メディア: ペーパーバック
コメント 0