PIC32MX

お約束ですが、このページのいかなる記載においても著者は一切の責任をおいません。

USB HOSTを試したくなりいろ調べてみた。PICでは24系を使ったページが多く まだPIC32MXを使った例はかなり少ないようである。 これはPIC24に比べて32の販売はまだ日が浅い事と、ライブラリのサンプルソースが XC32対応がされていない事が一員であるかもしれない。 また秋月で販売されているPIC32MXは容量が少ないタイプである事も原因かもしれない。

XC32はgccベースなのだが、無償版は最適化が出来ないようで、試しにライブラリの "USB Host - HID - Mouse"をコンパイルしてサイズを確認してみた。

bash-3.2$ mips-elf-size MPLAB.X.production.elf 
   text    data     bss     dec     hex filename
  60664       8     884   61556    f074 MPLAB.X.production.elf

32ではリンクできず64でもきわどく収まっている感じだ。この環境で何か作ろうと するのであれば128のタイプを使うのが良いだろう。

今時コンパイラーで金をとるビジネスモデルはどうなんだろうか?秋葉原で手に入る USBが付いた32Bit DIPはPIC32MXだけでだと思うので、最適化が出来るコンパイラーが 無償であればもっと活用されるのではないかと思うのだが。

PinguinoというArduinoと似た開発環境があり、この配布物にPIC32のgccが含まれていて こちらは最適化が通常通り利用できる。またmips16というインストラクションにも 対応しているようだ。データシートにはmips16なインストラクションを使うと40% のコードサイズの削減が可能と書ある。

MicrochipのUSB HOSTスタックをPinguino対応された方がいて、 このソース をどうにか手元の環境でビルドする事ができた。環境は microchip_solutions_v2013-06-15とpinguinoX.4-rev959とXC 1.20になる。 Makefileをmacで使えるようにした事とエラーになるのでusb_host.cで usb_hal_local.hをincludeしないようにして usb_host_local.hもローカルにコピーして、usb_hal_local.hを外し、 uart1.cのANSELCをコメントアウトした。このバイナリを確認すると、

bash-3.2$ mips-elf-size main32.elf
   text    data     bss     dec     hex filename
  22372    2136    2720   27228    6a5c main32.elf

となって秋月の、PIC32MX220F032Bにも入りそうである。ところが、このhexをMPLABXで PicKit3で焼いたところ動かない。どうも上のhexは論理アドレス(9d000000)の構成に なっていて、通常のhexは物理アドレス(1d000000)な為ではないかと思われる。困った。。。

ちなみに-mips16オプションを付けないでmakeするとリンクできません。

ld: main32.elf section `.data' will not fit in region `kseg0_program_mem'
ld: region `kseg0_program_mem' overflowed by 896 bytes

-Osを外してもリンクできない。

ld: address 0x9d00db08 of main32.elf section `.text' is not within region 
`kseg0_program_mem'
ld: region `kseg0_program_mem' overflowed by 26080 bytes

pic32progのbitbang対応 のコードを試したがうまくいかず、 本家のソースで2232のmpsse を試したところ、デバイスが認識できた。接続は以下のようにおこなった。

FT2232ピンJTAGPIC32MX220F032Pinguino
ACBUS0TCK17D22
ACBUS1TDI16D8
ACBUS2TDO18D21
ACBUS3TMS14D11
ACBUS7RESET1MCRL

IMGP0019

bash-3.2$ ./pic32prog
Programmer for Microchip PIC32 microcontrollers, Version 1.91M
    Copyright: (C) 2011-2013 Serge Vakulenko
      Adapter: Dangerous Prototypes Bus Blaster
    Processor: MX220F032B (id 04A00053)
 Flash memory: 32 kbytes
  Boot memory: 3 kbytes

プログラミングについては61145g.pdfというドキュメントに詳細がある。 いろいろ試して、結局adapter-mpsse.cを修正してmpsseのjtag処理速度を500KHzから 100KHzに変更したところ書き込みに成功した。が、何度か試している動いたり動かなか ったりしている。リセットを押しながらコマンドを動かすと、Eraseまで実行されて止 まってしまい、もう一度コマンドを実行すると正常に書かれる。

bash-3.2$ ./pic32prog ../usbhost/main32.hex 
Programmer for Microchip PIC32 microcontrollers, Version 1.91M
    Copyright: (C) 2011-2013 Serge Vakulenko
      Adapter: Dangerous Prototypes Bus Blaster
    Processor: MX220F032B
 Flash memory: 32 kbytes
  Boot memory: 3 kbytes
         Data: 24508 bytes
        Erase: done
Program flash: .................................................................
................................................................................
################################################ done
 Program boot: ######## done      
 Verify flash: .................................................................
................................................................................
################################################ done
  Verify boot: ######## done       
Rate: 3189 bytes per second

pic32progはそれほど古いコードでもないのにlibusbの0.1系で書かれている。 そもそもFTのライブラリを使っていないのはなにかわけがあるのだろうか。 urjtagでも見てみた。リセットを押しながら試すと以下のようにCPUのIDが 表示されます。

jtag> detect
IR length: 5
Chain length: 1
Device Id: 00000100101000000000000001010011 (0x0000000004A00053)
  Unknown manufacturer!

昔、自分がFT用に移植した wrt54g.cでも認識できた。JTAGの処理をFTのmpsseで書いたのだが、今見るとなにが なんだかさっぱりわからない。^ ^;

ところが手持ちのキーボードで試したところ残念な結果に。

***** Microchip Explorer USB Keyboard Host Demo  *****

Device Detached 

***** USB Error - hubs are not supported *****
HUB対応したソースが見つかったが未確認。 usbhost_mouseの方も試してみた。
***** Microchip Explorer USB MOuse Host Demo  *****


HID: Raw Report  00-FD-00-00-
  Left Bt :  00
  Right Bt :  00
  X-Axis :  00
  Y-Axis :  00

PIC24とPIC32にはEEPROMが付いていないので、不揮発なデータはFlashに保存して おく必要がある。PIC24の場合は以下のようなコードになるようだ。

	NVMCON=0x4042;
	TBLPAG=((PROG_ADDR1 & 0x7f0000)>>16);
	addrOffset=(PROG_ADDR1 & 0x00ffff);

	__builtin_tblwtl(addrOffset,0x0000);

	asm("DISI #5");
	__builtin_write_NVM();

	//store BD_address of PC in program memory
	// (memory addresses are PROG_ADDR1 and PROG_ADDR2 )
	NVMCON=0x4003;
	TBLPAG=((PROG_ADDR1 & 0x7f0000)>>16);
	addrOffset=(PROG_ADDR1 & 0x00ffff);
	asm("tblwtl.b %1, [%0]": "=r"(addrOffset) : "d"(buf1[8]));

PIC32についてはxc32に入っているライブラリファイルで実装できるようだ。 ファイルは/Applications/microchip/xc32/v1.20/pic32-libs/peripheral/nvm/source の下にある。使い方の説明はMicrochipのドキュメントAN1543にある。

PIC32MXでCambridge Silicon Radio Ltd.の4.0LEのUSBドングルを使って辻見さんの LEのスタックを動かしてみたがうまく動かない。。。

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

GEN: USB Generic Client Initalized: flags=0x00 address=1 VID=0x0A12 PID=0x0001
Generic demo device attached - event, deviceAddress=1

HCI_CMD_RESET: 03 0C 00 
HCI_CMD_RESET: 0E 04 01 03 0C 00 
HCI_CMD_READ_BD_ADDR: 09 10 00 
HCI_CMD_READ_BD_ADDR: 0E 0A 01 09 10 00 0D 71 DA 7D 1A 00 
HCI_CMD_MASK: 01 0C 08 2F FF FF FF FF FF BF 3D 
HCI_CMD_MASK: 0E 04 01 01 0C 00 
LE_SET_ADVERTISING_DATA: 08 20 20 13 02 01 05 03 03 12 18 03 19 C0 03 07 09 59 5
4 4B 2D 4C 45 00 00 00 00 00 00 00 00 00 00 00 00 
LE_SET_ADVERTISING_DATA_COMPLITE: 0E 04 01 08 20 00 
LE_SET_ADVERTISING_PARAMETERS: 06 20 0F 00 01 00 01 00 00 00 00 00 00 00 00 00 0
7 00 
LE_SET_ADVERTISING_PARAMETERS_COMPLITE: 0E 04 01 06 20 00 
LE_SET_ADVERTISING_ENABLE: 0A 20 01 01 
LE_SET_ADVERTISING_ENABLE_COMPLETE: 0E 04 01 0A 20 00 
LE_CONNECTION_COMPLITE_EVENT: 3E 13 01 00 45 00 01 01 1F 70 D8 12 01 4A 18 00 00
 00 48 00 05 

ACL Read: 45 20 07 00 03 00 04 00 02 87 00 
ATT_EXCHANGE_MTU_REQUEST: 45 20 07 00 03 00 04 00 03 87 00 
ACL Read: 45 20 0B 00 07 00 04 00 10 01 00 FF FF 00 28 
ATT_READ_BY_GROUP_TYPE_REQUEST: 45 20 12 00 0E 00 04 00 11 06 01 00 05 00 00 18 
06 00 09 00 0F 18 
ACL Read: 45 20 0B 00 07 00 04 00 10 0A 00 FF FF 00 28 
ATT_READ_BY_GROUP_TYPE_REQUEST: 45 20 09 00 05 00 04 00 01 10 01 00 0A 
ACL Read: 45 20 0B 00 07 00 04 00 08 01 00 05 00 00 2A 
HCI: 13 05 01 45 00 01 00 
ATT_READ_BY_TYPE_REQUEST: 45 20 0E 00 0A 00 04 00 09 08 03 00 59 54 4B 2D 4C 45 
ACL Read: 45 20 0B 00 07 00 04 00 08 04 00 05 00 00 2A 
ATT_READ_BY_TYPE_REQUEST: 45 20 09 00 05 00 04 00 01 08 1A 00 0A 

ACL Read: 45 20 0B 00 07 00 04 00 08 06 00 09 00 03 28 
ATT_READ_BY_TYPE_REQUEST: 45 20 09 00 05 00 04 00 09 03 07 00 12 
ACL Read: 45 20 0B 00 07 00 04 00 08 08 00 09 00 03 28 
ATT_READ_BY_TYPE_REQUEST: 45 20 09 00 05 00 04 00 01 08 1A 00 0A 

2014/04/03からフラッシュが64Kと128Kのチップの取り扱いが秋月で始まった。BT スタックで大きい物は32Kでは厳しかったので、とっても嬉しい。DigiKeyで購入 しようかずっと考えていたのだが、秋月の価格はDigiKeyよりも安く散財せずに よかった。

PIC32MXのフラッシュをMacで焼く方法をちょっと整理してみる。

pcm1723さんのライター ICSPPIC32UBL シリアル接続でICSPするライター。LPC1114FN28/102 版、NUC120LE3AN 版、 ATmega328P/168/88 版があるようです。PIC32UBLはWindows用の純正ツールで Mac版を作った人がいるような情報がありますが試していません。
PICKit2ICSPpic32prog Cloneを作ってみたが、pk2cmdでPIC18Fには書き込めるがなぜか、pic32progで PIC32MXには書き込めない。いろいろ確認したがよくわからないので放置
PICKit2ICSPpk2cmd MicroChipがサポート外で公開されていた、Mac用のコマンドラインツール。 pic32に対応してないので焼けないはず。 と思ったら、PIC32MX320F032HなどはReadmeのサポートリストにあった。
PICKit2ICSPMPLAB X pic32に対応してないので焼けません。pk2cmdは一部PIC32MXをサポートしている のにMPLAB Xは全くサポートされていないようだ。
PICKit2 CloneICSPpic32prog PIC18F2550で作れるようです。ネットで画像検索するといろいろな回路図が でてくる。ファームもダウンロードできるようですが、ライセンスは大丈夫なのかな。 ファームはV2.32というファームが最終バージョンです。こちらはたまたPICKit3を 持っていたので作れたが、ニワトリと卵の問題があります。
PICKit3ICSPMPLAB X Pinguinoの環境で作ったhexを焼いてみたがアドレスの問題かうまく動かなかった。
PICKit3 with scripting firmwareICSPpic32prog PICkit 3 Programmer App and Scripting Tool v3.10は非推奨になっているようだ。
JTAG Key系JTAGpic32prog FT2232を使ったライター。製品は試していないがFT2232直結だとすこぶる不安定。 バッファ入れないとダメなのかな。
FT232JTAGpic32prog改 pic32progのJTAG Key系サポートはMPSSEによるものだがBitBangで使えるようにした pic32progをすzのAVR研究さんが公開されている。
USB-BlasterやCloneJTAGOpenOCD? ALTERAのJTAGツールだが誰か使えるようにしてないかな? PIC18F14K50を使ったCloneが あり最も安いJTAGツールかも。OpenOCDで焼けるのかもしれないがOpenOCDは難しそう なので試していない。
opendous-jtag JTAGOpenOCD? at90usb162をJTAGモジュールのよう。
ByteBlaster(自作) JTAGOpenOCD? USB-パラレル変換では使えないので、Macでは使えないのだが。 そもそもパラレルポートがついているPC自体ほぼ絶滅しちゃったけど。。。

BootCampで入れているWindows 7でツールをインストールしてPICKit3 with scripting firmwareを試してみた。このツールは終了時にエラーが出ていた。scriptingモードに してpic32progを試してみたところ、下記のように問題なく使えた。ただVerifyが遅く FTの10倍くらい時間がかかってしまっている。試した後にとりあえずmplabモードに 戻してみたが、そんな事をやっている途中で、関係ないだろうが10ポートのUSB HUBの 4ポートが使えなくなってしまった。 T T

bash-3.2$ pic32prog main32.hex
Programmer for Microchip PIC32 microcontrollers, Version 1.91M
    Copyright: (C) 2011-2013 Serge Vakulenko
      Adapter: PICkit3 Version 2.0.5
    Processor: MX220F032B
 Flash memory: 32 kbytes
  Boot memory: 3 kbytes
         Data: 30092 bytes
        Erase: done
Program flash: .................................................................
................................................................................
................................................................................
########################################################### done
 Program boot: ######## done      
 Verify flash: .................................................................
................................................................................
................................................................................
########################################################### done
  Verify boot: ######## done       
Rate: 474 bytes per second

いろいろ調べていてわかったのだがPIC32にはMX1,2系とMX3,4系それと昨年発表された MZシリーズがあるようだ。pk2cmdはMX3,4のサポートだけのようだ。MX1,2系が規模 が小さくMZが大きいようだ。

btstackをビルドしていたところリンク時に以下のようなエラーメッセージが出る。

/Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e
lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-writer.o): In function `_write_r'
:
(.text+0x1c): undefined reference to `write'
/Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e
lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-closer.o): In function `_close_r'
:
(.text+0x14): undefined reference to `close'
/Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e
lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r'
:
(.text+0x18): undefined reference to `fstat'
/Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e
lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-isattyr.o): In function `_isatty_
r':
(.text+0x14): undefined reference to `isatty'
/Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e
lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-lseekr.o): In function `_lseek_r'
:
(.text+0x1c): undefined reference to `lseek'
/Users/hiroki/Develop/Device/pinguinoX.4-rev959/macosx/p32/bin/../lib/gcc/mips-e
lf/4.6.2/../../../../mips-elf/lib/libc.a(lib_a-readr.o): In function `_read_r':
(.text+0x1c): undefined reference to `read'
collect2: ld returned 1 exit status
make: *** [all] Error 1

いろいろ調べたらatt_server.cのatt_server_init()にある、以下の処理に起因してい ることがわかった。

	sm_register_packet_handler(att_event_packet_handler);

	att_dispatch_register_server(att_packet_handler);

関数ポインタをinclude/btstack/btstack.hで定義されているbtstack_packet_handler_t を渡しているのだがなんでだろう。。。

何の事ははくて、引数で渡している、関数の中でprintfを使っていたからだった。

btstackを新しいマイコンに移植する際にはhci_transportをUSBインターフェースに対応 させる事とhci_cpuでいくつかの関数をサポートする必要がある。

とりあえず128Kで十分だと思うが、なにか試したい物が出てきた時にすぐに使えるよう にオプティマイズさんのPIC32MX795F512L のキットを購入してみた。組み立て済みのものも売っていたが貧乏性なのでちょっと 安いキットを購入してみた。表面実装の部品のキットだが、パターンも広く思ったより も簡単であった。ランニングエレクトロニクスさんにもPIC32MX695F512Hを 使ったモジュールがあるが 小さいがちょっとだけ高い。

Macのビデオを調べていたら UVCカメラドライバーの製作 PIC24F/PIC32MX というページが見つかった。時間が出来たら試してみたい。

platformioというツールでESP8266やMSP430のビルドをおこなってうまくいっている ので、PIC32MXも試してみたが、toolchain-microchippic32 @ ~1.40803.0がないという エラーで使えない。darwin_i386用のパッケージが用意されていないらしい。

ケンケンのホームページ面白そう。手持ちの部品で作れそうなんで いつか作ってみたいな。


Copyright (C) 2014 Hiroki Mori All Rights Reserved.