2012年10月13日

MachXO2ボード秋月で取り扱い開始!

MachXO2 1200ZE Breakout Board を秋月が取り扱い開始した。2600 円と FPGA ボードにしては安い。FT2232H 搭載で FT2232H 単独のボードより安いぐらい。今まで記事を書いてきたが、手軽に入手できるようになって嬉しい。

    追記 2013/04/26
    秋月の MachXO2 Breakout Board が 1200ZE → 7000HE にグレードアップ。価格は 3000円。

    規模は、1280 LUT → 6864 LUT と大幅に増えた。価格はあまり変わらない。

    規模が増えるとブロック RAM も増える。26個 26KB だが、Lattice では多いほう。あと HE だから 速度的には有利(というか普通)になった。

    調べてないけど、たぶんチップを置き換えただけで、前のと互換性がある(はず)。

この機会に Lattice の FPGAボード (興味があるもので 現行品)についてまとめておこう。

MachXO2 1200ZE Breakout Board [LCMXO2-1200ZE-B-EVN]
MachXO2 7000HE Breakout Board [LCMXO2-7000HE-B-EVN]



    ・秋月 2600 円
    デジキー : 2593円
    ・Mouser: 2572円
    ・秋月 3000 円
    デジキー : 3035円

    追記 2013/04/26
    1200ZE → 7000HE にグレードアップ 旧製品はなくなった。秋月価格は 2600円 → 3000円だが 円安が理由。デジキーで見るとチップ単価は、1200ZE 886円→ 7000HE 1462円。

    さて、7000HE となったことは、大変喜ばしい。1200ZE で CPU を作ると規模がネックで厳しかったのが解消される。それだけではない。2組の CPU を入れて通信してみることもできる。同期させても良いが、外部に一旦出して 引き込むことにより非同期もテストできる。SDRAM を付けて、キャッシュ付き 32bit CPU なんてのも可能だろう。いずれトライしてみたいものだ。

MachXO2 Pico Development Kit [LCMXO2-1200ZE-P1-EVN]

LatticeXP2 Brevia2 Development Kit [LFXP2-5E-B2-EVN]

MachXO 2280 Breakout Board [LCMXO2280C-B-EVN]

まず、Lattice 社の開発ツールの Lattice Diamond は、他社のものと比べると 専有 DISK 容量が少ない。普段使っている SSD の ノートPC に入れられるので重宝している。容量が少ない理由のひとつは IP が膨大ではないこと。使い勝手はむしろ良いと思う。容量が第一の理由で Lattice で済むものは Lattice にしている。

    というか当面 Lattice を使う予定。XilinX はまたいずれ。

    初心者むきかというと .. そうでもあり、そうでもないような ... 。XilinX だと 分からない メッセージがあっても、ググれば見つかったりするが、Lattice はその面でだいぶ厳しい。開発ツールは使いやすいと思うしその点は残念。秋月での取り扱い開始で、使う人が増えて、情報が増えることを切に願う。

Lattice FPGA の中で MachXO2 は、FLASH 内蔵だし、ブロックRAM がそれなりにあるし、結構使いやすい。乗算マクロがないとか、シフトレジスタの規模が極小にならないとか Dual-Port の ブロックRAMのコストが大きいとか、少々不満はあるが、良い点も多いのだ。

良い点としては、クロック内蔵で お手軽。QFN32 や LQFP のパッケージがあって、電子工作でボードを起こしやすい。FLASH 内蔵とか レギュレータ内蔵なのも、電子工作にはメリット。さらに、JTAG を通じて通信できる。XilinX と同じ機能が使えるのは便利。

以上はチップについてだが、上記の開発ボードは、もれなく FT2232H 採用の USB ポート付き。しかも安い。USB に差し込むだけで使えるし、とにかくお手軽。

    これらのボードには JTAG コネクタも付いている。JTAGENB にスライドスイッチを付け、JTAG を無効にするコンフィグを書き込めば、出力としての転用も可能。-- 要するに JTAG ケーブルにできるのだ。( LCMXO2280C-B-EVN 以外)

LFXP2 は、使ったことがないのだが、乗算マクロがあるし、LFXP2-5E-B2-EVN では SRAM も付いている。ちょっと興味がある。(ただ、プロセッサを設計するときしか必要ないし、当面は手が回らない。)

LCMXO2280C-B-EVN は、MachXO で古い。ブロックRAM も少ない。だが、これもメリットがある。I/O ピン 数が多いのだ。こういう BGA のチップを 電子工作で使うわけには行かないので、ありがたい存在。

紹介したなかで、お薦めなのはやっぱり LCMXO2-1200ZE-B-EVN ではないかと思う。余計なものは付いていないしすなお。スイッチを組み込めるエリアもある。4000ZE/7000ZE といった大規模チップに換装可能だと思うし改造の楽しみもある。

関連記事
posted by すz at 18:44| Comment(0) | TrackBack(0) | MachXO2

2012年10月08日

JZ47XXのリファレンスデザインから

JZ47XX というのは、中国の Ingenic という会社が作っている MIPS SoC 。MIPS 版 Android では JZ4770 というチップが採用されていたので知っている人もいるかも知れない。

この会社が出している JZ4725B や JZ4755 といった (世代が古い)SoC は、0.4 mm ピッチだが LQFP で 電子工作レベルでボードを設計できるかも知れない。Programmers Manual なども ググって見つけたし、いずれは挑戦してみたいと かねがね思っている。

そんな考えでリファレンスデザインを眺めたりしているのだが、PMP は All in One だから、回路図が結構参考になる。今回はちょっと紹介してみたい。

参考書は、RD4725B VOLANS 。(もう新規設計を推奨しておらず、メーカーページからのリンクがなくなっている .. のだが、ググると見つかる)

    RD4755 CETUS
    RD4760 LEPUS
    RD4770 PISCES

    これらは、現行のチップ用リファレンスデザイン。

    RD4725B VOLANS は、ftp://ftp.ingenic.cn/2soc/4725B

    ここにあるが、どうもサーバーが重いような。

LED バックライト



    LED がパラレルになっている LCD バックライト用の回路。電流制限抵抗を入れるだけ ... みたいないい加減なことはしていないのだ。電源電圧が 3.3V しかないと 電流制限抵抗では調整が難しいためだ。

    で、この IC は KB5239D となっているが、パーツリストの ID のようだ。でも、8 pin で 4 出力の LED ドライバというものがある ... というだけで随分ヒントになる。

    デジキーで探してみると ... 例えば、CAT4104V なんてのが見つかる。ピン配置は違うのだが、PWM で 平均電流を 制限してくれる。なかなかに良さそう。コントローラ側でさらに PWM をかけることも出来る。ここで使われているのも同じようなタイプだろう。

    他には、PCA9633DP1 とか。こちらは I2C で制御するタイプ。

    実際の PMP で、ここまでやっている 製品は少ないだろうとは思うが、電子工作では、こういうのを積極的に使いたいところ。

      単にパラレルにすると Vf のバラツキのために、明るさに偏りが出るかも知れない。個別に PWM で調整することは可能だが、メインの MCU の リソースを割くのはもったいないし、ノイズを分離できない。

      ここは、専用 IC にまかせてしまうのが良さそうに思える。

スピーカーアンプ



    8 pin の BTL アンプが PMP ではよく使われている。(LM4890 か 互換品) ピンアサインは同じでも D 級のタイプもある。( これはリニアのタイプかも) 。それはともかく、入力部分が気になった。

    ヘッドホン用のステレオ出力を ひとつにして、アンプの ON/OFF で スピーカー出力を制御している。普通といえば普通なのかも知れないのだが、デジタル系ばかりやっていると どう回路を組めば良いかイメージできないかも知れない。

    あと電源に 1 Ωが入っている。RC フィルタにして ノイズ対策しているようだ。 負帰還用の抵抗が NC になっているのも気になる。これで良かったのだっけ? ... 普通に ゲイン 1 倍の 51K を付けるのでは? Rail-to-Rail でないのなら 少し大きい値。

ヘッドホン出力



    ヘッドホンだと 220uF ぐらいが普通なのだが、これは 47uF しか使っていない。100 Ωを入れて 出力を落とせば 47uF でも まぁなんとか。表面実装の 220uF なんてのは結構高いし、へたなものを使うぐらいなら こっちの方が良いのかも。

マイク



    10 KΩ + 1uF で 電源ノイズをカット。で、4.7k Ωで改めてバイアス。... これも知っている回路と違う。なるほどという感じ。

キー



    これは、ADC を使った回路。JZ4725B は、128 pin の IC なのだが GPIO が全然足りない。少しでも節約するためにこうなっている。

FM モジュール周り



    FM モジュールは使ったことがなく良くは知らないのだが、これもまた電源周りに工夫が見られる。10 Ω + 1uF の RC フィルタが 2 段。AVR とかでも ADC を使うなら これぐらいやった方が良いのかも。

    GND の方は、0 Ωだが、本来入れるべきなのは? チップフェライトビーズとか?

      これは、10 Ωとか。AVCC と対称で良さそう。実際 他の RD で 10 Ωになっているものがあった。

    そういえば、PIC32MX は、RC 1 段が データシートに載っていた。AVR の場合は LC が載っている。

電源 IC



    電源はスイッチングレギュレータ。PMP では、SOT23-5 の IC が 良く使われている。VCORE 用は当然としても、3.3V 用でも リニアレギュレータをメインにしているのは見たことがない。(RTC 用には 使われたりする) 。インダクタに 10uH というのを良く見るのだが、これは 3.3uH でスイッチング周波数が高いタイプのようだ。

アナログ系電源



    コンデンサの前に BKP1608HS121 (デジキーで 100個 368円) というのが入っている。ググると 太陽誘電製で、インピーダンス 120 Ω。秋月だと チップフェライトビーズ BLM18RK121SN1 (120 Ω)が近そうな気がするけど、定格電流が全然違う。それでも 抵抗いれるより全然まし?

    あと水晶周り。どうも ただの CMOS インバータで発振させる定数のように見える。-- 32KHz だと 10M なのか -- 1M でも問題ないと思うが 消費電流を減らしたければ 値を大きくできる。

MicroSD カード



    プルアップとかは、SoC 側に付いているのだろう。で、CLK だけ直列に抵抗が入っている。ちょっと気になった。

RD4725B はこんなところ。他の RD についても、紹介したいものが見つかれば追記しておこうと思う。

あと、他のメーカーの回路図は見ていないのだが、設計する人によって特色があるかも知れない。見比べてみるのも勉強になりそうだ。

追記: RD4755 CETUS

ようやくダウンロードできたので、見てみることに。

VGA



    JZ4755 は、JZ4725B とほぼ同じ世代なのだが、JZ4755 は大分機能が多い。そのひとつが VGA 出力。こんな風に RD にもコネクタがある。(2 段だから PC 用ではない?) 。そして、これ以降の JZ4760/JZ4770 は HDMI になったので もう VGA のサポートはない。ちなみに 他の JZ47XX は、2ch しかないので、S-Video 出力までにしか使えないのだが、これだけ 3ch あって VGA が出力できる。

    で、どんな風にインターフェイスしているのか。



    I2C は、FB(フェライトビーズ)を通したり、コンデンサ(120pF)を付けたり。



    VSYNC/HSYNC も同様 。それはともかく、これだと LCD と 排他で使うのだろうか? それとも 同じタイミングで出力?



    さて、映像出力はこんな風になっていた。75 Ω と 15pF を GND の間に入れてから FB を通す。そしてまた 15 pF 。いまさら VGA でもないのかも知れないが ....

ヘッドホン出力



    これは ... ただの直結。コンデンサを省けるように ステレオ化した BTL(?) になったのだが、こんなもので良いのだろうか? 気になったので、RD4760 LEPUS と RD4770 PISCES も見てみた。


    (RD4760 LEPUS)

    (RD4770 PISCES)

    RD4760 LEPUS は、なんか変。220uF ものコンデンサを入れてたり、やりすぎ? RD4770 PISCES だと ESD5B5V というのが GND との間に入っただけ。(AOHPR の方も入っている。図からはみ出た)。ESD5B5V はクランプしてくれる保護回路という理解で良いのだろうか? ツェナー x2 と同じ?

    RD4770 になると ESDxByV がやたらめったら入っているのだが ... 結構安いものなのだろうか?

    あ、参考になりそうなのは、イヤホンを FM アンテナにする所。RD4725B では、HPM ではなく GND なので、 FB を GND との間に入れて その前段を アンテナ入力にしている。

RD4760 LEPUS と RD4770 PISCES

先に出してしまったが、RD4760 LEPUS と RD4770 PISCES というのもある。

JZ4760 以前は、400 MHz 程度が上限の コアだったのだが、JZ4760 で 600 MHz 程度と周波数が一段回上がった 。SDRAM も DDR2 対応に。周辺回路もまた大きく変わっている。JZ4770 は、1.2GHz とまた 周波数が一段回上がったのだが、 周辺回路はわりと JZ4760 に似ている。

スピーカー


    (RD4760 LEPUS)

    (RD4770 PISCES)

    RD4760 は、専用出力を直結。これもあんまりだ。こうなってくると参考にならない。RD4770 はまとも? 負帰還用の抵抗はちゃんと入っている。ただ、IN+/IN- 入力に BTL の出力をそれぞれ入れている。そうした方が良いのか出来るからそうしただけなのか? ESD5B5V まで入っている。専用 IC にそんなものが必要なのだろうか?

GPS



    回路の一部だけ 載せたが、RD4760 LEPUS と RD4770 PISCES の両方 GPS が載っている。しかもモジュールではなくて、直付け。回路図なんて初めて見たかも。

    それはともかく、気になったのは、TCXO 0.5 ppm 。GPS には、精度の良い オシレータが載っているらしい。16.367667 MHz とはまた 数字がやたら多い。

    デジキーなんかで探すと 16.368 MHz とかの TCXO がわりと安く買える ... のだが周波数が 使いにくい。16368 = 16 x 1023 。16.3676.. と続くなら 16 x 1022.98 とかそんな値。

おまけ: 中国で買える SoC とか

    中国のショッピングモール taobao は代行を通さないと買いにくいのだが、様々な SoC を扱っているショップもある。たとえば ここ

      Allwinner A10 50.00 元
      RockChip RK2918 40.00 元
      RockChip RK2706B 15.00 元
      Ingenic JZ4725/JZ4725B 15.00 元

    A10 や RK2918 は Android タブレットで使われている SoC で GHz クラスの ARM 。BGA だから電子工作は無理なのだが、実際に 1 個単位で買えてしまう。50 元だと x12.5 で 625 円ぐらい。JZ4725/Z4725B は 0.4mm ピッチ 128 pin なので 電子工作 可能な範囲。RockChip の旧世代も良さそうなのだが、Programmers Manual が手に入らないしパス。

      Allwinner A13 が、QFP だという 情報が ... 多分 0.4mm ピッチ 176 ピン - 電子工作レベルで扱えるかも。もし SATA が (A10 同様に)付いていてデータシートが入手できるのなら、欲しくなってしまう。

    JZ4725/JZ4725B については、データシートとか SDRAM とか 入手済み。いずれは.. と思っている。だが、現行品では なくなってしまっているので、この機会に JZ4725/JZ4725B を入手しようかと思う。

      ついでに書くと、リンク先のショップは、PMP に使われる IC とかも 扱っている。やたら安いので一見の価値はありそう。5121 は ZX5121 LED バックライト用昇圧 IC 。LM4890 は上記でも出ているスピーカアンプ。662K は、3.3V レギュレータ。A18 は、上記の 1.8V スイッチングレギュレータ。4101 は、リポ電池充電 IC PT4101 もバックライト用昇圧 IC 。全部は分からないが メジャーなものの率が高い。こういうものは、PMP 以外でも 有用。まぁ品質上のリスクはあるが、興味深い。

    ただ問題は、JZ4725/JZ4725B が区別なく扱われていること。物理的にはピンの互換性があるのだが、中身は全然違う。SD からブートできる B が欲しいのだが ...

    ついでに書いておくと taobao で JZ4725 を検索すると PMP の メインボードが見つかる。以前も紹介したのだが、SDRAM と NAND FLASH が 付いていないもの。23 元で入手したのだが、JZ4725 採用の新品。そのままで USB Boot は出来た。(32KB のキャッシュだけで動かす)。



      SDRAM は新品では割高だったり入手が難しいのだが、今は、メモリモジュールから外すつもりなら結構安く入手できる。これなんかだと 16Mx16 が 4 つ載っている。 16 bit 幅でないといけないし、ぼちぼち 入手が難しくなっているので、いずれ使おうと思ってるのであれば 入手しておくと良いかも知れない。

      FLASH は、必要なら 手持ちの適当な 装置やらモジュールやら から外すつもり。ただ、スタンドアローンで動かさないなら 不要。



      今みると おなじものを 10 元で売っているところがある! 写真は確かに手に入れたものと同じ。(ということは無印 JZ4725)。まぁ、ついでだから買い増ししようかと。これもいずれ、ちゃんといじって記事に書きたい。

      Linux の ソースコードはある。ただ、古いチップだし大分手を入れないといけない上に、性能が他と比べて低いので 、Linux を動かしても面白くなさそう。だが、チップを生で使うなら ちょっとしたもの。400 Mz とかで動くし、メモリも 32MB とか使える。 LCD を付けないで GPIO として 使うと ... なにやら楽しいことが出来るかも知れない。

      0.8mm ピッチから線を引き出すのは私には結構なハードルだ。だが、0.5mm ピッチよりははるかに楽なはず。ピッチ変換基板を以前作ったので、それを利用して引き出すつもり。(わざわざ作る必要はなかったけど)

    ところで、手に入れた PMP のボードだが、サイズは、47mm x 77mm ぐらいで偶然にも 前の記事 『アルミケース三種(2)』でテーマにした aitendoo CASE-B に合うサイズ。最もサイズが合うだけで、入るわけではない。サイドのボタンをどうにかしないと無理。でもなにか考えたい。
posted by すz at 04:18| Comment(0) | TrackBack(0) | 日記

2012年09月30日

アルミケース三種(2)

アルミケース三種』の記事の続き。



aitendo のアルミケース(B)は、幅 が 50mm を僅かに超えるだけのサイズ。ちょっと基板を設計するついでに、フタにできないか検討してみた。

    フタが別売で、139 円 / 枚。50mm に収まるなら、imall.iteadstudio.com で作ると 黒基板/白シルク 10 枚で $15 $13.49 。いくつか作る場合や 汎用的なデザインなら コストに見合う。

    ついでに説明しておくと、ケースの外寸は、50mm x 20mm 。(↓の図面は、あまり信用できない。幅が 50.4 mm となっているが、50mm ジャストに思える。高さも 21mm に見えるが、 実際は、20mm 。 )



    ケース厚 1.5mm 。底面〜スロットに入れる基板 の距離は、たぶん 2.8 2.5 mm で 1.6mm の基板が入って 中央までが、4.1 4.4 mm 。上の空間は 10mm - 1.5mm = 8.5mm なので 12.9 mm までの部品高が許容範囲。

    幅は、47mm ということになる。スロットは 溝が 1mm しかないので ギリギリのサイズにする必要がある。

    奥行きは 77mm 。秋月 C 基板だと 72mm なのできっちりではなく 5mm 空く。

      訂正: 2.8mm ではなかった。

    計算上は上記の通りだが、現物で合わせてみると入らない。秋月 C 基板 は、47mm より少し大きい。またケース自体すこし内側に曲がっている。左右合計で 1 mm弱 削る必要がある。ただし、C 基板と言っても いくつか種類がある。最近のものは サイズが違うかも知れない。

    C 基板を削ってみたところ、力を入れないで入るようになった。幅は 47mm ジャスト(な感じ)。 底面との隙間は 3mm 弱で 、(L 型)ピンヘッダを仮に差してチェックしたところ僅かに隙間がある。

この基板自体は、もともとスロットに入れられるような幅で考えてみたのだが、高さも丁度良さそうなのでフタにできないかディメンジョンを検討。

多分、リューターで ケースの飛び出ている部分を少し削れば、埋め込む形のフタにもなるんじゃないかと思う。

    あと、仕切りのようにできそう。ケースを スライドさせると書いてあるが、ケース上部を、上から被せることもできる。ただ、それをして意味があるかどうか...

上記は内側の黄色い線をベースに少し修正して作る。白い外形線は、50mm x 20mm で、現在の最終型。ただし、切り代の分だけは小さくなる。

これは、電子回路用の普通の基板だが、シルクと 銅箔パターンを使って、デザイン性豊かなフタを作れそうな気がする。基板だから外形も含めて 精度は高い。穴も 6mm ぐらいの丸穴なら問題なく作れる。

    そう言えば、バナナ用の 中継コネクタで、ただの筒のような形状のものがある。(内径 2mm, 3.5mm, 4mm など)。これを直接ハンダ付けして、変なデザインの 装置(電源、オーディオ系、測定器?)を作るとか...

    あと、注意点がある。勝手にシルクに番号を入れられるので、表裏逆につくることを忘れてはいけない。

    もうひとつ注意点。ネジが別売となっているが、合いそうなものは M1.7 とか変なものしかない。... もともとネジが切ってあるのだが、特殊サイズで M1.7 ... なんだろうか? しかもネジを買い忘れた。

    ケースを切ったりすると、もとのサイズのネジは自力では切れない ... どうするのか方策を練らないといけない。タップネジにするか、径の大きな M2 で無理やり ネジを切るか?

この基板について

    これは、『8桁7セグ表示ボード』で書いた PIC32MX の コントローラ基板をベースにしている。上のコネクタは、シリアルと USB 。USB には type A 直接付けられる(かも) シリアルの部分は、ICSP のコネクタにもなる(はず)。下のコネクタは、I/O 用だが順不同。7 seg 用のつもりだったので、配線の都合を優先。

    単独の方が、面白いかと思って切り離して手を入れていったらこうなった。

    今思いついたのだが、この基板を裏に付けて マザーボードにするのはどうだろう。スロットに別の基板を差し込んで ピンヘッダとピンソケットで連結する。スロットに入れる方は L 型ピンヘッダで、この基板はピンソケット。

    ちょっと無理やりだが、電源コネクタは、USB typeA で USB 延長ケーブルを使う。

    手直ししないと見栄えが悪そうだし、コネクタの位置(高さ)も調整しないといけない。だが、ちょっと面白そうだ。

    考察1) (図面を見るかぎり)スロットに入れるほうの基板と底面の間が 1.5mm ほどしかない。L 型ピンヘッダは、2.54mm のスペースが必要だから無理。普通のピンヘッダを基板の裏面に貼ると、0.6mm □ だとして 底面から 1.2mm の位置に 中心が来る。ピンソケットが 底面に張り付くぐらいの位置ならあるいはいけるかも知れない。マザーの方は、そんな感じになっている。いけるかも。

    ただ強度が問題。2 列のピンヘッダで基板を挟んで 強度を確保するか ... あるいは 2 段の L 型の短い方を取ってしまってスルーホールにするか。

    追記: 現物を手に入れたところ、底面の隙間は 3mm 弱あった。結局、L 型 ピンヘッダを普通に付ければ良いこととなった。

追記 caseb-pic32mx-01



    上のアイディアをもとに基板を設計してみた。

    最初 USB A メス を検討したが、パターンはなんとか入ったものの IC-ソケットとぶつかる。で、少し上に上げてみた。これでも IC-ソケットとぶつかることには変わりないが、IC 直付けならなんとか。そして、mini-B も入れた。こちらは、ギリギリ OK (のはず)。

    このレイアウトにするには、長穴加工するしかない。初めての試みで不安だがやって見ることにした。

    Eagleメモ、フットプリント互換性
    ITead Studioへの基板発注
    SSW Blog: Eagleで長穴
    これらの ページを参考にさせてもらって、トライ。

      ・ ドリルラインと長いスロットは受付できません。
      ・ 最小スロットは 1mm*1mm です。
      ・ 穴やスロットでサブ基板を分離する事はどのような事であれ許可されません。

      このあたりが注意点。まぁ良くわからないんだが...

      ・ スルーホール付パッドに Dimension で長い外形穴を入れる。

      基本はこれ。ただ長い パッドはライブラリでしか使えないので、ライブラリ化必須。また、Milling レイヤが 一応それ用のレイヤなので、そこに書いて Dimension と同じ扱いをするうように cam ファイルを変更するのが筋らしい。

      あと、1mm 幅以上というのをクリアしなければならないのかどうか? 端にドリルを当てるべきなのかどうか? とか、いまいち分からない点もある。まぁダメなら怒られるだろうから、発注までこぎつけたい。

    あと、ボタンとか LED も付けた。実をいうと、USB のコネクタが、表裏逆かも知れないという不安がある。ボタンとか LED を付けないなら、逆にして使えば良いだけだと開きなおってたのだが、ちゃんと確認しないとダメになった。

    中国は 10/5 までお休みなので、チェックする時間はある。ボチボチチェックしよう。

      これで合っている。垂直のコネクタは、mini-B も Aメスも 内側向きに付けたものを引き起こすようなイメージ。

この基板のつかいかた(想定)

    (1) aitendo CASE-B の リアパネルに使う。

      スロットに拡張(というかメインの機能の)基板をいれてマザーボードとして使えることを想定している。下の 15 ピンのコネクタには、ピンソケットを付け、拡張基板の方は、ピンヘッダを(直に)下面に付ける。(想定レベル)

      上部のコネクタは、外向きに付ける。左の シリアル部分は ICSP で、ピンヘッダ。USB は、MU5F-23 か同等品でないとマズイはず。工夫すれば、A/メス、[UAF-19]が付くかもしれない。A/メス を付ける場合は、下になるパターンが接触しないよう気をつける。(テープなどで絶縁)

      ボタンは、TD-85XUしか付かない。MU5F-23の同等品 とともに入手を推奨。



      ケースに実際に付ける場合、上部のコネクタや(パターン)がケースに接触するおそれがある。なんらかの方法で絶縁する。特に A/メス、[UAF-19]を付けた場合は危険でより注意しないといけない。

      どんな拡張基板を作ると楽しいかは、まったく考えていない。

      あと 水晶は、秋月 FA238 。16 MHz とかしか入手できない。8 MHz 用の プログラムは、コンフィグを変えないと 使えないので注意。(HEX しかなくても コンフィグ部分の データを変更することは普通可能)

      右のコネクタは、クロックを外付けモジュールに変えるとき用。どういう用途でどう使うかはほとんど考えていない。

    (2) ブレットボードと共に使う。

      I/O を片側に寄せたので、ブレットボードで便利に使えるかも。3.3V も供給できる。USB は単なる電源コネクタとしても使える。

      下側のコネクタは、ピンヘッダの方が良さそう。ブレットボード専用なら細ピンヘッダの方がブレットボードを傷めないので安心。

      その USB だが、A/オスも水平に付けられる。その場合は 表(ICの面)につける。A/メスも OK でこちらは裏。ただ、固定するための フレームグランドはハンダ付けできない。そればかりか基板と干渉するかも。干渉した場合は、ヤスリ等で調整する。


      ミニUSBコネクタ(B)[MU5F-21] (在庫切れ)
      基板取付用USBコネクタ・ミニB(秋月)
      DIY Mini USB 5-Pin Female 90 Degree (10-Piece Pack)

      無理やり水平に付けるなら、このタイプ。ただし、裏面(IC と逆) に付けなくてはならない上に、フレームグランドは奥の 2 つしか付けられない。

      mini B の 広い方が 垂直タイプでは 2 ピンなのに対して 3 ピンになっているのがポイント。-- 最初気が付かなくてライブラリを作る際に混乱した。

    (3) 秋月 C 基板に付ける

      下の部分は、秋月 C 基板に合わせている。ピンヘッダ/ピンフレームで接続しても良いし、直結しても良い。

      L 型 ピンヘッダでうまく接続すると。aitendo CASE-B に スロットを使って入れられる。... というか逆か。
      基板を消費することになるが、フロントパネルに無理やりしてしまうことは出来る。うまくシールを作って化粧してやれば いけるんじゃないか?

      メリット? 加工がアルミ 2mm よりは楽。基板とパネルを一体化できる。

      あと、裏に加工用の目盛りを入れとけば 便利かも。(済)

      まぁこれはただの案。基板の方に部品が乗っていれば、強度は要らないし、透明なもの -- PET のシートとか? でも良いのではないかと思う。

    (3) 3 ピンコネクタ

      右上の 3 ピンコネクタは、5V - CLKI - GND 。

      とりあえず、5V を出していなかったので ここにした。CLKI は、外部クロック入力で、 精度が高かったり、ジッタが少ない 40MHz とか 48 MHz とかを入れると ... なにか楽しいことが出来ないかと思い付けた。

      パネルにする場合は裏面にコネクタを付ける。 単なるピンヘッダではなく、ケースとの接触から保護できるタイプのものを推奨。

      ブレットボードで使う場合は、5V を取り出せると便利かも。コネクタは逆で IC 面。

追記 現物合わせ→修正



    CASE-B を入手したところ、外形が 20 mm 丁度で思ってたのと違う。あと底面から基板までの高さも。それで、現物に合わせて修正することにした。

     

    どうも底面と基板の間は、2.8mm っぽい。これなら 2.54 mm 高 の L型 ピンヘッダはちゃんと入る。それだけでなく、マザー側に低メスが使える。低メスを使うことで 秋月 C 基板がきっちり入る(はず)。

    低メスを使わなくとも問題ない。もともと 15 pin は、2 段目からだが、3 段目に入れれば 丁度良さそうな感じ。

    ところで、このスロットは遊びが全然ない。マザーボードにすると当然ネジ止めすることになるからこちらも遊びがない。となると、ピンヘッダを完璧な精度で付けないとならない。これはなかなか厳しい。組んでおいてハンダ付けということが出来ないのだ。

    これはどうしよう。ケースに穴を開けておいて、仮ハンダできるようにしておく? ひとつ組立用に潰すか。

      思ったより広かったのだが、逆に 内部が狭いということで、caseb-pic32mx-02 ではダメだということが分かった。作りなおした所、上下コネクタが 随分内側に寄った。もう、USB A/メスは無理。また DIP のピンとコネクタの間が随分狭くなった。2.54mm ないので 同じ面には付かないし、ハンダ付けも工夫がいる。

      (再修正) DIP-28 の方を少し上に移動した。これでぎりぎり。

    その上で、表面のシルク見直し。コネクタのシルクは最小限に。

    そして、USB A/メスと C 基板用の HOLE を外しすっきりさせた上で ボタンを秋月で入手できるタイプに変更。(caseb-pic32mx-03)

    裏面のシルクに 内面のパターン追加。-- 部品をおいてはいけないところが分かる様にする目的がひとつ。あと、この線を目安に基板を加工すれば、ケースに嵌め込めるかも知れない。実験用の目的もある。

    追記: 10/4 caseb-pic32mx-03 を発注。長穴が受け付けられるか が 興味のポイントのひとつ。今のレイアウトなら丸穴に変更可能でダメだと言われても致命的ではない。あと、色は黒。$15 だったのが $13.49 だった。-- さすがに緑では合わないと思ったので。
    (10/11 : 発送の連絡 -- どんなのが来るか楽しみ .. あと 10 日ぐらい?)

所感(基板発注時点)

    このケースB + コントローラ付きバックパネルというのは、思ったより使い勝手が良いものかも知れない。

    C 基板で試作するとして、試作中や試作後の使用で保護できる。保護できれば、開発中でも持ち歩ける。-- これは、ちょっとしたメリットかも知れない。

      ケースが 分割されているが、ケースの上部下部を接着して筒状にしてしまえば良い。そうすれば、開発中は、フロントパネルなしでも済む。

      アルミだから、たぶん強くは接着できないのだが、乱暴に扱わなければ大丈夫だろう。とにかくそうしてしまえば、差し込むだけで良い。外すのも簡単。

      C 基板では、幅を削らないといけないのは、手間ではあるが、そんなに時間はかからない。10 分ぐらい? うまくやれば、差し込む固さも調節できる。

    あと、基板を効率良く使えるメリットもある。

      共通部分は別だから基板には入らない。固定するための面積も少なく済ませられる。C 基板だと、コネクタ部分 (3 列目まで)以外は、フルに使ってもケースに入れられる。

      専用基板を作るにしても、47mm 幅と 5cm を切るわけで、 長さを 5cm までにしてしまえば、低コストになる。

      ただ、そうすると ケース長 77mm は、ちょっと長い。ピンソケットの分 8.5mm + 50mm ぐらいで良い。完成品にする場合はケースを切ってしまうという手はあるが試作段階ではそうはしたくない。... Arduino でよく使われる 足が長いピンソケットで延長して とりあえず 長さを稼ぐのが良いかも知れない。




        6mm 差し込むと、19mm - 6mm = 13 mm 延ばせる計算にはなる。まだ短いがこんなもので。

      ちょっと高いが、5cm x 5cm の 4 層基板というのもあるようだ ($68)。10cm x 10cm クラスだと $99 だから 3 割ほど安く上げられる。4 層基板を作る手段も持っていないし、目的もまだないが 覚えておこう。

      4 層基板なら アナログ系? ... AVCC のところは適当に処理してしまった。R+C か L+C を入れられる様にすべきだった。 2 回目を作ることがあれば、忘れないようにしよう。ただ、デジタル派なので、4 層基板なら FPGA(BGA) ? ... これと組み合わせる もので 足が多い BGA の基板というのは何か変だし関係なさそうだ。

    さて、PIC32MX 版を作ったのに、わざわざ コントローラ付きと書いたのは ... arduino 互換だと 実はもっと便利かと思ったため。趣味的には mega328(DIP-28) + FT231X(QFN-20) かなぁ。ボタンはひとつで良さそうだから、空いたところに FT231X が入りそう。

      問題は、ピン配置。13 ピン分の I/O ピンしか出せない。デジタルのみにして、アナログは、上のスロットを使う? ... まぁなにか変なものになりそうだ。

    FT231X は発注かけているので現物見て作れそうなら、この基板の仕上がりを確認した後になるが、基板を設計してみたい。

追記: AVR 版 (仮)



    AVR 版 を仮に設計してみた。どうも、時間があると eagle いじってしまう。それはともかく ...

    大分良い感じではあるのだが ... ピンのスペースが足りない。ピンを増やすのも厳しい。位置すらなかなか動かせない。

    というわけで ... 下は アナログ A0 + デジタル D0-D11 (D12,D13 は配置できず )で終わり。3 ピンの部分は 電源電圧の選択( 5V - 3.3V )。 これは、装置が目的ならスイッチにしないで、直結すべき。せめてジャンパ。

    問題は、アナログ入力。下に入らない以上、スライドさせて装着というのは難しい。しょうがないので、センサーボードを別にするという考え方にした。A2 - A5 (I2C 含む)を電源込みで 6 ピン。

    あと大問題なのが ISP 。専用のコネクタを出せないどころか、RESET もピンに出せていない。USBシリアルの FT231X を入れてあるのだが、TXD/RXD/DTR 以外は引き出せていない。要するにブートローダ専用。まぁ DIP だし、装置組み込み用ということで。

    AREF は、コンデンサを付けられるようにしただけ。



    ISP のコネクタは出せないが、BitBang ライタの配線はできた。通常時も切り離せないわけだが、シリアルとして使っている間は、入力ピンなので壊してしまうことはないはず。ただ、配線はできたものの、クリアランスとかかなり厳しい。不安なので前のも残してある。

    ... 今はここまでにしておこう。本当に作るかどうかは、別途検討しよう。

追記: ネジについて

    aitendo CASE-B はネジが特殊だった(M1.7 ?)。いずれ ケースを切ったりすることも考えて M2 でなんとかする方針。まずは、ネジとタップを購入。


    ネジは、トラスコ中山 の ステンレス皿頭小ネジ寸法M2X8六角穴付ボルト寸法M2X8 というのを試す。タップも持っていないので、これ にした。

    六角穴付ボルトというのは、たまたま見つけたのだが、仮組みのとき便利そうなので様子を見てみる。

    ... これでうまくいけば、ケースのサイズの調整も可能。だめなら、おとなしく aitendo からネジを調達する。

      買ったタップは、中仕上用 ピッチ 0.4mm/下穴用ドリル径 1.6mm。製造元直販ページ に書いてあった。

      ケースには、1.5mm Φ の 穴があって 1.7mm Φのネジが切ってある。ここに強引に M2 のネジを切るつもり。完全な穴ではないし、肉厚もあまりないから失敗するかも。ネジが切れても中心がずれるかも知れない。

      まぁ買ってしまったし。結果は追記する。

    ところで、この daishinshop というところ 取寄品 が多いんだが なかなか安い。時間がかかるのは(中華ショップで買うことが多くなったので)慣れている。ついでに、いろいろ買ってしまった。

    タカチ MX2 は、4cm 幅, 6cm 幅のタイプは、M2.6 タップネジだそうだ。同じように M2.6 のタップと ネジを買っておくと良いかも。

追記 2012/10/16:ネジ一式到着

    さっそく タップで ネジを切ってみた。ハンドルを買っていないので少々不安だったが、タップを ラジオペンチで固定してケースの方を回すやりかたなら問題なし。ただ、抜くときがネジを切るより難しかった。完全な穴ではないので、ひっかかるのだ。抜くときもネジを切る -- しかも反対側でという感じ。だから一気にねじ切ってはいけない、一回ぐらいは途中で抜くべき。中心は少しずれたかも知れないが分からないレベル。

    さて、ネジについてだが、六角穴付ボルトは、見た目でも良い感じかも。基板が到着したら写真を取ってみよう。もうひとつは、サラネジ。悪くはなさそうだが、基板を大径ドリルでさらわないと 。綺麗な仕上がりになるかどうか ...

おまけ: imall.iteadstudio.com で気になる商品

    新サイトになったときは、商品が少なかったが、結構増えている。ちょっと気になるものを取り上げてみた。基板だけ発注することが多いのだが、ついでに買うのも良いかも知れない。

    2.54mm 40Pin Gold-plating Male Header

    ピンヘッダなんだが、白と黄色がある。(前みたときは、緑とか青もあったような...)

    ITDB02-4.3
    ITDB02-5.0

    コントローラ(SSD1963)付きの 4.3 inch 480x272 , 5 inch 720 x 480 LCD モジュール。
    フレームバッファ付きだから、AVR でも使おうと思えば使える。

    Crystal Oscillator 3.2 × 2.5 × 0.7 SMD (5Pcs) (passive: 発振子)
    Crystal Oscillator 5.0 × 3.2 × 1.2 SMD (5Pcs) (active: 発振器)

    12 Mhz と 25 MHz しかないが、FPGA に良さそう。

    Rotary Encoder with Switch

    ロータリースイッチ。掘り出しモノなのかどうか判断できないが、なにやら良さ気。

      少し小さめ。プッシュボタン付き。シャフトが丈夫そう。... メリットはこのあたりか?

    部品は、マニアックなものがわりとある。要チェックかも。

追記 2012/10/21 : 基板到着



    長穴は、なにも連絡なしに黙って作ってくれた。ただ、気持ち大きいような気がする。milling の線の太さを 細くすべきだったのかも?



    とりあえずケースに取り付けてみた。幅はぴったりか 気持ち大きめ。ケース中央は少し凹んでいるため、そう感じるのかも。高さは小さめで、明らかに段差がある。dimension だけ 少し(0.1 〜 0.2mm)大きくしたほうが良いかも知れない。

    六角穴付ボルトは、良い感じになった。あと、すz マークだが、銅箔も マークしている。気持ちほりが深い。



    皿ネジのほうは、こう。ピンヘッダの先が見えるのだが、C 基板の 3 列目に L型ピンヘッダを差し込んで、基板をフタにぴったりくっつけてみた。

    記事中で L型ピンヘッダの位置合わせが難しいと書いたが、間違い。下に取り付けるので 現物で合わせた上で、はんだ付けできる。

付録: eagle ファイル

    ai-caseb-04.zip

    PIC32MX のボードと 回路なしのディメンジョンのみのボードを添付。

    caseb-pic32mx-01
    Todo:
     発注までに見直す。長穴、USB 表裏 (見直し1回)

      cam は、Milling を Dimension と同等の扱いにした。両脇に drill を打つべきかどうか?
      USB の表裏は合ってる。

     できるだけ部品は裏にもっていく (済)

      RC は裏に持っていったが ... VIA の処理も目立たないようにすべきか。Stop Off にして(tented via)にして位置も隠れるところに移動。(済)

     シルクの見直し (見直し1回)

      見直しはした。でも、パネルにするなら、不要なものは削除すべきか。

     USB A/メスの削除

      パネルにするなら、見栄えと絶縁の問題で削除した方が良いが... 便利な機能を削るのもどうか? ... と思ったが、USB A/メスは 無理なので削除決定。

    caseb-pic32mx-03

      目盛りをいれたり、パターンを見栄えのために少し修正。

      スロットの基板想定位置も シルクに入れた。現物で合わせている。

     DIP-28 の移動。

      DIP-28 と下のコネクタとの間が狭すぎハンダ付けが難しそうなので、上に移動。

     panelize で 表裏逆に

      とりあえずパス ... と思っていたのだが、単に brd の中で グループ・ミラーすれば良いだけだった。

    コネクタを 0.25mm 下げる。(0.4 で済)

      底面からの高さを 2.8 mm と見たのだが、どうも違う。2.5mm (か 2.6mm) のようだ。実際 2.54 mm のパーツが入るので、底面からの高さを 2.55 mm に変更。

      もう発注してしまったが、これだと 合わせられない。困った。
      → ピンフレームだと 0.5mm x 0.25 mm とかだから 1 Φ内で調節できる(と思うことにした)。ピンヘッダだと無理だが .. スロットに合わせないなら OK 。今後もあるので、eagle ファイルは修正。
posted by すz at 22:31| Comment(2) | TrackBack(0) | 日記

2012年09月24日

USB VID/PID

スイッチサイエンスで『USB PID無償提供プログラム』を検討しているのを知った。USB の ファームウェアを公開している立場からすると、USB の PID/VID は結構厄介で、正直自由に使える ID が欲しい。ID を使わせてあけようと考える人がいるというのは、非常にありがたい。

この機会に使える PID/VID についてまとめておこうと思う。

チップベンダーが提供する サブライセンス

    MicroChip や FTDI, TI (, Atmel も?)などは、製品に利用できる サブライセンスを発行している。が、当然ながら そこのチップを使うことが前提になっている。いまのところ USB 付き AVR の ファームウェアしか作っていないのだが、互換性のある ファームウェアを PIC32MX 向けに作りたいと考えている。

    ベンダーのしばりがあるのも問題だが、作っているものは製品ではないほうがより大きな問題で、サブライセンスを受けようとも思わないし、また受けられるとも思えない。

V-USB が使っている USB の VID/PID

    V-USB の最新版 vusb-20120109.tar.gz を解凍すると USB-IDs-for-free.txt というのがある。これには、いくつかの VID/PID のペアが載っていて、ライセンスに従えば 使用することができる。

    ライセンスは、Version 2009-08-22 となっていて、以前のものから見直しがされている。一番大きな変更だと思ったのは、使うチップやライブラリの条件がないということ。シェアできるようにさえなっていれば、他に条件がないようだ。

    以下、自分の理解。(厳密なものではないので注意)

    テキスト名による 識別

      ・ テキストの ベンダー名と プロダクト名は、USB language 0x0409 (English/US)でなければならない。

      ・ ベンダー名は、自分の Internet domain name (e.g. "mycompany.com") か e-mail address (e.g. "myname@gmx.net") を含んでいないといけない。( たぶん URL でも可 )

      ・ 自分の URL や e-mail アドレスは、レスポンスを返せるものでなければならない。

      ・ ドライバは、全文字列を チェックしなければならない。(sub-string の比較はダメ)

      以上を守れば、次の ID を使うことができる。

      PID dec (hex) | VID dec (hex) | Description of use
      ==============+===============+============================================
      1500 (0x05dc) | 5824 (0x16c0) | For Vendor Class devices with libusb
      --------------+---------------+--------------------------------------------
      1503 (0x05df) | 5824 (0x16c0) | For generic HID class devices (which are
      | | NOT mice, keyboards or joysticks)
      --------------+---------------+--------------------------------------------
      1505 (0x05e1) | 5824 (0x16c0) | For CDC-ACM class devices (modems)
      --------------+---------------+--------------------------------------------
      1508 (0x05e4) | 5824 (0x16c0) | For MIDI class devices
      --------------+---------------+--------------------------------------------

    シリアルナンバーによる 識別

      ・ シリアルナンバーは テキストで、USB language 0x0409 (English/US)でなければならない。

      ・ シリアルナンバーは、自分の Internet domain name (e.g. "mycompany.com") か e-mail address (e.g. "myname@gmx.net") を含んでいないといけない。( たぶん URL でも可 )

      ・ 自分の URL や e-mail アドレスは、レスポンスを返せるものでなければならない。

      ・ Vendor Class を使いたい場合は、libusb か libusb-win32 を使うこと。

      ・ それ以外のクラスを使う場合は、OS のデフォルトのドライバーを使うこと

      以上を守れば、次の ID を使うことができる。

      PID dec (hex) | VID dec (hex) | Description of use
      ===============+===============+===========================================
      10200 (0x27d8) | 5824 (0x16c0) | For Vendor Class devices with libusb
      ---------------+---------------+-------------------------------------------
      10201 (0x27d9) | 5824 (0x16c0) | For generic HID class devices (which are
      | | NOT mice, keyboards or joysticks)
      ---------------+---------------+-------------------------------------------
      10202 (0x27da) | 5824 (0x16c0) | For USB Mice
      ---------------+---------------+-------------------------------------------
      10203 (0x27db) | 5824 (0x16c0) | For USB Keyboards
      ---------------+---------------+-------------------------------------------
      10204 (0x27dc) | 5824 (0x16c0) | For USB Joysticks
      ---------------+---------------+-------------------------------------------
      10205 (0x27dd) | 5824 (0x16c0) | For CDC-ACM class devices (modems)
      ---------------+---------------+-------------------------------------------
      10206 (0x27de) | 5824 (0x16c0) | For MIDI class devices
      ---------------+---------------+-------------------------------------------

    ちなみに、ここで出てきている VID (0x16c0)を、Atmel だと誤解していた。Atmel は 0x03EB で違う。0x16c0 は、 "Van Ooijen Technische Informatica" ( www.voti.nl ) であった。

スイッチサイエンスさんへの要望

    最後になるが、twitter で意見を公募しているようなのだが、twitter の ID を持っていないのでここに書いておこう。

    USB には ドライバーが付き物で、ドライバーまで頑張って作るのではない限り、USB-IDs-for-free のライセンスで結構カバーできる。だが、OS のデフォルトのドライバー で使える別のクラスがあれば、このリストに追加して欲しいということになる。できたら、スイッチサイエンスさんに 同じルールの PID/VID の セットを作ってもらって 要望によって、リストが追加されるようになっているとたいへん嬉しい。

    OSS で ドライバーまで頑張って作るのであれば、ドライバー自体が共有できるものだから、やっぱり このリストに追加して欲しいということになる。

    逆に 個別のID を製品に付けたい ... となると 同人ハード とか 商品の試作みたいなことになるのではないだろうか? OSHW かつ OSS であるなら コピー製品を妨げることは出来ず 累計の制限は無意味になる。 累計の制限を付けるのなら OSS はともかく OSHW の制限は外すべきだと思える。

    まとめると、

    ・ シェアできるものは、USB-IDs-for-free ライクなライセンスで追加の要望が出せる
    ・ シェアできないもの(そのレベルになっていないものも含める)は、累計の制限を付け 仮ID の扱い。

    こんな風だと非常に嬉しい。
posted by すz at 20:37| Comment(0) | TrackBack(0) | 日記

2012年09月20日

8桁7セグ表示ボード

aitendo の 3/4 桁の7セグLED は、アノードコモンとカソードコモンが両方ある。なら、全部並列につないでやれば、12 ピンで 8 桁に拡張できる。さらに、よくよく見れば 4 桁で小さめのサイズもある。

4桁7セグモジュール(0.36"/green)[KEM3261G]
4桁7セグモジュール(0.36"/red)[KEM3261R]

8 桁だと、6cm 幅になるが、パターンは 5cm に収まるので、表示ボードを設計してみた。

    コネクタは、12 pin + 3 pin の15 pin 。基板のサイズは、秋月C基板に近いので、固定する穴のディメンションを同じにしている。


    ボタンも付けてみた。



    ボタンの回路図はこれ。ピンを節約したかったので、ADC で読むようにしている。こういう風に接続すると、同時押しには向かないものの、制御が簡単になる。

    表示方法は、1 つのセグメントを順番に表示させるつもり。1/64 duty というわけだ。以前 8x8 のドットマトリックス LED で同じようにしたが、全然問題ない。ただ、表示順は考えておかないと ぶれたとき見にくくなる。

    u5004s-0.1.zip : ベースにする予定のコード。(メモ)

コントローラの追加

    もともと tiny2313 を付けるつもりだったのだが、うまく収まらなかった。で、表示部だけ にしたのだが、コネクタの都合もあって ADC が必要になってしまった。そうなると tiny2313 は使えない。

    で、表示部と別にコントローラ部を作ることにして、mega328 (タイプ) を使うことにした。

      後で気がついたのだが、アノード+カソードでもボタンは 7segの線と 共用できる。ADC など必要ではなかった。-- まぁ ADC での回路を作ってみたかったということで。



    結局こんなのが、出来上がった。そのままでも良いが、切り離して、T 字型に組めるようにした。表示部分のみにして、別のコントローラを使ってもよい。

    専用のコントローラ部を作ったわけだが、出来ることは多くはない。

    もともと、シリアルで受け取ったデータを表示させるだけのつもりだったのだが、これだけではもったいないような気がして、水晶を付けてみたり 、さらに外部クロック入力 や ICP を コネクタに出したりはしたが、やっぱりイマイチ。

    追記:

    PIC32MX 版も作ってみた。... のだが、PIC だと 5V トレラントのピンがあったりして、ポートの出力が均一にならない。こういう目的だと AVR の方が良さそう。折角作ったので、これも含めた eagle ファイルを置いておく。

    あと用途について。LED をダイナミック点灯させるとノイズがすごいことになる。やはりコントローラでいろいろやるのは、避けて 表示メインにしたほうが良いと思う。

    とはいえ、周波数カウンタぐらいには仕立てたい気もする。ただ、水晶 も温度で周波数が変わるし、補正する仕組みを入れたいところ。ICP と SPI はピンに出しているから、
    DS3234S
    を接続することはできる。

    DS3234Sは、結構精度が良いらしいので、この出力をもとに補正するやりかたを考えたい。ちなみに、WDT 用 RC クロックと 水晶の周波数のズレを元に温度が測定できそうな気がしている。それが出来ると、補正値も温度ごとに持てる。... 補正できてしまえば、DS3234Sを外せる。そして、外した DS3234S は、自家用基準クロックとして使いまわすのだ。

    (参考) ■ TCXO水晶内蔵 SPIバスRTC DS3234Sを制御する ■

      O-Family 氏の解説等 ... なんと 独自に翻訳した DS3234S 日本語マニュアル がある。

C-533SR + TYINY2313 版



    秋月で扱っている 3桁 7seg の C-533SR 版も設計してみた。

    6 桁になってしまうが、これも 50mm に収まる。(aitendo のやつはダメ幅が広い)。 さらに、TYNY2313 (DIP) も内側に入れられる。両方カソードコモンなので、6 桁に減っても +2ピン増える。ただし、ボタンは 共用して -1 ピン。合計 14 ピン。TINY2313 だと TXD/RXD を通信用に使っても 1 ピン余る計算。

    コネクタは、固定用の意味もあるので、そのままにしているが、VCC/TXD/RXD/GND の 4 ピンのみ使う。ISP も一応コネクタに出した。

    この基板は、組むのに手順がある。表面実装 RC → TINY2313, ISP コネクタ → 7seg の順でないとまずそう。

全体回路図:


全体回路図( C-533SR 版):

eagle ソース:
seg7disp-02.zip
posted by すz at 21:05| Comment(0) | TrackBack(0) | 日記

2012年09月15日

FT232Rボードとか

ちょっと思い立って goodluckbuy.com で FTDI を検索 してみたところ、FTDI Basic Breakout っぽいボードが出ていた。



 FTDI Basic Breakout Arduino USB-TTL (goodluckbuy.com) $6.56
 FTDI Basic Breakout Arduino USB-TTL (dealextreme.com) $7.50

かなり安いのだが ... よくよく見ると ピン配列は同じものの、垂直にピンソケットが付いている。

なんで? と思ったのだが、どうやら 検索のついでに出てくる 『MWC MultiWii』 のほうがメインで、それで使いやすいようになっているようだ。

    『MWC MultiWii』を知らなかったのでググってみて、『MWC MultiWii SE Standard Edition(CRIUS)』という記事を発見。

      この一枚の中に3軸ジャイロセンサー、加速度センサー、気圧センサー、方位センサーなどがセットしてあります。

    とのこと。さらに調べると 『有志が作成したデータシート』が見つかった。



    - ITG3205 three-axis MEMS gyroscope, I2C, 16-bit ±2000°/sec, 3.3V-6.5mA
    - BMA180 three-axis accelerometer, I2C, 14-bit, <0.15° accuracy, 3.3V-800uA
    - BMP085 pressure sensor, I2C, 0.3m resolution, 3.3V-10uA
    - HMC5883L three-axis digital compass, I2C, 12-bit, 160Hz, 1-2° accuracy, 3.3V-100uA

    基板のサイズは、50mm 角となっているが、40mm 角のタイプもあるらしい。あらためて goodluckbuy.com で検索すると $40 ぐらいからある。センサーだけのボードもある。

    なかなかに興味深い。arduino として使えるなら、quad copter のコントローラにこだわらなくても、倒立振子とか 用途はいろいろありそう。

FT230X/FT231X

    実を言うと FTDI を検索してみたのは、FTDI の新しいチップの FT230X/FT231X に興味を持ったため。そして、興味を持ったのは、QFN パッケージだったりする。サイドまで パッドがつながっている QFN なら容易にはんだ付けできる -- そして FT230X/FT231X は 今までのパッケージと違って サイドまで パッドがつながっているのだ。しかも安かったりする。Mouser だと 180 円前後。

      FT230X は 16pin / FT231X は 20pin 。パッケージは、QFN 以外に SSOP(0.65mm ピッチ) もあって、 FT232R のピン数を減らしたものに見える。SYNCBB も使えるし、CBUS ピンもある。ただし、VIO は、1.8V 〜 3.3V (5V トレラントではある)。

    基板を作ってみたいという、妙な動機で興味を持ったわけだ。CTS/RTS しかない FT230X にするか 全部ある FT231X にするか迷っていたが、FTDI basic breakout (DTR + CTS) が主流なら FT231X が無難かも知れない。あと、パッケージが小さくなっているので、AE-UM232R (というか UM232R) 互換 のボードも自作しやすいかも知れない。

    追記: USB の D+/D- には、27Ωが必要で、パッケージが小さくなっても必要な面積は減らないようだ。安いだけがメリットかも。

      AE-UM232R で気に入らないところは、足が付いてしまっているところ。外すのも難しいし、いっそのこと基板から作りたい気分になっている。ちなみに、ピン配置は、FTDI の UM232R モジュール互換で、AE-UM232R がオリジナルというわけではない。

    ... などと考えていたのだが、沢山作ってもしょうがないので、思いとどまった。とりあえず今回はメモだけ。Mouser で発注するついでに 入手しておくつもり。忘れないようにしないと。

    あと、思いとどまった理由に PIC32MX がある。PIC32MX でも QFN があって、FTDI Basic Breakout っぽいボードは作れそうな気がしている。PIC32MX を使いこなせるなら、こっちの方が良い。問題は、いつ使いこなせるようになるか。なんとかしたのだが、なかなか手が進まない。

FT231X ボード設計



    QFN-20 の FT231XQ を使った FTDI Basic Breakout っぽいボードを設計してみた。

    USB は mini-B 以外に ケーブル直付けも出来るようにしてみた。typeA オスを(裏に)付けることもできるので、シリアル側のケーブルを伸ばす使い方もできる。

    あと、シリアル側に抵抗を入れることができる。さらに RTS を引き出せるよう細工。



    こっちは、AE-UM232R っぽいボード。裏面に抵抗を入れられるようにしてみた。VCCIO は、3V3 につないであるが、パターンカットができるように配慮はした。あと、RST も VCCIO に直結しているが、プルアップ抵抗を入れられるようにした。

    CB0/CB1 は、同じピン配置にしたが、FT231X では、TXLED/RXLED が CB1/CB2 に変更されている。LED を外部に付ける場合 FTProg (MProg) で 設定を変更しないと互換にならない。



    2012/9/18 : panelize.ulp で 面付けしてみた。一枚のボードとして認識されないと面倒そうなので、自作のツール(gerbtool)は使わなかった。

    下が、PIC32MX (QFN-28) の AE-UM232R 風ボード。2 の 2 枚が、FT231XQ (QFN-20) を使った AE-UM232R 風ボード。PIC32MX だと部品点数が増えて厳しい。USB を飛び出させた分大きくなった。

    切りやすいように、基板間に、tStop/bStop ,tRestrict/bRestrict の帯を入れる。さらに、ボード厚を 1.0mm にして発注するつもり。

    ところで、panelize.ulp での面付け少しばかり不安。上の 2 枚の QFN の 裏の パターンが変わってしまっている。-- 属性が 変わったようだ。この程度なら良いけれども ... 他にもあるかも知れない。

    あと、面付けしたことで、ベタパターンが変わってしまっている。橋にまで回り込んだだけなので、問題はないが ...

    eagle ソース : PIC32MX-typeBr3-04.zip
    gerber データ:um231x-p-out.zip

注意:

    無邪気に紹介してしまったが、ロゴまでコピーしたものとか、ロゴだけ取ったコピー品とかあるかも知れない。さすがにそういうのは薦められない。

    最初のボードは、パターンが違うし、ロゴ取っているし、なんとなく ぎりぎり OK な範囲のような気がする。

    『MWC MultiWii』の方はオリジナル自体知らないので、判断できていない。買うなら独自性のあるものを選んで欲しい。あと、ファームウェアがどういう条件で使えることになっているのか知らないのだが、本来の目的では使わず 他の使い方 をすることを想定して紹介している。本来の目的で使いたいのであれば、ファームウェアの使用条件には留意して頂きたい。

Mouser メモ

    全く関係ないのだが、Mouser で買っておきたい部品のメモ:忘れないようここに書いておく。

    ERJ-3GEYJ

      1608 5% の抵抗なのだが、やたら安いらしい。

    CC0805

      2012 のコンデンサ。かなり安いような... 22pF とかの買いまし。

    LTV-0701

      高速フォトカプラ。10Mbps 以上の 高速フォトカプラ は、あまり品種がないのだが、これは 100 Mbps となっている (本当なのかどうか、未確認) 。

      10Mbps の LTV-0601 より安かったりするし、ちょっと欲しいような。 使い道も考えていないのだが ...

    PIC32MX2 (QFN-28 / QFN-44)

      QFN が欲しいのだが、いつでも在庫があるわけではないようだ。

    追記: デジキーだと PIC32MX220 の QFN-28 は、在庫がある。PIC32MX250 も 10/1 に入荷するようだ。だが、 FT231X は、12 月! 。一方 Mouser は、10月に FT231X が入荷するものの、PIC32MX250 はリードタイムも出ていない。なかなか入手できないなら、デジキーで発注をかけておこうかな ... という気になっている。
posted by すz at 16:43| Comment(0) | TrackBack(0) | 日記

2012年08月23日

FT232Rを PIC32MXライタに

pic32progの改造』の記事の要点だけ。

pic32prog-r62-ftdi-05.zip

これを使うと AE-UM232R といった FT232R モジュールや UM232H といった FT232H モジュールを使って PIC32MX の ファームウェアの書き込みができる。(動いたのは ICSP 。/ JTAG もサポートしたつもりだが未だ動かない)



例えば AE-UM232R だとこういう接続で良いはずなのだ。(UM232H で動作確認) 。追加パーツは、4.7K と デジトラ DTC144ESA。結線は 3 本のみ。GND の結線も不要 (USB 側でつながっている場合)。
使い方は、

 pic32prog -t syncbb-icsp-0175 hexファイル

これでいけるはず。(0:PGEC = TXD , 1:PGED_OUT = RXD , 7:PGED_IN = RI, 5:/MCLR = DCD)

UM232H では、MPSSE のBITBANG を使用することもできる。( syncbb-icsp ではなく mpsse-icsp を指定し ACBUS に接続。)。 その場合、外付けパーツも不要。

注意)

    ・ 動作の保証はしません (おやくそく)
    ・ コンフィグの設定を間違えると、動かなくしてしまう可能性があります。PIC32MX を壊してしまっても補償はしません。
    ・ 開発途中のものであり、書き込みに問題があるかも知れません。動いた/動かないといったレポートは歡迎します。
    ・ こちらでは、UM232H のみでテストする予定。手持ちの AE-UM232R は、ピンを交換したため、どこかおかしくなっている模様。(例示の目的だけで写真を撮っています。)
    ・ JTAG は動いていませんが、使わないので優先度を下げました。デバッグは気が向いたときにやります。

付録) ピンアサイン 表

    AE-UM232R と UM232H
     

    PIC32MX-TypeB / PIC32-PINGUINO-MX220

    RA0 (x)AREF PGED3
    o GND
    o D13
    o D12
    RST(o) RB5 (o)D11 TMS
    3V3 o RA1 (x)D10 PGEC3
    5V o o D9
    GND o RB7 (o)D8 TDI
    GND o
    -- o -- o D7
    -- o D6
    A0 o -- -- o D5
    A1 o -- -- o D4
    A2 o RB0 PGED1 RB9 (o)D3 TDO (*1)
    A3 o RB1 PGEC1 RB8 (o)D2 TCK (*1)
    A4 o RB2 o D1 TDO (*2)
    A5 o RB3 o D0 TCK (*2)

    (*1) PIC32MX-TypeB (my bourd)
    (*2) PIC32-PINGUINO-MX220 (Olimex)

関連記事
posted by すz at 23:32| Comment(1) | TrackBack(0) | PIC32MX

アルミケース三種

気になったアルミケースについて。

aitendo のアルミケース(B) 550円


     基板幅 (最大 47.4mm) 基板長 (最大 77mm) ケース高(外寸 21 mm)
     専用基板 P47X77-B
     ケース・フタ B-CAP

これが気になった最初のもの。ケースに溝があって基板が入るのだが、どうやら秋月C基板がはいりそうな感じ。

最近は C基板が入るかどうかより、Fusion PCB や IteadStudio で作る基板に向いているのかどうかの方が大事。5cm x 5cm は $9.99 と格安だから、このサイズに合うかどうか ... 幅はちょうど良いが、少し長い。押し出し材だから切ってしまうという手もあるが、5cm x 10cm も最近は安いようで、$25 出せばカラー基板が作れる。

タカチ MX型丸型モバイルケース (pdf) 590 〜 670円 (標準価格)


    MX2-6-5, MX2-6-8, MX2-6-10 -- 基板幅 (最大 47.7mm) 基板長 (最大 45mm, 70mm, 95mm) ケース高(外寸 18 mm)

あらためて、タカチのケースを見れば、ちゃんとあった。MX型は値段も安いし、45mm と 5cmx5cm に合いそうなものもあった。5cm x 10cm までで作るなら、MX2-6-10 も良いかもしれない。

タカチ MXA型アルミモバイルケース (pdf) 1290 〜 1490円 (標準価格)


    MXA2-6-5, MXA2-6-7, MXA2-6-10 -- 基板幅 (最大 47.7mm) 基板長 (最大 40mm, 65mm, 90mm) ケース高(外寸 18 mm)

    最近は、オールアルミで仕上げが美しいタイプもある。その分お高いが、目指すものによっては、これを選択するのもアリなんだと思う。

... というわけで、ちゃんとケースに入れるものを作ってみたいような気がしている。最初は、MX型の MX2-6-8 か MX2-6-10 あたり? ただし問題は中身。装置として完結していないと ... 。
posted by すz at 21:31| Comment(0) | TrackBack(0) | 日記

2012年08月18日

パラレルポート(PMP)の調査

PIC32MX には、実に多くのデバイスがあるのだが、まだ把握できていない。今回、PMP (Parallel Master Port)について、ちょっと調べて見ることにした。

DIP で使えるものなのか? これをまずは、確認。

    ~MCLR (1) AVdd
    PGED3 RA0 G1 PMD7 AVss
    PGEC3 RA1 G2 PMD6 PMCS1 G1 RB15/SCK2
    PGED1 RB0 G4 PMD0 G4 RB14/VBUSON/SCK1
    PGEC1 RB1 G2 PMD1 PMRD G3 RB13
    SDA2/RB2 G3 PMD2 Vusb3v3
    SCL2/RB3 G1 PMWR G2 RB11/D- PGEC2
    Vss G4 RB10/D+ PGED2
    CLKI Vcap
    CLKO (PMA0) Vss
    SOSCI RB4 G1 PMD3 G4 RB9/SDA1 TDO
    SOSCO RA4 G3 PMA1 PMD4 G2 PB8/SCL1 TCK
    Vdd PMD5 G1 PB7 TDI
    TMS/USBID RB5 G2 Vbus

    USB を使う前提だと、RB4(G1),RB5(G2),RB14(G4) 以外のピンに PMP機能 のピンが割当たっている。自由にできるピンが 3 つ。結構応用が限られるような気がするが ...

バッファ付き スレーブ モード

    気になったのがこれ。RD で、受信バッファから読み出し。WR で 送信バッファに格納 することができる。受信バッファ/送信バッファ は、それぞれ 4 バイトあって、CPU からは 32bit で一度にアクセスすることができる。

    しかも DMA を使うことが可能。DMA の詳細はまだ良くはしらないが、ブロック転送ができるのはありがたそうだ。

    これは一体なにに使えるのか? 真っ先に思いつくのがロジアナ。なんか毎度毎度という気がするが、ロギングの基本形だし。あと、220 円の IC で作れるのならインパクトが違う。

    性能は?

      RD/WR は使う側から見たら 非同期だが、どうも内部では PBCLK (最大 40 MHz) で同期しているようだ。あと、DMA で取り込むには、ディレイが生じる。4 バイト分一度に取り込むなら、このディレイが取り込む最大周波数を決めることになる。まだ、ディレイがいくつかは分かっていないのだが、8 clk だとすると 5 MHz 。十分高速だとは言いがたいが、それでも役に立ちそうなレンジではある。

      DMA は割り込みと併用する必要はない。うまくコードを作らないといけないが、データを処理しながらのポーリングという手法もある。

    バッファの量は?

      220 円の PIC32MX220F032B だと RAM が 8KB 。半分の 4KB ぐらいは ログするのに使えるだろう。サンプリングが遅ければ、なんらかの圧縮ができるかも知れない。さらに余裕があれば、途切れなく PC に転送できるかも知れない。このあたりは、腕の見せ所 -- これに取り組んでみるのも楽しいかも。

      また、上位の PIC32MX250F128B に換装すれば、4KB が 28KB まで増えることになる。ここまで増えると、少しは実用度が上がるかもしれない。(PIC32MX250F128B は、マイクロファン で取り扱っている。)

    他に同じようなことが出来るものは?

      FT245R とかが真っ先に思いつく。これは、似た様なことが出来る。ただ、バッファ溢れ が心配。Hi-Speed の FT232H や FT2232H だと、EEPROM の設定で 245 Type にできる。これだと、転送性能が上がる上に、バッファも増える。(232H は 1KB / 2232H は 4KB ?)。ただ、やっぱり バッファ溢れ が心配。

      よく使っている Sync-Bitbang でも RD/WR はあったりする。(信号名は RDSTB#/WRSTB#) 。一方向の Async-Bitbang でも同様。ただしこれは出力。先に FIFO が必要になるから、お手軽には出来ない。

    追記: FX2LP (CY7C68013A) を忘れていた



      たとえば、こんなの。dealexreame で $19.30



      こっちの USBee AX PRO MINI LOGIC Analizer は、$11.70 。中身は 写真と同じなら、やはり FX2LP 。24 MHz となるとこれしかないはず。

      ロジアナ作ってもこいつにはかなわない。

マスター モード

    アドレスとデータを 多重化したり、いろいろなモードがある。これを使って SRAM をつけたりできるようだ。ただし、ラッチが必要。また、メモリ空間にマップされるわけではないようだ。逆に アドレスをオートインクリメントしたりできるから、FIFO に使えそう。DMA でももちろん使える。

    SRAM のことを忘れると、単純にパラレルポートとして使える。 RD/WR でハンドシェイクできたりするから、グラフィック LCD (ただし 8bit) の制御に便利そう。

    フレームバッファ

      メモリが少ないので厳しいとは思うが、DMA を使っての フレームバッファは作れると思う。RAM は、1 line か 2 line 分だけ用意して、CPU で間に合うようにデータを生成すれば、なにか見れるものは作れそう。

      一応 3 pin 分は余分にあるから、同期信号は、こっち。PWM 相当の Output Capture で生成してやる。

      ただ、フレームバッファを作る場合でも、スレーブ モードにした方が良いのではないかと思える。同期信号を CS や RD にも入れてやるのだ。こうすることで、タイミングを自由に制御できるし、DMA 的にも扱いやすそうな気がする。
posted by すz at 16:38| Comment(0) | TrackBack(0) | PIC32MX

2012年08月16日

USBデバイスドライバ メモ

以前 AVR 向けに作った USB デバイスドライバを PIC32MX に移植しようとしている。これについてのメモ。

    jzlib や pic32progの改造とか 半端な状態なのだが、これもまた 半端。まぁ、全部揃わないと意味ないし、並列にやっていくのだ。『ブートローダの検討』なんて記事も書いたのだが、既存の HID ブートローダは、動けばラッキーみたいに思っていて積極的にデバッグする気は今はない。jzlib がきちんとなれば動くはずなので、後回し。手をかけたいのは、やっぱりこっちの方。

仕様について

    もともとは、V-USB 用のコードを AT90USB162 に移植したくて作ったもの。だから API も V-USB の仕様をベースにしている。

    移植するにあたり、どういうものだったか 思い出さないといけないので、整理しておこう。

    usbPoll()
    __usb_ctrl_recv(setup_data, 8);
    if (pid == _PID_SETUP)
    if (request_type == USB_RQ_TYPE_STANDARD)
    :
    :
    else if (request_type == USB_RQ_TYPE_VENDOR)
    r = (usb_vendor_setup)(setup_data,reply_data);
    else
    r = (usb_user_setup)(setup_data,reply_data);

    if (r == 255) send_zlp();
    else if (r == 254) reply_stall()
    else usb_reply_setup(...);

    else // (pid == _PID_DATA0)
    r = (usb_user_out)(setup_data,len);

    if (r == 255) send_zlp();
    else if (r == 254) reply_stall();

    usbPoll()を定期的に call することで、(コントロールエンドポイントについては) すべてが動作する。

    usb_vendor_setup あるいは usb_user_setup に callback 関数を設定すると、標準以外の SETUP パケットを受け取ったら これらの関数を call する。これらの関数が、reply_data を セットすれば、その後 IN パケットで reply_data を PC に送信することになっている。

    V-USB だと、reply_data のハンドリングも 使う側が行わなければならないのだが、8 バイト毎に データを区切って生成するコードを作るのが面倒なので、MAX_REPLY_LEN までをバッファリングできるようにしている。(MAX_REPLY_LEN は usbconfig.h で指定)

    一方 SETUP に続いて OUT パケットが来るような 使い方があるのだが、こちらの方は、V-USB と同じ。 user_out を設定すると、8 バイト毎に 区切られて user_out が call される。あらかじめ 何バイト来るかは分からないので、やむを得ない。

    ここまで書いて、usb_user_out が 1 つしかないのはまずいと思った。これだと いくつかの プロトコルをサポートするのに不便なのだ。幸い user_out は、SETUP の request に関連づけられる。usb_user_setup が来てから usb_user_out を 設定すれば良いのだ。SETUP が来たらまず NULL に設定するようにすれば、関係ない request に対して usb_user_out が call されることもない。仕様を変更しておこう。

      基本的に、いくつも OUT パケットが来るケースというのは、ライタでいうと 書き込みデータ。処理自体はそれほど難しいわけではないようだ。

    ところで、reply_data を送信するのに、ローカルループを使っている。ここで usbPoll() をリカーシブに call 。今回は、stack の使用量がちょっと多いので、少々まずいと思っている。動きだしたら、どうするか再検討したい。メモ。

コンフィグ

    const char usbDescrDevice[] = { .... };
    const char usbDescrConfig[] = { .... };
    const int16_t usbDescrString0[] = { .... };
    const int16_t usbDescrString1[] = { .... };
    const int16_t usbDescrString2[] = { .... };
    const int16_t usbDescrString3[] = { .... };
    const int16_t *usbDescrStringTable[4] = {
    usbDescrString0,
    usbDescrString1,
    usbDescrString2,
    usbDescrString3
    };

    V-USB と同じシンボル名で const データを作成しておくのだが、V-USB のような縛りはない。すなわち このデータを生成しておきさえすれば良い。別のソースコードにすることもできる。

    void usbInit();

    で、各エンドポイントの設定を含む初期化を行うのだが、usbDescrConfig・usbDescrConfig を解析して 設定を行う。ただし、全部自分で作るのは、面倒なので 定形フォーマットを desc_asp.c と desc_cdcmsc.c に用意している。これを使うにあたりルールが出来ていて、いくつか usbconfig.h に設定する必要がある。

    #define USE_IAD

    #define EP_INT 3 //
    #define EP_TX 1
    #define EP_RX 2
    //#define EP_MS_OUT 4
    //#define EP_MS_IN 5
    #define MAX_EP (EP_INT+1)

    #define EP_SIZE 8
    #define EP_INT_SIZE 8
    #define EP_TX_SIZE 32
    #define EP_RX_SIZE 32
    #define EP_MS_OUT_SIZE 32
    #define EP_MS_IN_SIZE 32
    #define USB_BUFFER_SIZE ((EP_SIZE + EP_SIZE\
    + EP_TX_SIZE + EP_RX_SIZE \
    + EP_INT_SIZE) * 2)


    これは、desc_cdcmsc.c を使うときの例。MAX_EP と USB_BUFFER_SIZE は PIC32MX 移植での新設パラメータ。PIC32MX では RAM から エンドポイントの定義 や バッファーをメモリから切り出すので、必要になった。( デフォルトでも良いが適当に設定してしまうのでメモリが無駄になる。)

    #define EP_SIZE 8
    #define MAX_EP 1

    #define USB_BUFFER_SIZE (EP_SIZE * 4)

    これは、desc_asp.c 関係。ずいぶん単純になる。

    メモ: usbDescrString0 などを送信する部分がバグっていた。

    const int16_t usbDescrString3[] = {
    0 | (3<<8),
    };

    たとえば、こんな風に最初に 文字列部分のバイト数が入るのだが、この情報自体は含まれない。だが、usb_reply_setup() で送るバイト数が p[0] となっている。要するに 2 バイト足りない。これは! AVR の版も同じはず。良く動いていたものだ。

    あと、const を付けているにも関わらず Data の方に行ってしまっている。

    a.out
    a0000020 D usbDescrString0
    a0000024 D usbDescrString3
    a0000028 D usbDescrStringTable

    desc_asp.o
    00000014 R usbDescrConfig
    00000000 R usbDescrDevice
    00000000 G usbDescrString0
    00000028 R usbDescrString1
    00000048 R usbDescrString2
    00000004 G usbDescrString3
    00000000 D usbDescrStringTable

    -G 0 を付けると G の部分が R に変わるのだが ... D は変わらず。どういうことなのだろう?

    とりあえず、アセンブラコードを生成させてチェック。
     .rdata, .sdata, .data
    このどれかのセクションにしているようだ。大きいデータは、read-only なら .rdata になるが、小さいデータは read-only でも .sdata になり結果 .data に割り付けられる。昔あったワークステーション向けの割付けで、キャッシュの効率だとかページの効率だとかを優先しているのだろう。組み込みチップに最適化してくれているわけでは無さそうだ。

HID について

    USB の仕様に詳しい人なら判るかも知れないが、実は いまの枠組みで HID にも対応できる。デスクリプタで HID_REPORT の定義を入れて usb_user_setup で

    if (request_type == USB_RQ_HID_SET_REPORT)

    この判断をすれば良いのだ。ブロックデータを送る場合も 253 バイトまでなら対応できるし、受信は usb_user_out で対応できる。

    いままで対応して来なかったのは、HID_REPORT の定義 自体が面倒だったため。だが、最近はわりと Windows を使っていて、ドライバなしで良いというのが魅力的に思えるようになってきた。今回の移植にあたっては、HID にも対応したいと思う。

CDC (シリアル) や MSC(Mass Storage Class) について

    ここまでなんの説明もしていなかったが、AT90USB162 では、CDC や MSC の対応もしていた.
    いままで説明して来たのは、usb162 (PIC32MX では usb220) モジュールの話で、CDC や MSC のコードは コンフィグ以外 usb162 とは切り離されている。

    これらは、独立した エンドポイント を持っていて、勝手に それらを使う。チップ依存のコードも CDC や MSC 側に入っている。usbPoll() については、

    void usbcdc_poll() {
    モジュール固有の処理
    :
    usbPoll();
    }

    まぁこんな感じで usbPoll() を call している。

    AVR では、それで良かったのだ。エンドポイントの扱いは すごく簡単だったし、コード量的にも性能的にも 有利だった。だが、PIC32MX はすごく面倒。共通関数化を考えた方が良いかも知れない。

PIC32MX でのエンドポイントの扱い方。

    今は、結構コードが組み上がって来ていて、ほんのわずかだが、動き出している。ただ、エンドポイントの扱いが難しく、SETUP の受信がいくつか出来ただけで、デスクリプタの送信がうまく行っていない状況。

    ちょっと AVR でどのように扱えていたか紹介しておこう。

    unsigned char usbcdc_getc(void) {
    unsigned char ret;
    UENUM = EP_TX;
    while (bit_is_clear(UEINTX,RWAL)) {
    usbcdc_poll();
    UENUM = EP_TX;
    }
    ret = UEDATX;
    return ret;
    }

    void usbcdc_putc(unsigned char data) {
    UENUM = EP_RX;
    while (bit_is_clear(UEINTX,RWAL)) {
    usbcdc_poll();
    UENUM = EP_RX;
    }
    UEDATX = data;
    }

    AVR だとこんな風にして アクセスできるのだ。UENUM で エンドポイントを指定してバンクを切り替えて、UEDATX で FIFO のアクセスをする。( RX も TX も同じレジスタ。)。ダブルバッファでも やり方は変わらない。

    PIC32MX では、バッファは全部 RAM に置く。そして、バッファの定義も RAM に置くようになっている。

    struct _usbotg_buffer_desc
    {
    volatile uint8_t ctl;
    volatile uint8_t rfu;
    volatile uint16_t len;
    uint32_t buf;
    };
    struct _usbotg_bdt
    {
    struct _usbotg_buffer_desc rx[2];
    struct _usbotg_buffer_desc tx[2];
    };
    extern struct _usbotg_bdt _usbotg_bdt[16]; /* MAX : 512B */

    struct _usbotg_bdt _usbotg_bdt[16] __attribute__((section(".bdt")));

    memset((void *)_usbotg_bdt, 0, 512); /* need clear first */
    uint32_t p = vtop((unsigned)_usbotg_bdt);
    U_BDTP1 = __ext_bits( p, 8, 8);
    U_BDTP2 = __ext_bits( p, 16, 8);
    U_BDTP3 = __ext_bits( p, 24, 8);

設定はこんな感じ。16 個までの エンドポイントの定義があって、それぞれ 受信用、送信用のバッファが 2 セットづつある。この定義を BDT -- Buffer Discriptor Table と言う。BDT のアドレス(物理アドレス)を USB コントローラに 渡すしくみ。

    PIC32MX は常に 2 個づつ使うのだが、PIC24F では、PPB の指定で、1 個づつにすることもできる。なにもかも同じではないので、注意

面倒なのは、512B アラインされてないといけないということ。しょうがないので、新たな セクションを RAM の先頭に定義して、そこに置くことにした。__attribute__ を使えば、C で定義を書くこともできる。

それぞれのバッファーは、バイトアラインでよい。送信バッファーは、FLASH 上に置くこともできる。... のだが、持っているコードの都合上 AVR と同じように使いたい。全部 RAM に割り当てて、メモリコピーにした。

このバッファは、交互に切り替えて使うらしい。どちらを使っているかを示すレジスタはなく、ずれるとまずい。

そこは、まだ良いのだ。DATA パケットは、送信も受信も DATA0/DATA1 の 2 種類があって、こちらの方も指定してやらないといけない。これは、2つのバッファとは独立。これの指定がよく分かってなくて混乱している。

V-USB のコードを見てみた。( 送信だけ、とりあえず。)

    初期値は DATA1 にして、送信前に切り替え (最初の送信は、DATA0)
    初期値を設定しなおすタイミングは、
     usbInit()
     USBRQ_SET_INTERFACE
     USBRQ_CLEAR_FEATURE, USBRQ_SET_FEATURE
      ( feature 0 == HALT for endpoint == 1 )
    の 3 ケース。後は常にトグル。

今のコード

    void usbcdc_putc(unsigned char data) {
    struct usb_buffer_ctl *bc = &usb_buffer_ctl[EP_RX];
    struct _usbotg_buffer_desc *cur_desc;
    int which;
    uint8_t ret;
    uint8_t *buf;

    while (bc->tx_ptr >= bc->buf_size) {
    usbcdc_poll();
    }
    which = which_buf_tx(bc);
    cur_desc = &_usbotg_bdt[EP_RX].tx[which];
    buf = (uint8_t *)to_kseg1(cur_desc->buf);

    buf[bc->tx_ptr++] = data;
    if (bc->tx_ptr >= bc->buf_size) {
    usbcdc_poll();
    }
    }

    いまは、こんなひどいコードになっている。usbcdc_poll() でバッファが空くまで待つ。bc は、グローバル変数を持っていればこんな計算は不要。buf も アドレス変換済みのものを bc で参照できるようにすれば良い。最後にある 2 回目の usbcdc_poll()は、送信を始めるために必要。

    if ( (bc->tx_ptr >= bc->buf_size)
    || bit_is_set(GPIOR2, USB220_CDC_SEND_REQ)
    || bit_is_set(GPIOR2, USB220_CDC_SEND_EMPTY) ) {
    bc= &usb_buffer_ctl[EP_RX];
    which = which_buf_tx(bc);
    next = which ^ 1;

    cur_desc = &_usbotg_bdt[EP_RX].tx[next];
    if (bit_is_clear(cur_desc->ctl, U_BD_UOWN)) {
    cur_desc = &_usbotg_bdt[EP_RX].tx[which];
    len = cur_desc->len = bc->tx_ptr;
    ctl = cur_desc->ctl & _BV(U_BD_DATA01);
    cur_desc->ctl = ctl | _BV(U_BD_DTS) | _BV(U_BD_UOWN);
    bc->tx_ptr = 0;
    bc->stat ^= _BV(UBC_RX_WHICH);
    bit_clear(GPIOR2, USB220_CDC_SEND_REQ);
    if (!len) bit_clear(GPIOR2, USB220_CDC_SEND_EMPTY);
    }
    }

    こちらは、usbcdc_poll() の中で実際に送信するコード。なんだか長い。ちなみに、USB220_CDC_SEND_REQ は強制的に 送信するための リクエスト。USB220_CDC_SEND_EMPTY は、さらに 0 バイトを送信させるためのもの。GPIOR2 は、AVR では、汎用レジスタでビット操作が効率良くできるため採用。PIC32MX では、ただの グローバル変数。ただ、PIC32MX でも どこか 空いているレジスタがあれば、使ってみたいとは思っている。

参考文献

     ・ PIC32MX220F032B 製品ページのリンク リファレンスマニュアル 『27章 USB On-The-Go』
     ・ PIC24F の『27章 USB On-The-Go』(日本語)

    PIC24F と PIC32MX では、USB OTG の部分はほとんど変わらないので 日本語のリファレンス・マニュアルが便利。

    以下の説明 で U_CON となっているところは、_ を 1 に置き換えて読む。( U1CON ) 。また、レジスタのフィールドは、たとえば U_CON_PPBRST と表現している。 あと U1EPn は、U_EP(n) と記述。

    以下参考文献から転載 (jzlib 用に名称を変更)

    27.4.1 デバイスモードの有効化
    1. PPBRST ビット (U_CON_PPBRST) を一旦セットしてからクリアする事によって、ピンポン
    バッファ ポインタをリセットする。
    2. 全てのUSB 割り込みを無効にする(U_IE = 0 および U_EIE = 0)。
    3. 既存の割り込みフラグがある場合はクリアする (U_IR = 0xFFおよび U_EIR = 0xFF)。
    4. VBUS が存在する事を確認する(OTG 以外のデバイスのみ )。
    5. USBENビット (U_CON_USBEN) をセットしてUSB モジュールを有効にする。
    6. OTGEN ビット (U_OTGCON_OTGEN)を「1」にセットする。
    7. 最初のセットアップ パケットを受信できるように、U_EP_EPRXEN および U_EP_EPHSHK ビット
    (U_EP(0)) をセットし、エンドポイント 0 バッファを有効にする。
    8. USBPWR ビット(U_PWRC_USBPWR)をセットし、USBモジュールに電力を供給する。
    9. DPPULUP ビット(U_OTGCON_DPPULUP = 1)をセットして D+ラインのプルアップ抵抗を有
    効にし、接続を通知する。

    (注) 6,9 の操作は、デバイス専用なら不要。
    (注) U_IR, U_EIRは、1 を書くとクリアされる。

    27.4.2 デバイスモードでの IN トークンの受信
    1. USBホストに接続し、エニュメレーション(USB 2.0仕様書第9章参照)を実行する。
    2. データバッファを作成する。このバッファにホストへ送信するデータを格納する。
    3. 目的のエンドポイントの適切な(EVEN またはODD) TX BDで次の設定を行う。
    a) ステータス レジスタ (BDnSTAT) に正しいデータトグル (DATA0/1) 値とデータバッ
    ファのバイトカウントを設定する。
    b) アドレス レジスタ(BDnADR)にデータバッファの開始アドレスを設定する。
    c) ステータス レジスタのUOWN ビットを「1」にセットする。
    4. USBモジュールは、IN トークンを受信すると自動的にバッファ内のデータを送信する。
    送信が完了すると、USBモジュールはステータス レジスタ (BDnSTAT)を更新し、転送
    完了割り込みビットTRNIF (U_IR U_I_TRN) をセットする。

    27.4.3 デバイスモードでの OUT トークンの受信
    1. USBホストに接続し、エニュメレーション(USB 2.0仕様書第9章参照)を実行する。
    2. ホストからの受信が予想されるデータサイズのデータバッファを作成する。
    3. 所定のエンドポイントの適切な(EVEN またはODD) TX BDで次の設定を行う。
    a) ステータス レジスタ (BDnSTAT) に正しいデータトグル (DATA0/1) 値とデータバッ
    ファのバイトカウントを設定する。
    b) アドレス レジスタ(BDnADR)にデータバッファの開始アドレスを設定する。
    c) ステータス レジスタのUOWN ビットを「1」にセットする。
    4. USB モジュールは、OUT トークンを受信するとホストがバッファに送信したデータを
    自動的に受信する。受信が完了すると、USB モジュールはステータス レジスタ
    (BDnSTAT)を更新し、転送完了割り込みビット TRNIF (U_IR U_I_TRN)をセットする。

    (注) BDnSTAT は、メモリ上(BDT)にある。
posted by すz at 19:47| Comment(0) | TrackBack(0) | PIC32MX