PICに内蔵されているUSB機能の実験パート2
(CDCクラスでパソコンとデータの送受信を行う)

〔パート1〕   〔パート3〕 〔パート4〕 〔パート5〕 〔パート6〕 〔マイコンのトップに戻る〕


パート1ではPICでUSB機能を利用する為に必要なソフトウエアをインストールしました。
このパート2では、PCとPIC間をUSBで接続しUSARTシリアル通信の様にデータをやり取りしてみたいと思います。

今回使用するPICは18F14K50で秋月電子のUSB対応超小型マイコンボードです、
USBで利用する為の部品が全て実装されているので便利に使用出来ます。

転送速度

転送速度 USB 1.0 USB 1.1 USB 2.0 USB 3.0
Low Speed
(LSモード)
1.5Mbps
Full Speed
(FSモード)
12Mbps
High Speed
(HSモード)
480Mbps
SuperSpeed
(SSモード)
5Gbps

18F14K50でUSBを利用するには、システムクロックを外部の水晶振動子から入れてやらないとダメ
です、このマイコンボードには外部12MHzが付いているのでこれを使います。
今回の設定は"Full Speed mode(12Mbps)"です、18F14K50はフルスピードにする為にはUSBクロック
48MHzにしないとダメなので外部12MHzをx4倍(4xPLL)で使います。
ちなみにロースピードで利用する場合、はUSBクロックを 6MHz にすれば良さそうです。

尚、USBクロックは 6MHz/48MHzですが、システムクロックは"CPU Divider:CPUクロック分周器"が
有るのでUSBクロックよりも低速で駆動可能です、その設定はコンフィギュレーションの"CPUDIV"で
行います。

転送モード

コントロール転送 ホストがデバイスをプラグ&プレイする為に使用されたり、
デバイスを制御したり設定したり等を行う為に主に使われます。 (全てのUSB機器がこのモードは実装しています)
バルク転送 大量のデータを非周期的に送信する場合に使われます。
転送優先度が低く、他の転送の空きに送信されるので遅延が発生します。
インタラプト転送 マウスやキーボードの様にイベントが発生した場合に使用さ れます。
但し、ホストが周期的にポーリングを行いその時に処理されます、周期期間はデバイス側にて報告します。
アイソクロナス転送 連続的で周期的にデータの転送を行う為に使われます。
例えば、動画・音声データの様なリアルタイム性の転送に使われます。
なのでエラー発生時の再送は行われません。

USBには以上の四つの転送モードが有ります。
ロースピード時は、バルク転送・アイソクロナス転送は利用出来ません。
今回のCDCクラスでは”バルク転送”が使用され、転送は64バイト単位に行われます。
(インタラプト転送も実装していますが、今回のプログラムでは利用していません)

デバイス・クラス

USB機器では、各USB装置の種類(USBメモリ・プリンタ・マウス等)によってデバイス・クラスが
分かれています。
なので各クラスによってインターフェース仕様が決められているので、それぞれのクラス仕様に沿って
設計をする必要が有ります。
そうする事により、Windowsでは標準の各クラス対応ドライバが準備されているので新たにドライバを
インストールしなくても利用可能になるのです。

例えばUSBメモリを作るとすれば、"USB mass-storage device class(マスストレージクラス)"になり
これに準拠する制御インターフェースでプログラムすれば、USB端子に接続するだけで標準ドライバが
読み込まれエクスプローラーが自動的に立ち上がる分けですよ。

今回は”USARTシリアル通信の様にデータをやり取りしてみたい”ですので、
"USB communications device class:(Communications and CDC Control)"のCDCクラスを
利用します。
これによりUSB端子に接続すれば、標準の「USB Serial Port」ドライバが自動的に起動され、
シリアル通信がエミュレートされる分けですよ、後はシリアル通信アプリ(Tera Term等)で送受信が
出来る事になります。

また、今回設定されているサブクラスは"Abstract Control Model"で、
プロトコールコードは"AT Commands: V.250 etc"をエミュレートするとなっています。

尚、その他のクラスの話はこちらのウィキペディアでも読んで下さい。

《ダウンロードプログラム》

"v2016-11-07"バージョンでのXC8デモ *2)

デモプログラムのプロジェクトはMPLAB X IDE(v3.50)/XC8(1.40)でコンパイルを行っています。
プロジェクトのフォルダーは、"C:\microchip\mla\v2016_11_07\apps\usb\device\cdc_basic\
firmware\low_pin_count_usb_development_kit_pic18f14k50.x"
に有るのでMPLAB Xで
プロジェクトを開きましょう。

@ MPLAB X IDEでプロジェクトを読み込みます。

A このプロジェクトは、"Debug Tool"が"ICD 3"になっているので、PICKit3の人は変更します。

B コンパイルしPICに書き込みます、後は下記述のC・Dと同じです。

Tera Term等がない人は、"C:\microchip\mla\v2016_11_07\apps\usb\device\cdc_basic\
utilities\bin\USB_Serial_Terminal.exe"
を使いましょう。

尚、PIC16F1459用は"low_pin_count_usb_development_kit_pic16f1459.x"に有ります。


"v2013-02-15"旧バージョンでのC18デモ

このダウンロードプログラムは、[microchip_solutions_v2013-02-15]ライブラリの中の
USB”フォルダー内に有る”Device - CDC - Basic Demo\Firmware\USB Device - CDC - Basic
Demo - C18 - Low Pin Count USB Development Kit.mcp
”のプロジェクトファイルを
流用しました。
但し、このファイルは18F14K50のデモボード用なので通常の18F14K50用に、"main.c"を
改造しました、その他のファイルは元のままです。

パソコンとUSBで接続しデータの送受信を行う場合の雛型プログラムとして利用して下さい。

@ ここからダウンロードし解凍して下さい。

A 解凍すると"18F14K50- CDC - Basic Demo"フォルダーが出来ます、このフォルダーごと全て、
  "microchip_solutions_v2013-02-15\USB\"のフォルダー下に移動させて下さい。

B 後は MPLAB IDE でプロジェクトファイル(xxxx.mcp)を読み込みコンパイルし、
  18F14K50にプログラムを書き込みます。
  MPLAB IDE(V8.84)/MPLAB(R) C Compiler for PIC18 MCUs V3.46 を使用

C 18F14K50をパソコンにUSBケーブルで接続します、「USB Serial Port」ドライバが読込まれます。
  電源はUSBから供給し、消費電流は100mAまでとなっています。
  (最大500mAまで変更可能ですが、初期化が完了後提供されるので注意が必要です)

D シリアル通信アプリ(Tera Term等)を起動させデータを18F14K50に送れば、そのデータに+1した
  データが送り返されます。

COMポート番号の確認

デバイスマネージャー画面  「USB Serial Port」ドライバが読込まれたら、

 [コントロールパネル]→[システムとセキュリティ]→
 [システム]→[デバイスマネージャー]をクリックして行き
 「デバイスマネージャー」画面の"ポート(COMとLPT)"を
 クリックすれば"USB Serial Port"が有るのでその右横
 に書いて有るCOMポート番号を見ましょう。


もし、ドライバが自動的に読み込まれなかったりで失敗した場合は、
"microchip_solutions_v2013-02-15\USB\Device - CDC - Basic Demo\inf"のフォルダーに
有る、ドライバを指定して手動で読み込ませて下さい。

Tera Term での例

Tera Term画面  Tera Term を起動させると左図が表示されます。

 ”Serial”にチェックを入れます。
 ”Port:”で「USB Serial Port」を選びます。
 [OK]ボタンをクリックします。

 後は画面が表示されたらキーボードを押します。
 [1]キーを押したら表示は"2"です。
 (+1したデータが返されるので)


文字列の送信は画面にコピーペーストすれば、その文字全てが+1して表示されます。(漢字文字は不可)

また、Arduino IDE のシリアル画面でも送受信可能です。

ポーリングで処理

割り込みで処理すると、"USBDeviceTasks()"関数が優先度の高い割り込み処理関数の中で
実行されるので他の割り込み処理を記述した場合に上手く動作しないかも?
そんな時はポーリングで処理させれば良いかも?
ポーリングで処理させる場合は、"usb_config.h"ファイルの中に
//#define USB_POLLING
#define USB_INTERRUPT
と有るので
#define USB_POLLING
//#define USB_INTERRUPT
と変更すればOK
でもぉ、"USBDeviceTasks()"関数は短い間隔で頻繁に呼び出さないといけない様な事が書いて有る
のでぇ、周期タイマーの割り込みに入れた方が良いかなぁ?(未実験)

内部プルアップ抵抗

今回のプログラム設定で内部プルアップが有効に設定されています、フルスピードの場合は
D+端子がプルアップされ、ロースピードの場合はD−端子がプルアップされます。

《その他》

USB仕様はUSBインプリメンターズ・フォーラム(USB-IF)のこちらを参照下さい。
各デバイスクラスのドキュメントはUSB−IFのこちらを参照下さい。 *2)

18F14K50のデータシートはこちらです。

"microchip_solutions_v2013-02-15\USB\Device - CDC - Serial Emulator"のフォルダーの
サンプルデモは、FT232RLを使ったこちらの「USBシリアル変換モジュール」の様に動作をさせられます。
しかも安くてI/O数が多いですねぇ、あぁ、パソコンに接続するI/Oボードなんかも出来そうですね。

USB規格については、少しずつ、ぼちぼち調べて勉強して行こうと思っています。

次回のパート3ではUSB機器を開発する場合に便利かもな?ツールを紹介します。

XC8 C Compiler 対応での実験記事追加しました、パート4を参照下さい。  *1)



"v2016-11-07"用記事とリンク切れ見直し(*2) 2017/01/22
追記(*1) 2013/09/15


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2017 Shigehiro Kimura All Rights Reserved.