yoshiyuki's blog

Arduino/Teensy/Raspberry pi pico を利用した I2C, SPI 通信アプリを紹介します

Arduino で I2C / コマンド (Windows/Android 共通)

この記事では自作アプリの使い方を説明しています。自作アプリに関しては以下の記事をご参照ください。
ysin1128.hatenablog.com

Windows アプリの 「CMD」「 CMD_Multi」 タブで使用するコマンドの説明です。
Android アプリでも同じコマンドを使用します。

コマンドのフォーマット

command_word B0 B1 B2 ...

コマンドは command_word と複数の バイナリ (Hex表記) を半角スペースで区切ったもので構成します。

command_word

command_word は1文字、または、複数文字の小文字のアルファベットです。

command_word: 内容
w I2C Write を実行します
r I2C Read を実行します
wb I2C Write Bit を実行します
i2cs I2C Search を実行します
i2cc I2C Bus Clear を実行します
s SPI Read/Write を実行します
g GPIO を制御します
p GPIO で生成したパターンの繰り返し出力を制御します
c Clock 出力を制御します
u UART TX/RX を実行します
delay Delay を挿入します

バイナリ値 (B0, B1, B2,...)

バイナリ値 (0 - 255) を Hex表記 (00 - FF) したもので I2C の Slave Address 等、コマンドの実行に必要な引数を与えます。

コマンドの分割

「+」の使用により、コマンドを複数行に分割することが可能です。
例えば、下記の記述はどちらも同じコマンドとして処理されます。

分割無し 複数行に分割
w 24 01 02 03 04 05 ... FF w 24 01 02 ... 0F
+10 11 12 ... 1F
+20 21 22 ... 2F
...
+F0 F1 F2 ... FF

I2C / Write コマンド

フォーマット

w B0 B1 B2 ...

w command_word
B0 7-bit Slave address (8-bit ではないことに注意)
B1, B2, ... 書き込みデータ

戻り値

無し

w 24 00 01 10 A0 FF

Slave address 0x24 に 5-byte のデータ (0x00 0x01 0x10 0xA0 0xFF) を書き込む。

I2C / Read コマンド

フォーマット

r B0 B1 B2 ... Bz

r command_word
B0 7-bit slave address (8-bit ではないことに注意)
B1, B2, ... 書き込みデータ (レジスタアドレス等の書き込みが事前に必要な場合。不要であれば省略可能)
Bz 読み出しデータ数 (Hex表記)

戻り値

読み出したデータ (Hex表記)

r 24 00 10

Slave address 0x24 レジスタアドレス 0x00 から 0x10 = 16-byte のデータを読み出す。

I2C / Write Bit コマンド

フォーマット

wb B0 B1 B2 ... B(n-1) B(n)

wb command_word
B0 7-bit Slave address (8-bit ではないことに注意)
B1, B2, ... レジスタアドレス (不要であれば省略可能)
B(n-1) 書き込みデータ
B(n) 書き込む Bit の指定

戻り値

無し

wb 24 00 42 5A

Slave address 0x24 レジスタアドレス 0x00 の Bit 6/4/3/1 に 1/0/0/1 を書き込む。Bit 7/5/2/0 の値は変更しない。

I2C / Search コマンド

フォーマット

i2cs B0 B1

i2cs command_word
B0 Search を開始する 7-bit Slave address
B1 Search を終了する 7-bit Slave address

戻り値

ACK が返ってきた 7-bit Slave address

i2cs 08 77

Slave address 0x08 から 0x77 までの全ての Slave address に対して ACK を返す相手がいるかどうかを調べ、ACK が返ってきた Slave address を出力する。

I2C / Bus Clear コマンド

フォーマット

i2cc B0 B1

i2cc command_word
B0 00 (固定)
B1 00 (固定)

戻り値

無し

i2cc 00 00

SCL が Clock を 9 回出力する。

SPI コマンド

フォーマット

s B0 B1 B2 ...

s command_word
B0[7:6] 00 (固定)
B0[5] 0 = MSB First, 1 = LSB First
B0[4:2] SPI Clock, 0 = (1/2) x Arduino CLK, 1 = (1/4) x Arduino CLK , ..., 6 = (1/128) x Arduino CLK
B0[1:0] SPI mode, 0 = mode 0, 1 = mode 1, ..., 3 = mode 3
B1, B2, ... 書き込みデータ

 

戻り値

読み出したデータ (Hex表記)

s 00 10 FF

MSB First, SPI Clock = 8MHz (Arduino CLK=16MHz の場合), SPI mode = 0 で 2-byte のデータ (0x10 0xFF) を書き込み、2-byte のデータを取得する

GPIO コマンド

フォーマット

g B0 B1 B2 B3 ...

g command_word
B0, B1 信号幅, B0 x 256 + B1 [msec]
B2[7] D7 の Input/Output の切り替え, 0 = Input, 1 = Output
B2[6] D6 の Input/Output の切り替え, 0 = Input, 1 = Output
B2[5] D7 の出力, 0 = Hi-Z (Input時), Low (Output時), 1 = Pull-up (Input時), High (Output時)
B2[4] D6 の出力, 0 = Hi-Z (Input時), Low (Output時), 1 = Pull-up (Input時), High (Output時)
B2[3] D5 の出力, 0 = Low, 1 = High
B2[2] D4 の出力, 0 = Low, 1 = High
B2[1] D3 の出力, 0 = Low, 1 = High
B2[0] D2 の出力, 0 = Low, 1 = High
B3, ... B2 と同じ

 

戻り値

各GPIO ピンの入出力状態

  • 出力 (Digital): D5-D2 (4本)
  • 入力 or 出力 (Digital): D7, D6
  • 入力 (Analog): A1, A0 (入力電圧 = Arduino の電源電圧 x (n/1023) の n値を取得)

g 00 01 03 00 03 00

D3, D2 が 幅 1msec の High/Low パルスを 2回出力し、各出力時の D7-2, A1, A0 の状態を取得する。D7, 6 は Input (Hi-Z)

GPIO パターン繰り返し出力コマンド

フォーマット

p B0 B1

p command_word
B0 0 = 出力停止, 1 = 出力開始
B1 繰り返し回数, 0 = 連続出力

 

戻り値

無し 

p 01 00

D6-D2 が直前の g コマンドで生成したパターンを繰り返し出力する。p 00 00 コマンドの実行で停止する。
このコマンドでパターンを出力する場合、D8, D7, A1, A0 の状態は取得されない。

Clock 出力コマンド

フォーマット

c B0 B1 B2 B3

c command_word
B0, B1 Clock周期,  (B0 x 256 + B1) x (Arduino の Clock周期)
B2, B3 High幅,  (B2 x 256 + B3) x (Arduino の Clock周期)

 

戻り値

無し

c 00 10 00 08

D9 から 1MHz, 50% Duty の Clock を出力する (Arduino の Clock が 16MHz の場合)

例2

c 00 00

D9 からの Clock 出力を停止する

UART コマンド

フォーマット

u B0 B1 B2 ... B(n)

u command_word
B0[7:6] 00 (固定)
B0[5:4] 00 = 8 bit, 01 = 7 bit
B0[3:2] 00 = Stop bit 1 bit, 01 = Stop bit 2 bit
B0[1:0] 00 = Even parity, 01 = Odd parity, 10 = none
B1, B2, ... TX データ
B(n) RX データ数 (Hex表記)

 

戻り値

読み出したデータ (Hex表記)

u 00 11 22 02

データ長 = 8 bit, Stop bit = 1 bit, Even parity で 2 byte のデータ (0x11, 0x22) を TX から出力し、RX で 2 byte のデータを受信する

Delay コマンド

フォーマット

delay D0

delay command_word
D0 Delay時間 [msec]。10進数で入力

 

戻り値

無し 

delay 1000

1000 msec 待つ。 

コメントアウト

行頭に // を挿入するとその行は無視されます。

w 24 00 0F
// w 24 01 10
w 24 02 1A

Slave address 0x24 Register address 0x00 に 0x0F、Register address 0x02 に 0x1A を書き込む。 Register address 0x01 への書き込みは行われない (コマンドが無視される)。