EZ-USB FX2LPでLチカ

引き続きEZ-USB FX2LP。
早速ウゴウゴルーガ
まずは定番のLチカだ(あれ、なんだか既視感が・・・)

プロジェクトを作成

  • Keil uVision 2を起動する、最近開いたプロジェクトが開く場合には、"Project" -> "Close Project"で閉じる
  • "Project" -> "New Project..."を選択する
  • 適当なプロジェクトフォルダーを作り、プロジェクトファイルを保存する、筆者は(開発キットのルート)\Firmwareの下に"Blink"フォルダーを作り、プロジェクト名を"Blink"とした
  • "Select Device for Target 'Target 17"というウィンドウが開くので、"Cypress Semiconductor" -> "EX-USB FX2"を選択する

ライブラリー、ビルドオプションを設定する

  • "Project" -> "Components, Environment and Books"を選択する
  • 開いたウィンドウで"Folder Extentions"タブを選択する
    • "Use Settings from TOOLS.ini"のチェックボックスを外す
    • "BIN"が"C:\Keil\C51\BIN\"となっていることを確認
    • "INC"に"(開発キットのルート)\Target\Inc\;C:\Keil\C51\INC\"を追加
    • "LIB"に"C:\Keil\C51\LIB\"を追加
    • "OK"で設定を抜ける
  • "Project" -> "Option for Target'Target 1'"を選択する
    • "Output"タブの"Create HEX File"にチェックを入れる
    • "B51 Locate"タブの"Use Memory Layout from Target Dialog"のチェックを外し、"Code Range"を0x80に、"Xdata Range"を0x1000にする
    • "OK"で設定を抜ける

Lチカを実装

  • "File" -> "New..."を選択
  • 開いたテキストファイルに以下を実装
#define ALLOCATE_EXTERN
#include "fx2.h"
#include "fx2regs.h"

main()
{
	OEA = 0xFE; // set PA7 to PA1 as output, PA0 as input
	IOA = 0x00;

	while(TRUE)
	{
		if (IOA & 0x01 == 0x01) // if PA0 is "H"
			IOA = 0xFF; // set all other A port pins to "H"
		else
			IOA = 0x00; // set all other A port pins to "L"
	}
}
  • "File" -> "Save"を選択して保存する、筆者はファイル名を"blink.c"とした
  • "Project" -> "Components, Environment and Books"を選択する
  • "Project Components"タブで、"Add Files"ボタンを押し、上記で保存したファイルを指定して"Add"を押す

ビルド

  • "Project" -> "Build Target"を選択

これでCyControl.exeでフラッシュできるFWが出来上がる。
ファームウェアは"プロジェクト名.hex"となる。
早速CyControl.exeで焼いてみる。

実機に焼く

  • EZ-USB FX2LPのボードをPCに接続
  • (開発キットのルート)\Windows Applications\Application Source files\c_sharp\controlcenter\bin\Releaseの"CyControl.exe"を起動
  • "Program" -> "FX2" -> "RAM"で先ほどビルドしたFWを選択

PA0のピンは弱くプルアップされているので、この状態でPA7 - PA1はすべて"H"になっているはずだ。
LEDのアノードをPA1につなぐと点灯する。
PA0にGNDをつなぐと、LEDが消える。

EZ-USB FX2LPの開発環境を構築する

さて先日までPIC32の開発をしていたのだが、今さらPIC32では用に足りないことが分かった。
今回はHSのUSBターゲットが必要で、PIC32はFSまでしか対応していないのだ、orz。
ということで仕切り直して、EZ-USBに切り替えた。
筆者は過去にFX2を使ってUSBターゲットデバイスを実装したことがあるので、なーに、簡単簡単。
しかしそこはそれ、忘却曲線は急峻なうえ、この手のものはあちこちに地雷が埋まっている。
なかなか一筋縄では行かなかった。
しかも、PICに比べるとEZ-USBはコミュニティが小さいので、なかなか厄介であった。


まず開発に使うデバイスだが、CypressのFX2LPの開発キットCY3684はなかなかお値段がよろしい。
安いものはないかと物色していると、こんなものを発見した。

56ピンのCY7C68013Aを搭載していて、なにやらE2PROMのようなものもある。
早速購入、PCに接続・・・おや認識しないぞ?
実はこれはSaleaが以前販売していたUSB接続ロジックアナライザーのクローンらしい。
なのでamazonでも"ロジックアナライザ"などと書いてあるのね、納得。
ちなみにそちらに興味がある方はこちらを見てみるとよい。
回路図も入手できた、後人のためにGoogle Driveに保管しておく、https://drive.google.com/open?id=0B2jNhsdZggc5YXBBMnBZYVV6NkE
果たして、唯一あるジャンパがFW用のE2PROMの接続をしているらしい。
ぶちっとな、とぶっこ抜く。
これで、素のEZ-USB FX2LPとして動作するようになった。


次に開発ツールだが、これはCY3684のものがそのまま使える・・・はずだ。
こちらからダウンロードできる、http://www.cypress.com/file/135301
これを展開・実行すると、参照実装やマニュアル、ユーティリティー、ドライバからなる開発キットと、Keil uVision 2 IDEがインストールされる。
ジャンパをぶっこ抜いたEX-USB FX2LPボードをつなぐと、ドライバーが・・・導入されない。
慌てずデバイスドライバで見てみるとVIDが0x04B4、PIDが0x8613という見慣れた不明なデバイスがいるはずだ。
これを右クリックして、ドライバの更新をする。
ドライバは、(開発キットのルート)\Drivers\Win8.1\x64の下にいるものがWindows 10 64bit版なら使える。
ドライバが導入されれば、"Cypress FX2LP No EEPROM Device"という見慣れたUSBデバイスが、デバイスマネージャーで見つかるようになる。


動作確認だ。
(開発キットのルート)\Windows Applications\Application Source files\c_sharp\controlcenter\bin\Releaseの"CyControl.exe"を起動する。
昔からあったEZ-USB Control Centerの縮小版だ。
すでにEnumerateされている"Cypress FX2LP No EEPROM Device"が表示されているはずだ。
"Program" -> "FX2" -> "RAM"を選び、ファイルダイアログから(開発キットのルート)\Firmware\Bulksrcの下の"bulksrc.hex"を選択する。
すると先ほどのUSBデバイスが"Cypress FX2LP Sample Device"に化けるはずだ。
これがEZ-USB独特のRe-enumerateと呼ばれるもので、FWをPC経由で更新して、別のデバイスとしてHot Plugさせることができるのだ。
右側のペインの"Data Transfer"を選択し、左側のペインのツリーから"Cypress FX2LP Sample Device" -> "Configuration" -> "Interface 0" -> "Alternate Setting 0" -> "Bulk out endpoint (0x02)"を選んで、"Transfer Data-OUT"を押すと、Endpoint 0x02にバルク転送で512byteの0x00が転送される。
うまく動作していれば、"BULK OUT transfer completed"が表示される。

PIC32でUSB HID

再びPIC32、目標のUSB HIDだ。

まず例題にあるサンプルにある"hid_basic"を試してみる。

サンプルプロジェクトを開く

  • MPLAB X IDEを起動
  • "File" -> "Open Project..."を選択
  • インストールパス(デフォルトでは、C:\microchip\hamony\v1_11")の下の"app\usb\device\hid_basic\firmware"を開き、プロジェクトフォルダーの"hid_basic.X"を開く

サンプルプロジェクトの設定の変更

  • "Projects"ペインで、"hid_basic"プロジェクトを右クリックして、"Set as Main Project"を選択
  • "Projects"ペインで、"hid_basic"プロジェクトを右クリックして、"Set Configuration" -> "pic32mx_usb_sk3_int_dyn"を選択

これでプロジェクトのデバイスやMHCのBSP情報などが更新される、判れば簡単簡単(これまた1日を要した・・・orz)

MPLAB Harmony Configuratorの設定

  • "Tools" -> "Embedded" -> "MPLAB Harmony Configurator"を選択
  • "Options" -> "BSP Configuration" -> "Use BSP?"をチェック
  • 下に"Select BSP To Use For PIC32MX470F512L"が出るので、サブツリーを開いて、"PIC32MX USB Starter Kit 3"にチェックが入っていることを確認
  • 上のセーブボタンを押す
  • 上の"Generate Code"ボタンを押す

ビルド

"Production" -> "Build Main Project"を選択

実機に焼く

  • PIC32 Starter Kit III(SK3)をPCにつなぐ
  • "Run Main Project"ボタンを押す
  • フラッシャーの選択画面が出るので、"Microchip Starter Kits" -> "Starter Kits(PKOB)"を選択する

PIC32をUSB HIDとして接続させる

実はここまでの作業では、PIC32に接続しているのではなく、ボードの裏側にフラッシュ、デバッグ用に搭載されているPIC24に接続している。
上記の作業でPIC32のFWが更新され、USB HIDとして動作するようになっているので、接続を変更する。

  • PIC32 SK3をPCから外す
  • PIC32 SK3からUSB mini Bケーブルを外して、代わりにUSB micro Bケーブルをつける、コネクターは基板裏面にある

初めに基板のPKOBのLEDが点灯し、しばらく経つとPIC32の電源のLEDとLED3が点灯、PCのデバイス認識が終わるとLED2も点灯するはずだ。
PCのデバイスマネージャーで見てみるとVIDが0x04D8、PIDが0x003Fのデバイスが認識されているはずだ。
これがUSB HIDとして認識されたPIC32 SK3だ。

テストソフトの起動

C:\microchip\hamony\v1_11\app\usb\device\hid_basic\binに"GenericHIDSimpleDemo.exe"なるexeファイルがあるので、起動する。
"Connect"ボタンを押すと、PIC32 SK3と接続する。
"Toggle LED"ボタンを押すとLED1とLED2が交互に点く。
SW1を押しながら"Get Pushbutton State"を押すと、その横のラベルが"State: Pressed"となる。


この動作の実装はapp.cに書かれているので、こいつを最初はいじくり倒すのがよいだろう。

PIC32でLチカ

引き続きPIC32。
早速ウゴウゴルーガ
まずは定番のLチカだ。

プロジェクトを作成

  • MPLAB X IDEを起動
  • "File" -> "New Project..."を選択
  • "Categories"は"Microchip Embedded"、"Project"は"32-bit MPLAB Harmony Project"を選択して"Next"を押す
  • "Harmony Path"にインストールパス(デフォルトでは、C:\microchip\hamony\v1_11")を選択
  • "Project Location"はデフォルトでも良いが、ここには例題プロジェクトも入っているので、いやな人は適当なフォルダーを選択
  • "Project Name"はなんでもよい、今回は"Blink"
  • "Target Device"で、PIC32 Starter Kit III (SK3)で使用されているPIC32MX470F512Lを選択
  • "Finish"を押す

MPLAB Harmony Configuratorの設定

プロジェクトを作成するとMPLAB Harmony Configuratorが開く。
後で開きたい場合には、"Tools" -> "Embedded" -> "MPLAB Harmony Configurator"を選ぶ。

  • "Options" -> "BSP Configuration" -> "Use BSP?"をチェック
  • 下に"Select BSP To Use For PIC32MX470F512l"が出るので、サブツリーを開いて、"PIC32MX USB Starter Kit 3"にチェックが入っていることを確認
  • 上のセーブボタンを押す
  • 上の"Generate Code"ボタンを押す

これでボード特有の設定や、API、変数が定義される、判れば簡単簡単(1日を要した・・・orz)

Lチカを実装

  • MPLAB X IDEの"Projects"ペインから"Source Files" -> "app" -> "app.c"を開く
  • "APP_Initialize"に以下のコードを追加
BSP_Initialize();
  • "APP_Tasks"の "case APP_STATE_INIT:"を以下のように変更
        case APP_STATE_INIT:
        {
           /*
            bool appInitialized = true;
       
        
            if (appInitialized)
            {
            
                appData.state = APP_STATE_SERVICE_TASKS;
            }
            */
            if (BSP_SwitchStateGet( BSP_SWITCH_1 ) == BSP_SWITCH_STATE_PRESSED)
                BSP_LEDToggle( BSP_LED_1 );
            break;
        }
  • 変更を保存

ビルド

"Production" -> "Build Main Project"を選択

実機に焼く

  • PIC32 SK3をPCにつなぐ
  • "Run Main Project"ボタンを押す
  • フラッシャーの選択画面が出るので、"Microchip Starter Kits" -> "Starter Kits(PKOB)"を選択する

PIC32の開発環境を構築する

ちょいと頼まれで、USB HIDデバイスを開発することになった。
以前にCypressのEZ-USBを使ったことがあるので、それを軸に考えていたのだが、世の中ではPICをお使いの方のほうが圧倒的に多いようだ。
そこで、バックアップとしてEZ-USBを注文した上で、今回はPICを使ってみることにした。
PICでUSBといえばPIC18、もしくは16bit化されたPIC24が人気なのだが、なにをとち狂ったかPIC32を選択した。
(これが不幸の始まり)

実際には、これの最新バージョン、Starter Kit III(SK3)を購入した。
(さらに大きな過ち)


さてPICの開発環境だが、古よりMPLAB IDEがある。
これが近年刷新されて(ほら来たよ)MPLAB X IDEとなった。
これはIDE本体、PIC32用のコンパイラXC32、そしてデバイスコンフィグレーションのUIツールHarmonyからなる。
こいつをまずPCにインストールする。
今回試用したバージョンはそれぞれ

  • MPLAB X IDE: 3.65
  • XC32 Compiler: 1.43
  • Harmony: 1.11

だ。
それぞれMicrochipのサイトからダウンロードしてきて、順に黙々とインストールする。
Harmonyのインストールが完了するとMPLAB X IDEへのプラグインのインストール方法が表示される。

  • まずMPLAB X IDEを開く
  • "Tools" -> "Plugins"を選択
  • "Available Plugis"タブを開く
  • "MPLAB Harmony Configurator"にチェックを入れ、下の"Install"ボタンを押す


終わったら、PIC32 SK3をPCに接続する。
PIC32 SK3にはUSBの口が3つある。
今回はmini B(micro Bではない)につなぐ。
IDEをインストールした際にドライバもインストールされているので、問題が無ければデバイスマネージャー上に"HID準拠ベンダー定義デバイス"として認識される。
念のため、プロパティを開いて、VIDが0x04D8、PIDが0x8107になっていることを確認する。


さてなぜあちこちに煽り言葉が入っているかというと、ドはまったからだ。

  • PIC32 SK3はMPLAB IDEではサポートされていない、インターネットに公開されている過去の資産が使えない
  • MPLAB X関連のドキュメントが少ない、MPLABから移行した人にとってからは簡単、初めから始めると地獄

ということでTo Be Continued...

GPD Pocket、旅に出ます(探さないでください)


実は配送されたGPD Pocket、"D"の入力が渋く、普通にタイプすると20-30%ぐらいしか入らない。
何度かGPDの担当とやり取りし、入力しているビデオなど症状も送ったところ、修理対応をしてくれることになった。
出荷で大わらわのところ、大変ありがたい対応だ。
ということで、一週間遊び倒したGPD Pocketは一時帰国となった。
その前に、ユーザーデータを初期化した。


Windows 10からはユーザーデータの初期化はとても簡単にできる。
"設定" -> "更新とセキュリティ" -> "回復"から、"このPCを初期状態に戻す"を選べばよい。
あとはいくつかある選択をすれば、きれいにワイプしてくれる。
一時間弱で作業は終わり、サラのPCとして再起動する。


GPD Pocketは物理的にはポートレートのディスプレイを使っている。
つまり横1920x縦1200ではなく、横1200x縦1920だ。
なので、デフォルトの状態では左に90°回った状態で表示される。
初期化が終わるとこの状態だ、見難いことこの上ない。
なんとか必要な設定が終わってデスクトップが表示されたら、デスクトップを右クリック -> "ディスプレイ設定"から"向き"を"横"を選べば、見慣れた姿に戻る。

組み込みRAMーその2

さて、あまり弊ブログではあまり人気のない、しかし筆者が今ご執心なVerilogのことも書いておこう。

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?

こちらで見て分かる通り、組み込みRAMからの読み出しは、RTLシミュレーションの通り、クロック立ち上がり同期だ。
組み込みRAMへの書き込みも立ち上がりでできるかのように書いている、上記の本でもコメントで書かれている。
RAMの世界では当たり前なのだが、果たして本当だろうか?
検証してみる。
今回は、ラッパーの回路を書かず、テストベンチで直接組み込みRAMを制御する。
こちらと同じ8bits/word x 16wordsの2-portのRAMを作って、以下のようなベンチを実行する。

in_clk <= 1'b0;
in_data <= 8'haa;
in_read_address <= 4'b0000;
in_write_address <= 4'b0000;
in_write_enable <= 1'b1;
#5                                                       
in_clk <= 1'b1;
#5
in_data <= 8'h55;
#5
in_clk <= 1'b0;
#5
in_write_enable <= 1'b0;
#5
in_clk <= 1'b1;
#5
in_clk <= 1'b0;
#5
in_clk <= 1'b1;
#5

結果はこんな感じだ。

果たして、アドレス0x0にクロック立ち上がり時にデータバスに0xaaを、立ち下り時に0x55をセットすると、次の立ち上がりで同じアドレスから0xaaが読み出される。
つまり、立ち上がりで書き込んでいるのだ。