I2CW
I2CW I2Cスレーブデバイスへのデータ送信(数値関数)
書式
I2CW( デバイスアドレス , コマンドアドレス , コマンド長 , データアドレス, データ長 )
引数
デバイスアドレス :0 ~ 127 ($00 ~ $7F)(7ビット指定)
I2Cスレーブアドレスを7ビット形式で指定
コマンドアドレス :0 ~ 32767($0000 ~ $1FFFF)
送信するコマンドが格納されている仮想アドレス
コマンド長 :0 ~ 32767
送信するコマンドのバイト数
送信データアドレス:0 ~ 32767($0000 ~ $1FFFF)
送信データを格納するSRAM内仮想アドレス
データ長 :0 ~ 32767
送信するデータのバイト数
説明
I2Cスレーブデバイスにデータを送信します。
送信先はデバイスアドレスにてI2Cスレーブアドレスを指定します。
送信するデータはSRAM先頭からの仮想アドレスにて指定します。
送信するデータはあらかじめ、設定しておく必要があります。
コマンドとデータの区別はありません。デバイスに対しては、単純にコマンド、データの順に送信しています。
仮想アドレスの指定には次の定数を利用することで有用な領域への書込み・参照が簡単に行えます。
仮想アドレスの指定には次の定数を利用することが出来ます。
VRAM :画面表示用メモリ(CW×CH) サイズは利用する画面デバイスにより可変
VAR :変数領域 サイズ 420バイト
ARRAY :配列変数領域(@(0)~@(99) ) サイズ200バイト
PRG :プログラム領域 サイズ 4096バイト
MEM :ユーザーワーク領域 サイズ1024バイト
GRAM :グラフィック表示用メモリ サイズは利用する画面デバイスにより可変
I2C通信には次の接続ピンを利用します。
PB6:SCL(I2Cクロック)
PB7:SDA(I2Cデータ)
戻り値
0:正常終了
1:通信バッファに対してデータが長すぎる
2:アドレス送信にNACKが返された
3:データ送信にNACKが返された
4:その他のエラー
エラーメッセージ
Syntax error :文法エラー、書式と異なる利用を行った
Illegal value :指定した引数の値が不当である
Out of range value :指定した値が有効範囲を超えている
Overflow :指定した数値が-32768 ~ 32767を超えている
利用例
I2C EEPROM(AT24C256 スレーブアドレス $50)にデータの読み書きを行う
code:i2cr_sample.bas
100 POKE MEM+0,$00,$00
110 POKE MEM+2,64,65,66,67
120 R=I2CW($50,MEM,2,MEM+2,4)
130 ? "snd r=";R
140 POKE MEM+6,0,0,0,0
150 WAIT 5
160 R=I2CR($50,MEM,2,MEM+6,4)
170 ? "rcv r=";R
180 ? "rcv data:";
190 FOR I=0 TO 3
200 ? PEEK(MEM+6+I);" ";
210 NEXT I
220 ?
実行結果
code:i2cr_sample2.bas
run
snd r=0
rcv r=0
rcv data:64 65 66 67
OK
接続しているI2Cスレーブを調べる
(補足)I2Cスレーブアドレスのみ送信し、正常終了(ACKを返した)のアドレスを調べています。
code:i2cw_sample3.bas
10 FOR I=0 TO $7F
20 C=I2CW(I,MEM,0,MEM,0)
30 IF C=0 PRINT HEX$(I,2);" ";
40 NEXT I
50 PRINT :PRINT "done."
実行結果
code:ic2w_sample4.bas
run
50
done.
OK
関連項目