PSoCをUSB(HID)デバイスとして接続しデータを送受信する


psoc_usb_txrx_01.gif
前回の「PSoCをUSB(HID)デバイスとして接続しデータを受信する」ではPSoCからUSB経由でデータを受信した。ドライバーはWindows標準のものが自動インストールされ、EXEファイル1つで動作するものだった。今回は前回のプロジェクトをベースにPCからPSoCへデータを送信する機能を付加する。

psoc_usb_txrx_02.gif
前回のプロジェクトを開いたら「View」メニューの「Device Editor」を選択して設定画面に切り替える。

psoc_usb_txrx_03.gif
そして「USBFS_1」を右クリックして現れたメニューから「USB Setup Wizard」を選択する。

psoc_usb_txrx_04.gif
ここではUSBプロトコル関連の設定をする。前回はPSoCからPCへの送信のみだったが、今回はPCからPSoCへの送信も行う。そのための設定をする。
USBではデータの送信先や受信先に対して「エンドポイント」が割り当てられる。PSoCの「USBFS」では最大4つのエンドポイントを扱える。まずこのエンドポイントを追加する。
「Interface Descriptor」の右側にある「Add Endpoint」をクリックする。

psoc_usb_txrx_05.gif
するとエンドポイントが新たに追加される。ここで「Endpoint Number」を「EP2」に、「Direction」を「OUT」にする。
「Direction」(方向)はホスト、つまりPC側を基準に考える。ここでは「OUT」(出力)に設定したが、これは「PCからデータを出力(=PSoCで受信)」という意味になる。

psoc_usb_txrx_06.gif
次にPCからPSoCへ送信するデータ書式の設定をする。
「HID Report Descriptor Root」の中にある「Collection」を開き、「End Collection」の1つ上の行にあたる「Input」の行の「Insert HID Item」をクリックする。

psoc_usb_txrx_07.gif
すると行が1つ増える。ここで項目名から「Usage Minimum」を選択する。

psoc_usb_txrx_08.gif
これで「Usage Minimum」という項目が追加された。さらに「Usage Minimum 18」というリンクをクリックする。

psoc_usb_txrx_09.gif
そして「Size」を「1」に、「Data[0]」を「01」に設定する。

psoc_usb_txrx_10.gif
すると「Usage Minimum 18」というリンクだったものが「Usage Minimum 19 01」に変わった。
さらに新しくできた行の「Insert HID Item」をクリックする。

psoc_usb_txrx_11.gif
今度は「Usage Maximum」を選択する。「Minimum」ではないので注意しよう。

psoc_usb_txrx_12.gif
そして「Usage Maximum 28」のリンクをクリックして...

psoc_usb_txrx_13.gif
「Size」を「1」に、「Data[0]」を「02」に設定する。すると「Usage Maximum 28」が「Usage Maximum 29 02」に変わる。

psoc_usb_txrx_14.gif
同様に
「Logicacl Minimum」は「Size」を「1」に、「Data[0]」を「80」に、
「Logicacl Maximum」は「Size」を「1」に、「Data[0]」を「7F」に、
「Report Size」は「Size」を「1」に、「Data[0]」を「08」に、
「Report Count」は「Size」を「1」に、「Data[0]」を「04」に、
「Output」は「Size」を「1」に、「Data[0]」を「02」に設定する。

これらの設定の意味は"0x80~0x7F(Logicacl Minimum~Maximum)の範囲でデータサイズが8ビット(Report Size)の数値を4つ(Report Count)、出力用途(Output)として確保する"ということになる。これらの項目の意味はHIDの規格書に掲載されている。

psoc_usb_txrx_15.gif
USB Setup Wizardによる設定が済んだらソースコードの編集をする。「View」メニューの「Application Editor」を選択して編集画面に切り替える。

psoc_usb_txrx_16.gif
今回はPSoCが受信したデータをそのままPCへ送信する処理とした。ただし、PSoCの受信データは先に設定した通り4バイトだが、PSoCの送信データはUSBマウスと同じ3ビット+2バイト(3つのボタンとXYの移動量)のデータのため、PCからPSoCへ送信されたデータのうち最後の1バイトは利用されない。


//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules

void main()
{
int i;
BYTE pData[] = {0,0,0,0,0};

M8C_EnableGInt;
USBFS_1_Start(0,USB_5V_OPERATION);

while(!USBFS_1_bGetConfiguration());
USBFS_1_LoadInEP(1,pData,3,USB_NO_TOGGLE);
USBFS_1_EnableOutEP(2);

while(1)
{
if(USBFS_1_bGetEPAckState(1))
{
USBFS_1_LoadInEP(1,pData,3,USB_TOGGLE);
}
if(USBFS_1_bGetEPAckState(2))
{
USBFS_1_bReadOutEP(2,pData,4);
USBFS_1_EnableOutEP(2);
}
}
}





psoc_usb_txrx_17.gif
これでPSoCへ書き込み、USBケーブルで接続する。そして前回作成したPC側のクライアントソフトを起動する(前回のページからダウンロードできます)。
「ベンダーID」と「デバイスID」をともに「FFFF」として接続する。するとPSoCと接続できた。PSoCからPCへの送信データサイズは4バイト、PCからPSoCへの送信データサイズは5バイトとなっている。1バイト大きく表示されているが、これはHIDの仕様として1バイト目をレポートID(0x00固定)としているためだ。

psoc_usb_txrx_18.gif
送信データを5バイト用意して「送信」ボタンを押す。するとデータがPSoCへ送信される。

psoc_usb_txrx_19.gif
「受信」ボタンを押してPSoCから送られてきたデータを受信すると、先ほど送信したのと同じデータ(ただし末尾1バイトが切れているデータ)が表示された。

トラックバック

この一覧は、次のエントリーを参照しています: PSoCをUSB(HID)デバイスとして接続しデータを送受信する:

» PSoCをExcelのマクロ機能(VBA)だけでUSB制御する 送信元 dinop.com
前回と前々回はUSBを内蔵したPSoC「CY8C24794-24FLXI」をヒ... [詳しくはこちら]


カテゴリー「電子工作」 のエントリー