USBメモリーで、おなじみのUSBインターフェースですが、どのようにデータが転送されるのかは、案外、知られていません。そこで、今回の特集ではUSB2.0の概略を取り上げ、USBの仕組みをわかりやすく解説しました。
よく知られている通り、USBはパソコンを主体として、非常に普及したシリアルインターフェースです。USBは、全体をコントロールする「ホスト」と、その指令に従ってデータを送受信する「デバイス」からなっています。パソコンがホストで、USB端子でパソコン本体と繋がっているマウス、キーボード、メモリー、マイク、スピーカーなどがデバイスとなります。
USBの特長としてプラグアンドプレーが上げられます。パソコンの USB端子にUSBメモリーを差し込んだり抜いたりするときに、いちいちパソコンの電源を落とさなくても済みます。この簡便さが USB が普及した理由の一つです。
パソコン以外でもUSBインターフェースが使われています。その場合、もっとシンプルな使い方が多いようです。たとえば、USB端子付きの複合プリンターを例に挙げてみましょう。複合プリンターと言えば、ネットワークを介してパソコンと接続し、パソコンの情報をプリント・アウトするものが一般的です。しかし、中には、パソコンを使わずに、単独で写真などの印刷ができるものもあります。その場合、複合プリンター内部のUSBホストは、いろいろなUSBデバイスが接続されるパソコンのホストとは違い、USBメモリーから写真などのデータを取り込むだけの機能があれば十分です。マウスやキーボードなどが接続されることはありません。このように、ホストとデバイスが一対一に接続され、しかも、接続されるデバイスの種類が決まっている場合には、ホスト用の制御回路としては、「ホスト機能を内蔵したマイコン」が最適となります。
当社の32ビットマイコン TX03シリーズにはUSBホスト、または、USBデバイス機能を搭載したマイコンが用意されています。M360グループにはUSB2.0 Full Speed (12Mbps)、に対応したホスト機能、または、同デバイス機能をそれぞれ搭載したもの、さらに、ホスト、デバイスの両方の機能を集積したものがあります。また、M320グループはオーディオ専用のUSB2.0ホスト機能を持ち、Full Speed だけではなく、High Speed (480Mbps) にも対応しています。
これらのマイコンの詳細は後述します。
パソコンにUSBメモリー(デバイス)を差し込んだときの動作を見てみましょう。メモリーが接続されると、ホストはそれを見つけ出します。実は、いつ接続されてもいいようにホストは定期的に全てのUSBポートをチェックしているのです。次にホストは新しく接続されたそのデバイスから情報を入手し、最適なドライバーを選択したり、そのデバイスにアドレス番号を付与したりします。これをエニュメレーション(enumeration)と呼びます。エニュメレーションが成功して始めて、ホストはデバイスを正しくアクセスできるようになります。
USBメモリーに記憶されたデータをパソコンのハード・ディスクに転送する場合は、まず、ホストがメモリーにデータを送るよう、指令を出します。メモリーは要求されたデータをホストに送ります。ホストはデータを正しく受け取るとアクノリッジ(転送成功)をメモリーに返します。これでデータ転送が完了します。一方、パソコンのデータをUSBメモリーに記憶させるためには、まず、ホストがメモリーにデータを送ることを伝え、その後、データを送ります。メモリーはデータを受け取った後に、アクノリッジをホストに返します。
USBメモリーをパソコンから引き抜く場合は、まず、何かの方法でホストにこれから引き抜こうとしていることを知らせます(たとえばアイコンをクリックします)。するとホストは、いつ引き抜かれてもいいようにメモリーとの接続を切断します。それを受けて、パソコンがメモリーを抜いてもいいというメッセージを画面に出します。
パソコンにUSBメモリーを接続したり引き抜いたりという手順は、皆さんご存知ですね。
USB2.0には3種類の転送スピードがあります。Low Speed (1.5 Mbps)、Full Speed (12 Mbps)、および、High Speed (480 Mbps)ですが、当社のTX03シリーズのマイクロコントローラーに内蔵されたUSB2.0インターフェースは、主に、Full Speed に対応しています。
ここからは、USB2.0 Full Speedで使われている転送データの構造を説明します。まずは、シリアル・データのフォーマットを紹介します。次に、データ転送のための4つのタイプについて説明し、最後に、実際の信号波形について解説します。解説の内容は以下の通りです。
USB2.0 のフォーマット
転送タイプ
信号波形
USB2.0で転送されるデータの最小単位をパケットと呼びます。1つのパケットは、
からなります。
SYNCフィールドは8ビットで、データの送信側と受信側のクロックの同期を取るために送られます。PIDは、このパケットが送るデータの種類を表します。DATAは実際に転送されるデータであり、CRCはDATAの転送に誤りが無かったかをチェックするためのコードが入っています。上の図はパケットの一般的なフォーマットを表したもので、実際には以下の3種類のパケットが用意されています。
ADR(USBアドレス)、および、ENDP(エンド・ポイント)は、次に紹介するデータ・パケットの「DATA」の送信先、もしくは、受信先を示すアドレスの値です。
ハンドシェーク・パケットにはDATA、または、CRCはありません。
トークン・パケット、データ・パケット、および、ハンドシェーク・パケットを紹介しましたが、実際の通信にはこれらのパケットを組み合わせて使います。例として、ホストがデバイスからデータ(DATA)を受信する場合を見てみましょう。
まず、ホストがトークン・パケットを出力します。この場合、特定のデバイスからデータを送ってもらうために、デバイスのADRとENDPを指定し、さらに、PIDをデータ受信(IN)という命令コードにします。
これを受けて、デバイスは指定されたアドレスからデータを出力します(データ・パケット)。
ホストは、このDATAを正しく受け取ったことをデバイスに伝えるために、アクノリッジ(ACK)を返します(ハンドシェーク・パケット)。このACKのコードはPIDフィールドを使って転送されます。これで、デバイスからホストへのデータ転送が完了しました。
このような、トークン、データ、ハンドシェークのパケットを連続して組み合わせたものをトランザクションと呼びます。
USB2.0 Full Speed転送で、最大長の単位がフレームです。1フレームの長さは1msと決まっています。それぞれのフレームはSOF(スタート・オブ・フレーム)パケットで始まります。SOFパケットの後には前述のトランザクションが多数、連なります。
USB2.0 には、データの種類に応じて4つの転送タイプがあります。それらは、コントロール、バルク、インターラプト、および、アイソクロナスと呼ばれています。
コントロールのためのデータを転送する場合に使われます。ホストがデバイスをエニュメレーションするとき、互いに、確実にデータを転送するため、1回の送信データの長さを短くし、必要なデータを小まめに何回も転送するものです。
大容量のデータを転送するために使います。たとえば、USBメモリーに保存されているデータをパソコンのフォルダーに転送する場合、データ・パケットのDATAフィールドをできるだけ長くし、1回の転送のデータ量を増加させます。バルク・タイプは、緊急のデータ転送が割り込んできたときは、転送を一時的にストップして、信号線を明け渡すことができます。
優先順位が一番高い転送タイプで、不定期に緊急のデータ転送をしたいときに使用されます。たとえば、パソコンのマウス(デバイス)の情報がこれに当たります。マウスを動かし、クリックするという操作はパソコンを操作している人が必要に応じて行うもので、ホストから見ればいつ信号が来るかわからないため、いつも見張っていなければならない相手です。いったん、マウスが動かされたときは、すぐさま対応できるよう、データ転送の優先順位を上げてあります。
リアル・タイムにデータを転送する必要があるときに用います。使用例としては、動画の画像データや音楽データの転送が上げられます。画像や音楽は連続したデータを途切れなく送らなければなりません。この場合、いちいちデータが正しく届いたかどうかを確認する暇はありませんので、ハンドシェークは不要です。つまり、受信側からハンドシェーク・パケットは出力されません。
以上のように、転送されるデータに応じて転送タイプを選択できるように、きめ細かい配慮がなされています。
USB2.0のケーブル内の信号線は一組4本からなっています。電源(VDD)、接地電位(GND)、信号D+、および、信号D-です。データは互いに相 補的な値を取ります。つまり、D+が high levelで、D-がlow levelのときが「差動1(Differential 1)」、反対に、D+がlow levelでD-がhigh levelのときを「差動0(Differential 0)」としています。データ転送にはNRZI (non-return to zero inverted) というフォーマットが使われています。これに従いますと、1クロックの間に信号の変化が無かったときはデータ「1」、変化(0→1、または、1→0)が あったときはデータ「0」となります。
USB2.0インターフェースにクロック信号はありません。非同期式です。したがって、ホストとデバイスのそれぞれのクロックを同期させなければなりません。USB2.0の Full Speedでは、クロックを同期させるため送信データの先頭に8ビットのSYNCパターンがあります。これにより受信側は送信側のクロックと同期を取ることができます。
以上でUSBインターフェースの解説を終えます。