HCIレイヤー(PIC-PIC間接続)

PIC回路を2つ用意し、その間を無線接続します。1つはmaster(主人)、他方はslave(奴隷)と呼ばれます。masterはslaveに対して接続を要求し、slaveはmasterに接続許可を発行します。master用のファームウェアはHCImaster.zipで、slave用のファームウェアはHCIslave.zipです。

まず、masterのPIC回路にRS232C回路(デバッグ・モニター用)を接続し、パーソナル・コンピュータ(PC)上で(ハイパーターミナルやTela Termなどのモニター用アプリケーション・プログラムを用います)デバッグモニターができるようにします。そして、slaveのPIC回路の電源を入れ、その後でmasterのPIC回路の電源を入れるだけです。モニターログは以下のようになるはずです。

***** USB Custom Demo App Initialized *****

Generic demo device attached - event, deviceAddress=1

HCI_CMD_RESET: 0E 04 01 03 0C 00
HCI_CMD_READ_BD_ADDR: 0E 0A 01 09 10 00 22 0B 04 DC 1B 00
HCI_CMD_LOCAL_NAME: 0E 04 01 13 0C 00
HCI_CMD_CLASS_DEVICE: 0E 04 01 24 0C 00
HCI_CMD_SCAN_ENABLE: 0E 04 01 1A 0C 00
HCI_CMD_INQUIRY_RESULT: 02 0F 01 40 E4 03 DC 1B 00 01 02 00 04 05 00 D6 15
HCI_CMD_INQUIRY_STATUS: 01 01 00
HCI_CMD_CONNECTION_ACCEPTED: 03 0B 00 2A 00 40 E4 03 DC 1B 00 01 00
2A 20 09 00 05 00 40 00 00 02 03 04 05
HCI_ACL_READ_DATA
2A 20 09 00 05 00 40 00 10 02 03 04 05
HCI: 20 07 40 E4 03 DC 1B 00 01
HCI: 13 05 01 2A 00 01 00
HCI: 1B 03 2A 00 05
HCI: FF 03 2A 00 05
2A 20 09 00 05 00 40 00 01 02 03 04 05
HCI_ACL_READ_DATA
2A 20 09 00 05 00 40 00 11 02 03 04 05
HCI: 13 05 01 2A 00 01 00
HCI: FF 05 01 2A 00 01 00
2A 20 09 00 05 00 40 00 02 02 03 04 05
HCI_ACL_READ_DATA
2A 20 09 00 05 00 40 00 12 02 03 04 05
HCI: 13 05 01 2A 00 01 00
HCI: FF 05 01 2A 00 01 00

HCI_CMD_CONNECTION_ACCEPTED:以下で、masterからslaveへ0x00 0x02 0x03 0x04 0x05の5バイトを送っています(下から17行目)。最初の1バイトだけに0x10を加えたもの、つまりへ0x10 0x02 0x03 0x04 0x05の5バイトがslaveからmasterに送り返されて来ます(下から15行目)。これを繰り返すのですが、masterからslaveへ送るデータの1バイト目は、送るたびに1だけ増加させています(下から10行目や下から5行目)。ファームウェア上では、main.cの

//HCI_ACL ******************

なるコメント文以降を見れば、何をしているかすぐ分かると思います。

これで、何が可能となったかと問われれば、例えば、簡易なロボットなどにslave用のPIC回路を搭載し、master用のPIC回路をリモコンにすれば、無線でロボットなどをコントロールできるようになると答えます。

注意:このファームウェアでは、masterから発見可能な状態(scan enable)になっているbluetooth機器が1つ(作成したPIC回路のみ)だけである条件でしか使用できません。他にbluetooth機器があり、それがmasterから発見可能な状態にあるときは、main.cの中のcase HCI_CMD_INQUIRY_RESULT:の所を書き換え、適切なslaveだけを選択するようにする必要があります。その場合、bluetoothマニアル Core v2.0 + EDR.pdf の 7.7.2 節 Inquiry Result Event (564ページ) を参照ください。

ところで、hidblueM_firm4.zipなどと、HCImaster.zipやHCIslave.zipとの違いは、main.cだけにあります。


HCImasterに関する補足

1. Bluetooth機器が周りに複数在る場合の取り扱い方:

main.cの中でのcase HCI_CMD_INQUIRY:の箇所で、例えば、次のように設定します。
buf1[6]=0x05;//waiting time (5 * 1.28 sec)で照会時間を設定しています
buf1[7]=0x03;で周りにあるBluetooth機器を最大3個まで探します。
照会は1度しかしません。つまり何度も照会を繰り返してはいけません。

周りにBluetooth機器が3個以上あれば、3個見つかっ時点で照会が終了します。また、例えば周りにBluetooth機器が2個しか無い場合は、照会時間切れとなった時点で照会が終了します。いずれにせよ、照会が終了すると、0x01で始まるイベント(Inquiry complete event)が返ってきます。照会が止むまでの間、0x02で始まるイベント(Inquiry result event)をすべて(何回かこのイベントが発生する)捕らえれば、周りにあるBluetooth機器の情報を重複無く得ることができます。 main.cの中で、

case HCI_CMD_INQUIRY_STATUS:
//YTS********************************
if(buf1[0]!=0x01) {buf1[0]=0xff;HciState=HCI_CMD_INQUIRY_RESULT; return;}
#ifdef DEBUG_MODE
UART2PrintString( "Bluetooth Detected \r\n" );
#endif
while(1);ここでプログラムは止まります。
//YTS********************************
//copy slave BD address
remote_bd_addr[0]=buf1[3];
remote_bd_addr[1]=buf1[4];

case BT_STATE_READ_CLASS_WAITING:
if (!USBHostGenericRx1IsBusy(deviceAddress)){
//YTS********************************
if(buf1[0]==0x01){ DemoState =BT_STATE_PROCESS; break;}
//YTS********************************
if(buf1[0]!=end_num){ DemoState =BT_STATE_READ_EP1; break;}
#ifdef DEBUG_MODE

以上、 //YTS********************************
で囲まれた部分(2カ所)を付け足しました。RS232Cモニターで確認ください。

周りにBluetooth機器が2個しか無い場合、RS232Cモニターでとったログの例です。
HCI_CMD_RESET: 0E 04 01 03 0C 00
HCI_CMD_READ_BD_ADDR: 0E 0A 01 09 10 00 AE DF 03 DC 1B 00
HCI_CMD_LOCAL_NAME: 0E 04 01 13 0C 00
HCI_CMD_CLASS_DEVICE: 0E 04 01 24 0C 00
HCI_CMD_SCAN_ENABLE: 0E 04 01 1A 0C 00
HCI_CMD_INQUIRY_RESULT: 02 0F 01 0A 6F FE 33 24 00 01 02 00 0C 01 02 FE 48
HCI_CMD_INQUIRY_RESULT: 02 0F 01 D8 A9 03 DC 1B 00 01 02 00 04 05 00 EB 5F
Bluetooth Detected

このように、Inquiry result eventが2回、返って来ます。ただし、上記while(1);でプログラムは止まりますので、その後の処理はご自身で行ってください。つまり、繋ぎたいBluetooth機器のBluetoothアドレスとクロック・オフセットを配列(remote_bd_addrとclock_offset)に記憶させ、それをcase HCI_CMD_CREAT_CONNECTION:の様にbuf1にコピーして接続します。接続すると、スレーブのハンドルが返って来ます。これを配列(handle)に記憶させておきます。この接続過程を、繋ぎたいBluetooth機器の個数分繰り返します。異なるBluetooth機器では、返ってくるハンドルが互いに異なりますので、マスターはそのハンドルを使い、それぞれのBluetooth機器とデータ・パケットをやり取りします。なお、配列remote_bd_addrとclock_offsetとhandleは、繋ぎたいBluetooth機器の個数分だけ必要になります。

2. unsigned char delay_time=30;に関して:

古いUSB Host - MCHPUSB - Generic Driver Demoのバグが修正されたため、新しいUSB Host - MCHPUSB - Generic Driver Demoを使用すればdelay_timeなる変数は必要なくなります。


戻る