この記事にたどり着いた方は、Silicon LabsのBusy Bee 8051マイクロコントローラのクロスバー機能に困惑し、頭を悩ませていることでしょう。プライオリティデコーダ、スキップレジスタといったキーワードや、ペリフェラルと物理的なI/Oピンの関係を示すファンクションマップと悪戦苦闘していることと思います。
簡単な解決策は、Silicon LabのSimplicity Studio IDE(Integrated Development Environment、統合開発環境)に組み込まれたグラフィカルな構成ツールを使用することです。これは多くのニーズを解決する優れたツールです。
-
しかし、複数のデバイス間でピン機能を共有したい場合はどうすればよいでしょうか?
-
クロスバーを動的に変更するにはどうすればよいでしょうか?
例えば、Busy Bee(Silicon Labs 8051)をどのように構成すれば、LCD制御ラインをSPIと共有することができるでしょうか。これは、性能要件が緩和された設計にとって重要なコスト削減の利点です。ここでの「緩和」とは、LCDの更新とSPI操作が同時に発生せず、更新速度が時分割多重化に対応するのに十分に低速であることを意味します。
この質問に答えるために、最初から始めましょう。クロスバーの動作について検討し、その後、ピン端子の共有を可能にする動的な構成を持つ、より複雑な例へと進みます。
技術的なヒント: ここでは、Silicon Labsの8051ファミリの新しい製品に焦点を当てます。重要なアップグレードの1つは、クロスバースキップレジスタの搭載です。これにより、C8051F000のような古いデバイスと比較して、ピン割り当ての柔軟性が大幅に向上しました。しかしながら、すでに抽象的で理解するのが難しい概念に、さらに複雑なプログラミングが加わることになります。 このapplication noteで説明されているように、旧デバイスのクロスバー構成の動作を再確認する良い機会かもしれません。
8051の長い伝統の中で、新しい機能は古いものの上に構築され、1980年当時のIntelまで遡るルーツを持っています。
クロスバーとは?
クロスバーは、ペリフェラルを特定のI/Oピンに割り振るために使用されます。この機能はマイクロコントローラによって扱いが異なります。一部のアーキテクチャでは、ピン割り当ての柔軟性がほとんどありません。このような最低限度のマイクロコントローラは、SPIなどのペリフェラルを物理的に1組のI/Oピンに割り振ります。プリント回路を開発する際には、この制限を回避する必要があります。理想的なのは、SPIなどのペリフェラルをどのピンにも割り振ることができることです。これは望ましいことですが、無制限の割り当てにはコストと複雑さが伴います。クロスバーは、この両極端の中間のソリューションを提供します。
クロスバーはゲートウェイです。クロスバーを通過しない限り、下位のI/Oポートには何も渡されません。このゲートウェイは、 極めて簡略化した図1に示すように、一連のマルチプレクサとして想定することができます。例えば、SPI0-SCK信号です。このSPI0-SCK信号は適切なプライオリティクロスバー レジスタがアクティブであれば、任意のP0ピンまたは選択されたP1ピンに振り分けることができます。
図1: Silicon Labsの8051クロスバーの簡略化された構成図
階層的ピン配置
クロスバーで最もいらいらさせられることの1つは、その抽象化です。ペリフェラルXがI/OピンYに接続されていることを明示的に述べていないことに注意してください。SPI0-SCKをP1.3に接続するようなコマンドはありません。その代わりに、所定の優先順位に基づいて処理を誘導します。
この優先順位は2次元で定義されます。
-
第1の次元の場合、優先順位はピンの順番と同じでP0.0が最も高い位置に割り当てられます。P0.1がやや低く、P0、P1のすべてのピンをすべて使い切るまで、また、マイクロコントローラによってはP2ピンまで続きます。
-
第2の次元は、ペリフェラルそのものに関するものです。UARTやSPIなどの通信デバイスは、PWMやタイマ出力よりも「重要」とみなされます。例として、プログラマーが3つのペリフェラルをすべてアクティブにしたとします。最初にUARTが割り当てられ、次にSPI、そしてPWMが割り当てられるでしょう。
クロスバーの属性の概要
以下の項目では、この記事の残りの部分で考慮しなければならないクロスバーの属性をまとめています。
-
クロスバーはペリフェラルとI/Oピン間のクリティカルパスに含まれています。クロスバーをアクティブにしないと、マイクロコントローラの出力はありません。
-
クロスバーは大規模な、優先機能付きマルチプレクサとして機能します。
-
プログラマーはマルチプレクサを明確には制御できません。代わりに、ピン端子は優先順位で割り当てられ、優先順位はペリフェラルタイプとI/Oピンを含む2つの次元に沿って定義されます。P0.0がピン階層の次元で最も高い優先順位であるのに対して、USARTはペリフェラルの次元に沿って最も高い優先順位を持ちます。
-
クロスバーは動的に設定することができます。しかし、XBRnレジスタを変更してデバイスをオフにすると、優先順位が変更され、その結果ピンの割り当てが変更されます。これは、PxSKIPレジスタを使用することで軽減できます。これについては、本記事で後ほど触れます。
スタートガイド
クロスバーのプログラミングを試みる前に、計画を立てておくことが重要です。すべてのI/Oを特定し、マイクロコントローラにマッピングする必要があります。最低限、どのペリフェラルをアクティブにするかを特定する必要があります。
この例では、Busy Bee MicrocontrollerであるEFM8BB10F8G-A-SOIC16Rを想定しています。本プロジェクトでは、以下をアクティブにします。
- SPI(NSSソフトウェア制御による連続書き込みの3線式モード)
- PWM0
- PWM1
- 今回はUARTを使用しませんが、将来的に予約されています。
- 残りのピンはADCのような汎用、または非クロスバーのペリフェラル用に予約されています。
その結果、得られたI/Oマップを図2に示します。左の表は物理的なI/Oピンに関連付けられ、参考のためにSOIC-16 ICの外形図が示されています。右の表はクロスバーのマトリックスを表しています。これはBusy Beeのデータシートにある表をSOIC-16デバイスで利用可能で限定的なオプションを反映するために簡略化したものです。
この階層表には、2つの次元にわたる最優先事項が含まれていることに注意してください。また、データシートの記載とは異なり、この表には関連するXBARxおよびPxSKIPレジスタも含まれています。
図2: SPIとPWMを備えた8051プロジェクトのI/Oピンのピン配置とクロスバーのサポート
UARTから始めましょう。この最優先ペリフェラルを将来の使用のために予約したことを思い出してください。デバイスをイネーブルにするのではなく、P0.4とP0.5の対応する位置にSを置くことでピン割り当てをスキップします。後で関連する P0SKIPビットを設定する必要があります。
次にSPIを割り当てます。P0.0からP0.2までの最も優先度の高いI/Oを使用します。これはSOIC-16デバイスの物理的な3番ピン、2番ピン、1番ピン、および16番ピン(チップセレクト)に対応していることに注意してください。これは、すべてのSPIのI/OがICの片側に配置されているため利便性が高く、PCBレイアウトが簡素化されます。後ほど、関連するXBR0ビットを設定する必要があります。
最後の割り当ては、プログラマブルカウンタアレイ(PCA0)の一部であるPWMです。2つのPWM出力をP0.6とP0.7に割り当てることができます。しかし、プリント基板配線の観点からは、都合よくSOIC-16パッケージの端にあるP1.1とP1.2ピンを使用する方がよいでしょう。
技術的なヒント: ピンの割り当ては反復作業です。クロスバーの優先順位マップと一緒に、指定されたマイコンパッケージの物理的なマッピングがあると便利です。別々に考えたのではわからなかったかもしれませんが、一緒にすることで、望ましいプリント基板配線が示されます。
次に進む前に、図2を見て、確認してください。
-
黒く塗られた部分は、今回使用するBusy Beeでは使用できません。
-
UARTは例外的に、P0.4とP0.5に固定されます。
-
UARTの例外処理が完了したら、I/Oピンにおいて割り当て(X)またはスキップ(S)を左から右に移動します。間違うと望ましくないピンが左にシフトしてしまうので、各列にXまたはSを明確に配置することが重要です。ペリフェラルXがI/OピンYに接続されていることを明示するのではなく、優先順位を割り当て、クロスバーが実際の割り当てを行うことを覚えておいてください。
-
わかりやすくするため、配置したXまたはSより下の列にはすべて影を付けています。
-
クロスバーのテーブルを斜めに「移行」します。
-
このSOIC-16デバイスの場合、利用可能な物理I/Oピンの数よりもペリフェラルの数の方が多いのです。
クロスバーテーブルをSFR値に変換
クロスバーテーブルに希望の接続(X)とスキップ(S)を記入することにより、適切なレジスタを割り当てることができます。これは、クロスバーテーブルの左欄のXBRxレジスタと、下の欄のPxSKIPレジスタの交差する欄に書き込むことで行います。
スキップレジスタから始めましょう。左から右に読み、スキップします。
- P0.3(SPIチップセレクトラインのソフトウェア制御)
- P0.4とP0.5(将来的にUARTを使用したい場合に備えて予約)
- P0.6、P0.7、P1.0(SOIC-16パッケージのため、プリント基板配線に最適)
Busy Beeリファレンスマニュアルによれば、スキップは論理1だということが分かります。したがって、値は次のようになります。
P0SKIP = 0xF8;
P1SKIP = 0x01;
これでXBRxの割り当てに移ることができます。上から下に読み、スキップします。
- UART
- SMB0EからSYSCLK(包含的)までの全てのペリフェラル
もう一度、Busy Beeのリファレンスマニュアルを見ると、割り当てが論理1であることがわかります。したがって、次のようになります。
XBR0 = 0x01;
XBR1 = 0x02; // Use two of the three PWM outputs
最後のステップは、SPIとPWMを含むペリフェラル自体の設定と有効化です。さまざまなPxMDINとPxMDOUTレジスタも汎用I/OとADC動作用に設定する必要があります。
それはまた別の機会にします。
動的なクロスバーの設定
この時点で、クロスバーを設定するコードが完成しました。必要なのは、while(1)のスーパーループに入る前に、このコードを一度呼び出すことだけです。クロスバーを一度設定すれば、ほとんどのプログラムではこれで十分です。以降は忘れてください。しかし、すべてのプログラムが同じとは限りません。
マイクロコントローラにLCD文字ディスプレイを追加したいとします。SOIC-16 はわずか16ピンに制限されたデバイスです。SPI、LCD、その他の重要な汎用I/Oをサポートするには十分な数のピンがありません。
ちょっとした工夫と慎重なプログラミングにより、外部ハードウェアはI/Oピンを共有することができます。このプロジェクトでは、SPIのI/Oピンのうち3本をLCDと共有することができます。これは同時動作ではありません。その代わり、SPIとLCDの要求が十分に低いため、明らかな遅延や干渉が生じないことを理解した上で、時分割多重化します。多重化により、8051はLCDにコマンドを送り、少し後にクロスバーをシフトさせ、SPIデバイスと通信できるようにします。
クロスバーはBusy BeeのP0とP1のI/Oピンへのゲートウェイであることを思い出してください。また、クロスバーはP0.0からP0.3のSPIピン用に設定されていることを思い出してください。この構成では、P0.0のようなポートラッチへの書き込みはI/Oピンに影響を与えません。
XBR0.SPI0Eビットをクリアすることで、SPIをI/Oピンから切り離すことができます。残念なことに、この操作を行うと、2つのPWMがP0.6とP0.7の位置へ、左側に3つ移動し、ピンが再割り当てされることになります。
この本質的なメカニズムをもう一度説明しましょう。
PxSKIPレジスタを同時に変更せずにXBRxレジスタを動的に変更すると、意図しないピンが再配置されます。
この設定を維持するには、元のスキップされたI/Oとともに、SPIのP0.0~P0.3ピンをスキップするようクロスバーにコマンドを送る必要があります。この新しい設定を図3に示します。以下が新しいクロスバーの設定です。
XBR2 = 0x00; // Global disable of all I/O cells blocks
P0SKIP = 0xFF;
P1SKIP = 0x01;
XBR0 = 0x00;
XBR1 = 0x02; // Use two of the three PWM outputs
XBR2 = 0x40; // Global enable of all I/O cells blocks
図3: SPIをオフにした場合のピン配置を維持したI/Oピン割り当て
技術的なヒント: 各デバイスに独立したセレクトラインがある場合、SPIによって複数のデバイスを並列接続できます。これは、選択されていない全てのデバイスのMISOピンがハイインピーダンス状態になることを意味します。これによって、いつでも1つのデバイスがそのライン上で通信できるようになります。推奨されないかもしれませんが、マスターのマイクロコントローラは、他のすべてのデバイスがMISOピン端子をハイインピーダンス状態にしてディスエーブルになっていると仮定すれば、このラインを他の目的に使用することができます。
これは書きがいのある記事でした。振り返ってみると、クロスバーは非常にシンプルなメカニズムです。最も難しいのは、最初にI/Oピンの割り付けを行うことです。
この投稿によって、明確にご理解して頂けることを願っています。
コメントや提案をお待ちしております。
幸運をお祈りします。
APDahlen