TCP_BP3591 の説明 V002 2014/03/28 ROHM 社製 WIFi モジュール BP3591 を使用して 無線 LAN により TCP/IP 通信を行うプログラムです 簡単な文字列によるコマンド ( 例 : LED0 ON ) を受信して LED の ON/OFF を行います 受信したデータはエコーバックされます 無料の開発ツール Atollic TrueSTUDIO for ARM Lite ( 試用版 ) で作成したプロジェクトです プログラムの開始番地は 0x08000000 です デバッグが可能です 目次 1. CPU 基板と WiFi モジュール BP3591 との接続... 2 1.1. 飛石伝ひ CPU 基板 の場合... 2 1.2. 飛石伝ひ I/F 基板 の場合... 3 1.3. STM32F4 Discovery 基板の場合... 4 2. TCP/IP 通信のための Network 構成 ( ローカル接続 )... 5 3. プログラム実行時の動作と動作確認... 6 3.1. AccessTCP_Local プログラムで試験... 6 1) AccessTCP_Local プログラムの起動... 6 2) エコーバック... 7 3) LED ON/OFF... 7 3.2. Tera Term で試験... 8 1) Tera Term の起動... 8 2) IP アドレスの登録... 8 3) TCP/IP 接続... 10 4) エコーバック... 11 5) コマンド送信による LED の ON/OFF... 12 4. プロジェクトの構成... 13 4.1. 追加したソースフォルダ... 14 4.2. フォルダ main... 15 5. Network パラメータの設定... 16 5.1. WiFi ルータの設定 (NetworkParam.h)... 16 5.2. TCP/IP の Port 番号の設定 (NetworkParam.h)... 16 5.3. TCP/IP のアドレスの設定 (NetworkParam.c)... 16 6. TCP_BP3591 のプログラムの構造... 17 6.1. 処理番号を使用したプログラムのフロー... 17 6.2. 処理番号を使用したプログラムの形... 18 7. Network 処理モジュールの概要... 19 7.1. ソースフォルダ Network の下のファイル... 19 7.2. ソースフォルダ BP3591... 20 1
1. CPU 基板と WiFi モジュール BP3591 との接続 WiFi モジュール BP3591 をアクセスするために UART( 非同期シリアル通信 ) を使用します 1.1. 飛石伝ひ CPU 基板 の場合 1) ROHM 株式会社製の WiFi モジュール BP3591 と接続用基板 BP359D とのセット 表 1.1. 1) BP359D と 飛石伝ひ CPU 基板 との接続信号 CN1 番号 BP359D の信号名 CPU 信号名 CPU 機能名 コネクタピン番号 備考 1 GND ----- ----- ----- 2 GPIO0 ----- ----- ----- 3 GPIO1 ----- ----- ----- 4 VCC ----- ----- +3.3V 5 VCC ----- ----- +3.3V 6 BOOT_SEL1 ----- ----- ----- 10k の抵抗でプルアップ 7 BOOT_SEL0 ----- ----- ----- 8 FLASH_SEL ----- ----- ----- 9 GND ----- ----- ----- CN2 番号 BP359D の信号名 CPU 信号名 CPU 機能名 コネクタピン番号 備考 1 GND ----- ----- ----- 2 SDDATA1 ----- ----- ----- 3 SDDATA0 ----- ----- ----- 4 UART_RxD PB10 UART3_TX P2-20 5 UART_TxD PB11 UART3_RX P2-19 6 GPIO6 ----- ----- ----- 7 PRST PA1 I/O P2-41 Network_Reset 8 GPIO2 ----- ----- ----- Status_LED 9 GND ----- ----- ----- 2) TMD3591AD との接続 表 1.1. 2) TMD3591AD と 飛石伝ひ CPU 基板 との接続信号 番号 TMD3591AD の信号名 CPU 信号名 CPU 機能名 コネクタピン番号 備考 1 VCC ----- ----- ----- +3.3V 2 VCC ----- ----- ----- +3.3V 3 PRST PA1 I/O P2-41 Network_Reset 4 GPIO0 ----- ----- ----- 5 GPIO1 ----- ----- ----- 6 GPIO2 ----- ----- ----- Status_LED 7 GPIO6 ----- ----- ----- 8 M_ANA ----- ----- ----- 9 FLASH_SEL ----- ----- ----- 10 BOOT_SEL_0 ----- ----- ----- 11 UART_RXD PB10 USART3_TX P2-20 12 UART_TXD PB11 USART3_RX P2-19 13 SDATA1 ----- ----- ----- 14 SDATA0 ----- ----- ----- 15 GND ----- ----- ----- 16 GND ----- ----- ----- Status LED の接続は 飛石伝ひ I/F 基板 のページの I/F 基板の回路図を参考にしてください 2
1.2. 飛石伝ひ I/F 基板 の場合 1) ROHM 株式会社製の WiFi モジュール BP3591 と接続用基板 BP359D とのセット I/F02 基板の CN1, CN2 に実装することができます 2) TMD3591AD との接続 I/F02 基板の P10 に実装することができます 3
1.3. STM32F4 Discovery 基板の場合 1) ROHM 株式会社製の WiFi モジュール BP3591 と接続用基板 BP359D とのセット 表 1.2. 1) BP359D と STM32F4 Discovery 基板との接続信号 CN1 番号 BP359D の信号名 CPU 信号名 CPU 機能名 コネクタピン番号 備考 1 GND ----- ----- ----- 2 GPIO0 ----- ----- ----- 3 GPIO1 ----- ----- ----- 4 VCC ----- ----- +3.3V 5 VCC ----- ----- +3.3V 6 BOOT_SEL1 ----- ----- ----- 10k の抵抗でプルアップ 7 BOOT_SEL0 ----- ----- ----- 8 FLASH_SEL ----- ----- ----- 9 GND ----- ----- ----- CN2 番号 BP359D の信号名 CPU 信号名 CPU 機能名 コネクタピン番号 備考 1 GND ----- ----- ----- 2 SDDATA1 ----- ----- ----- 3 SDDATA0 ----- ----- ----- 4 UART_RxD PB10 UART3_TX P1-34 5 UART_TxD PB11 UART3_RX P1-35 6 GPIO6 ----- ----- ----- 7 PRST PA1 I/O P1-11 Network_Reset 8 GPIO2 ----- ----- ----- Status_LED 9 GND ----- ----- ----- 2) TMD3591AD との接続 表 1.2. 2) TMD3591AD と STM32F4 Discovery 基板との接続信号 番号 TMD3591AD の信号名 CPU 信号名 CPU 機能名 コネクタピン番号 備考 1 VCC ----- ----- ----- +3.3V 2 VCC ----- ----- ----- +3.3V 3 PRST PA1 I/O P1-11 Network_Reset 4 GPIO0 ----- ----- ----- 5 GPIO1 ----- ----- ----- 6 GPIO2 ----- ----- ----- Status_LED 7 GPIO6 ----- ----- ----- 8 M_ANA ----- ----- ----- 9 FLASH_SEL ----- ----- ----- 10 BOOT_SEL_0 ----- ----- ----- 11 UART_RXD PB10 USART3_TX P1-34 12 UART_TXD PB11 USART3_RX P1-35 13 SDATA1 ----- ----- ----- 14 SDATA0 ----- ----- ----- 15 GND ----- ----- ----- 16 GND ----- ----- ----- Status LED の接続は 飛石伝ひ I/F 基板 のページの I/F 基板の回路図を参考にしてください 4
2. TCP/IP 通信のための Network 構成 ( ローカル接続 ) ルータと PC および CPU 基板の接続は次のようになります ルータ WiFi モジュール BP3591 PC UART CPU 基板 5
3. プログラム実行時の動作と動作確認 1) プログラムを実行すると基板上の LED LD4( 緑 ) が 1 秒点灯 2 秒消灯で点滅します 2) プログラムの動作が開始してから BP3591 と WiFi ルータの接続が確立するのに 約 20 秒程度かかります BP3591 の GPIO2 に Status LED を接続している場合 接続確立中は 1 秒間隔で点滅します 接続が確立すると点灯したままになります ただし コンフィグレーションが行われなかった場合など 最初から点灯したままなので注意が必要です 20 秒近く点滅した後 点灯したら接続が確立したと判断するとよいと思います TCP 通信プログラム AccessTCP_Local または Tera Term を使用して TCP/IP 通信の確認を行います AccessTCP_Local は Microsoft Visual C# 2010 Express で作成したプログラムです プロジェクトを公開していますので興味のある方はご覧ください インストールして使用する方法も説明しています (TCP_Server のページ ) 3.1. AccessTCP_Local プログラムで試験 1) AccessTCP_Local プログラムの起動 AccessTCP_Local プログラムを起動すると 次のダイアログが表示されます IP Address と TCP Port Number を環境に合わせて指定してください 6
2) エコーバック この例では 送信データに How are you? と入力して [ 送信 ] ボタンをクリックした結果 エコーバックされて受信の部分に表示されています 3) LED ON/OFF a) STM32F4 Discovery 基板の場合 : LED0 : LD5( 赤 ) または LED1 : LD6( 青 ) を ON/OFF します b) 飛石伝ひ CPU 基板 の場合 : Port1-bit6 または Port1-bit7 を ON/OFF します この例では LED1 ON を送信しました a) STM32F4 Discovery 基板で実行している場合は LD6( 青 ) の LED が点灯します b) 飛石伝ひ CPU 基板 で実行している場合は Port1-bit7 が ON します 7
3.2. Tera Term で試験 1) Tera Term の起動 以前の設定が Serial port を使用に設定してあったので Cannot open COM4 のメッセージが表示されました [OK] ボタンをクリックします 2) IP アドレスの登録 メニューの {Setup} -> {TCP/IP} をクリックすると次ページのダイアログが開きます 8
ルータに設定した DHCP の静的割り当てアドレスを指定して [Add] ボタンをクリックします ここに追加されました [OK] ボタンをクリックしてダイアログを閉じます 次ページに続く 9
3) TCP/IP 接続 メニューの {File} -> {New connection } をクリックします 次のダイアログが開きます TCP/IP のラジオボタンを選択して TCP port#: に 10000 を設定します 10000 は TCP_Server のプログラムの NetParam.h で指定している番号です [OK] ボタンをクリックしてください 正常に接続されると次ページの画面になります 接続できないときはエラーメッセージが表示されます 10
4) エコーバック ABCD と PC のキーを押すとエコーバックされて画面に表示されます メモ帳で LED0 ON と書いたファイルを作成して LED0_ON.txt という名前で保存します メニューの {File} -> {Send file } をクリックして LED0_ON.txt を選択して送信すると GPIO PD14 に対応した LED が点灯します 次ページにその操作を示します 11
5) コマンド送信による LED の ON/OFF メニューの {File} -> {Send file } をクリックすると次のダイアログが開きます LED0 ON が記述されたファイル LED0_ON.txt を選択して [ 開く (O)] ボタンをクリックします 次ページに続く 12
送信した LED0 ON がエコーバックされて CPU 基板側では対応する LED が点灯します LED0_OFF.txt を送信すると LED が消灯します 4. プロジェクトの構成 Work_TCP_BP3591 プロジェクトを開いて 左側のプロジェクト エクスプローラーを開いた状態です 13
4.1. 追加したソースフォルダ 1) CommonModules 共通に使用するモジュールを記述してあります 時間待ち 文字列操作などの処理を記述しています 2) CommunicateHOST TCP/IP 通信で受信した LED0 ON などの文字列コマンドを処理します 3) Handles a) HandleTimer2 タイマ割り込みの初期化を記述しています b) HandleUART UART( 非同期シリアル通信 ) の初期化を行います 4) Network TCP/IP 通信の処理を記述しています a) Network.h Network.c TCP/IP 通信処理の一番上位のモジュールです BP3591 のコンフィグレーションを行った後 TCP/IP 通信を行います b) NetParam WiFi ルータに接続するためのパラメータと IP アドレスなどを設定します c) NetUtilities 文字列の IP アドレスを 32bit のデータに変換する処理や 32bit データを文字列の IP アドレスに変換するなど Network 処理に使用する共通処理を記述してあります 5) BP3591 : フォルダ Network の下にフォルダ BP3591 があります a) HandleBP3591 BP3591 のコミュニケーションモードを使用するための WID の書き込み 読み込みを行います b) CommunicateBP3591 UART により BP3591 と送受信する処理を行います c) ConfigBP3591 BP3591 をコンフィグレーションします d) AccessBP3591 受信データからフレームデータを取り出し 種類により処理します TCP Server としての処理を行い 受信したコマンドデータの処理を行います 6) UserPrograms Status LED, LED0, LED1 のポート初期化と Status LED の点滅処理を記述しています 14
4.2. フォルダ main 1) main.c a) main モジュールプログラム開始のモジュールです I/O の初期化 Network の初期化および TCP/IP 通信処理を呼び出しています 2) stm32f4xx_it. タイマ割り込みと UART の割り込み処理を記述しています 15
5. Network パラメータの設定本プログラムサンプルでは WiFi ルータの SSID やアクセスのための IP アドレスなどをプログラム埋め込みにしているため 使用環境に応じて 設定部分を変更する必要があります 5.1. WiFi ルータの設定 (NetworkParam.h) NetworkParam.h 内の下記の部分を使用する WiFi ルータに合わせて書き換えてください 項目は上から SSID, SecurityKey, PinCode の 3 項目です //------------------------------------------------------ // WiFi ルータの設定 //------------------------------------------------------ // 実際の環境に合わせて書き換えてください //------------------------------------------------------ #define defssid "URoadWPS-35F14B" #define defsecuritykey "01234567" #define defpincode "76543210" //------------------------------------------------------ 5.2. TCP/IP の Port 番号の設定 (NetworkParam.h) NetworkParam.h 内の下記の部分の TCP/IP にアクセスするための Port 番号を実際に使用する番号に変更してください //------------------------------------------------------ //Port 番号 //------------------------------------------------------ // 実際の環境に合わせて書き換えてください //------------------------------------------------------ #define deftcp_serverport 10000 #define defhttp_serverport 10001 //------------------------------------------------------ 5.3. TCP/IP のアドレスの設定 (NetworkParam.c) NetworkParam.c 内の下記の部分の TCP/IP にアクセスするためのアドレスを実際に使用するアドレスに変更してください 上から IP アドレス Mask アドレス Gateway アドレスです //---------------------------------------------------------------------- // IP Address の設定 //---------------------------------------------------------------------- // 実際の環境に合わせて書き換えてください //---------------------------------------------------------------------- uint8_t GLB_uchrIP[4] = {192, 168, 100, 109}; //Source IP Address uint8_t GLB_uchrMaskIP[4] = {0xFF, 0xFF, 0xFF, 0x00}; uint8_t GLB_uchrGatewayIP[4] = {192, 168, 100, 254}; //IP Address Mask //Gateway IP Address //---------------------------------------------------------------------- 16
6. TCP_BP3591 のプログラムの構造 TCP_BP3591 のプログラムは処理番号を使用して 順次処理を行う構造をとっています 今後 紹介する HTTP Server, Mail 送信 DDNS 処理は全てこの構造になっています 6.1. 処理番号を使用したプログラムのフロー処理番号を使用したプログラムの概念的なフローを以下に示します この例ではモジュールが処理番号 0 処理番号 1 処理番号 2 の 3 個の処理で構成されています 処理番号 0 -> 処理番号 1 -> 処理番号 2 -> 処理番号 0 ->... と処理番号 0 ~ 処理番号 2 を繰り返します また 戻り値は処理中は -1 最後の処理番号の処理で正常終了時 0 エラーが発生した場合 NG : 1 以上の値を返します 開始 処理番号による分岐 処理番号 0 の処理処理番号 1 の処理処理番号 2 の処理 処理終了? NO 処理終了? NO 処理終了? NO YES YES YES 処理番号 +1 処理番号 +1 処理番号 = 0 戻り値 = -1 戻り値 = -1 戻り値 = 0 終了 17
6.2. 処理番号を使用したプログラムの形例えば 処理番号 : uint8_t uchrjobnum を用いて次のように処理します この例では 通信の処理において受信待ちをしてデータを受信したらデータの処理をして応答のための送信処理を行っています 送信処理が終了したら受信待ちに戻ります // 戻り値 : // -1 : 処理中 // 0 : OK 終了 // 1 以上 : NG 終了 int16_t 送受信処理 () { switch(uchrjobnum){ case 0: intreturn = 受信処理 (); if(intreturn == -1){ break; // 処理中 } if(intreturn > 0){ intreturn = 1; break; } //NG 終了 受信データによる処理と送信データ作成 (); uchrjobnum++; intreturn = -1; break; // 次の処理番号 // 処理中 case 1: intreturn = 送信処理 (); if(intreturn == -1){ break; // 処理中 } uchrjobnum = 0; intreturn = 0; break; // 処理番号を 0 に戻す //OK 終了 } } return(intreturn); 上記の受信処理 (); と送信処理 (); の内部も同じ構造で記述されています 戻り値が -1 の時は処理中で同じ処理番号の部分をループして 処理が OK 終了だった場合 処理番号を進めて 次の処理を行います 18
7. Network 処理モジュールの概要 Network 処理のためのモジュールについて概要を説明します プロジェクトのソースフォルダ Network のしたに 上位モジュールを記述したファイルと BP3591 をアクセスするためのモジュールが記述されたソースファイル群が格納されているソースフォルダ BP3591 があります 7.1. ソースフォルダ Network の下のファイル 1) Network Network 処理の最上位のモジュールです Network の初期化を行った後 Network 通信処理をループします a) TransaxtNetwork //---------------------------------------------------------------- //Network 処理 //---------------------------------------------------------------- // BP3591 の初期化を行った後 Network 通信処理を Loop する //---------------------------------------------------------------- // 引数 : //uint8_t *puchrjobnum : 処理番号のポインタ //---------------------------------------------------------------- int16_t TransactNetwork(uint8_t *puchrjobnum); 2) NetParam a) SetNetworkParameter Network 接続のためのパラメータ WiFi の SSID, SecurityKEY や IP アドレスなどを設定します //------------------------------------------------------------- //Set parameter for Network : //------------------------------------------------------------- // 戻り値 : // 0 : OK // 1 以上 : NG //------------------------------------------------------------- int16_t SetNetworkParameter(void); 3) NetUtilities Network 処理のための共通モジュールを記述してあります 19
7.2. ソースフォルダ BP3591 1) AccessBP3591 a) NetworkAccessBP3591 BP3591 にアクセスして Network 通信を行います //---------------------------------------------------------------------------------------------------- //Network 通信処理 //---------------------------------------------------------------------------------------------------- // 引数 : // uint8_t *puchrjobnum : 処理番号 // struct snetworkdata *pstructnetworkdata : 受信した Network データを格納する構造体のポインタ // 戻り値 : // -1 : 処理中 // 0 : OK 終了 //---------------------------------------------------------------------------------------------------- int16_t NetworkAccessBP3591(uint8_t *puchrjobnum, struct snetworkdata *pstructnetworkdata); b) TCP_AccessBP3591 TCP 通信を行います //---------------------------------------------------------------------------------------------------- //Access for TCP Server : TCP Server 通信処理 //---------------------------------------------------------------------------------------------------- // 引数 : // uint8_t *puchrjobnum : 処理番号 // struct snetworkexpect *pstructnetworkexpect : 取得するデータを指定する構造体のポインタ // struct ssocket *pstructsocket_tcp : パケットの内容をセットする構造体のポインタ // 戻り値 : // -1 : 処理中 // 0 : OK 終了 //---------------------------------------------------------------------------------------------------- int16_t TCP_AccessBP3591(uint8_t *puchrjobnum, struct snetworkexpect *pstructnetworkexpect, struct ssocket *pstructsocket_tcp); 20
2) CommunicateBP3591 BP3591 との通信処理を行います a) UART_SendBP3591 BP3591 にデータを送信します //--------------------------------------------------------------------------------------- //Network WiFiBP3591 UART 送信 //--------------------------------------------------------------------------------------- // 引数 : // uint8_t *puchrjobnum : 処理番号のポインタ // uint16_t uintlength : 送信データ数 // uint8_t *puchrdata : 送信データのポインタ // 戻り値 : // -1 : 処理中 // 0 : OK 終了 //--------------------------------------------------------------------------------------- int16_t UART_SendBP3591(uint8_t *puchrjobnum, uint16_t uintlength, uint8_t *puchrdata); b) UART_ReceiveBP3591 BP3591 からデータを受信します //--------------------------------------------------------------------------------------- //Network WiFiBP3591 UART 受信 //--------------------------------------------------------------------------------------- // 引数 : // uint8_t *puchrjobnum : 処理番号のポインタ // uint8_t *puchrdata : 受信データを格納する Buffer のポインタ // uint16_t uintlength : 受信データ数をセットする Work のポインタ // 戻り値 : // -1 : 処理中 // 0 : OK 終了 // 1 以上 : NG //--------------------------------------------------------------------------------------- int16_t UART_ReceiveBP3591(uint8_t *puchrjobnum, uint8_t *puchrdata, uint16_t *puintlength); 21
c) CommunicationReceiveBP3591 BP3591 からの受信データからフレームデータを取り出し 種類に見合ったデータを取得します //---------------------------------------------------------------------------------------------------- // 受信 BP3591 : 受信したデータの種類を識別して種類に見合ったデータを取得する //---------------------------------------------------------------------------------------------------- // 引数 : //uint8_t *puchrjobnum : 処理番号 //struct snetworkdata *pstructnetworkdata : 受信した Network データを格納する構造体のポインタ // 戻り値 : // -1 : 処理中 // 0 : OK 終了 //---------------------------------------------------------------------------------------------------- int16_t CommunicationReceiveBP3591(uint8_t *puchrjobnum, struct snetworkdata *pstructnetworkdata); d) GetReceiveDataAndSetFlag_BP3591 フレームデータから種類に見合ったデータを取得します //---------------------------------------------------------------------------------------- //Data 取得と flag セット : 受信データの種類 (WID/DATA) によりフラグをセットして種類に見合ったデータを取得する //---------------------------------------------------------------------------------------- // 引数 : //uint8_t *puchrreceivedata : 受信データが格納された Buffer のポインタ //struct snetworkdata *pstructnetworkdata : 受信した Network データを格納する構造体のポインタ // 戻り値 : // 0 : OK // 1 : NG and Continue // 2 : NG and End //---------------------------------------------------------------------------------------- int16_t GetReceiveDataAndSetFlag_BP3591(uint8_t *puchrreceivedata, struct snetworkdata *pstructnetworkdata); 22
3) ConfigBP3591 a) InitializeBP3591 BP3591 との通信に使用する UART を初期化し BP3591 をコンフィグレーションします //-------------------------------------------------------------------------------------- //WiFi BP3591 初期化 //-------------------------------------------------------------------------------------- // 引数 : // uint8_t *puchrjobnum : 処理番号のポインタ // struct snetworkdata *pstructnetworkdata : 受信した Network データを格納する構造体のポインタ // struct snetworkexpect *pstructnetworkexpect : 取得するデータを指定する構造体のポインタ // 戻り値 : // -1 : 処理中 // 0 : OK // 1 : NG //-------------------------------------------------------------------------------------- int16_t InitializeBP3591(uint8_t *puchrjobnum, struct snetworkdata *pstructnetworkdata, struct snetworkexpect *pstructnetworkexpect); b) EnterCommunicationMode BP3591 をコミュニケーションモードにします //--------------------------------------------------------------------------- // コミュニケーションモードに移行 //--------------------------------------------------------------------------- // 引数 : // uint8_t *puchrjobnum : 処理番号のポインタ // 戻り値 : // -1 : 処理中 // 0 : OK // 1 : Timeout //--------------------------------------------------------------------------- int16_t EnterCommunicationMode(uint8_t *puchrjobnum): 23
c) ConfigurationBP5391 BP3591 をコンフィグレーションします //------------------------------------------------------------------------------------ // コンフィグレーション BP5391 : 接続する WiFi の SSID や BP3591 の IP Address, Port 番号などを設定する //------------------------------------------------------------------------------------ // 引数 : // uint8_t *puchrjobnum : 処理番号のポインタ // struct snetworkexpect *pstructnetworkexpect : 取得するデータを指定する構造体のポインタ // 戻り値 : // -1 : 処理中 // 0 : OK // 1 : NG( 初期化失敗 ) // 2 : Network Parameter が FlashMemory に設定されていない //------------------------------------------------------------------------------------ int16_t ConfigurationBP5391(uint8_t *puchrjobnum, struct snetworkexpect *pstructnetworkexpect); 4) HandleBP3591 BP3591 のコンフィグレーションモードにおいて WID 書き込み 読み込みを行います WID 処理をするためのモジュールを全て記述してあります この WID 処理のプログラムは結構めんどくさいので ライブラリの感覚で使用していただくのがよいと思います 24
改訂履歴 V001 2014/01/31 初版 V002 2014/03/28 誤記訂正 25