ラベル Alternate Function の投稿を表示しています。 すべての投稿を表示
ラベル Alternate Function の投稿を表示しています。 すべての投稿を表示

2009年2月18日水曜日

Alternate Functionとピンの重複

複数の周辺回路が同一のI/Oに割り当てられている場合の問題と対策について調べた。STM32シリーズエラッタシート内の「STM32F10xx Silicon Limitations」において、 Alternate Function で生じる問題について書かれていた。

CAN と USART1 間の問題

リマップをしない状態では、CANで使われるRX/TXはそれぞれ、USART1のCTS/RTSとPA11/12ピンを共有する。RXとCTS、TXとRTSはそれぞれ入力と出力なので、PA11/12ピンはそれぞれAlternate In と Alternate Out と設定して使用する。

このとき、CANが割り当てられてはいるが使わない(not clocked)場合においても、PA12ピンでは'1'が出力されてしまうという不具合があるらしい(エラッタシートP.7)。そのため、CTS/RTSを使ったハードウェアフロー制御が行えなくなる。フロー制御を行いたい場合、CANの使用にかかわらず、CANをPA11/12以外にリマップしなくてはならない。(CAN_REMAPを"00"以外にすればよい)

SPI1とUSART2間の問題(エラッタ2.4.2 - 2.4.3)

USART2はPA0からPA4をCTS, RTS, TX, RX, CKとして使い、同期通信が可能となっている。一方SPI1は、PA4からPA7を nSS, SCK, MISO, MOSIとして使っている。 (どちらもリマップを行わない状態において)

USART2のCKは、同期通信モードを有効にすると出力になり、それ以外は使用されない。 SPIはマスター/スレーブを切り替えることができ、スレーブセレクト(nSS)はマスターで出力、スレーブで入力となる。

エラッタシートの2.4.2によればSPIスレーブ時はUSART2は同期通信モードを使用できない(対策はない)という。これは、USARTの出力するクロックがスレーブセレクトへ入力されてしまうためと考えられる。また2.4.3によれば、SPIマスター時にSPIのスレーブセレクトを出力しないよう設定すれば、USART同期通信モードを使用することは可能という。このためにはSPI_CR2のSSOE(Slave Select Output Enable)ビットをクリアすればよい。

これらの記述から分かったこと

周辺回路のピンが重複している場合においても、どちらかが重複箇所を使用しないよう設定することができれば、機能は限定されるものの共存は可能であることが伺える。(ピンが重複していて、どちらもそのピンを使用しないように設定できないなら共存はできない)。 大抵は何らかのイネーブルレジスタが用意されているようだ。 リマップ後に重複するような場合についても、同様だと思われる。

ピンが重複している場合でも、CANとUSART1のような例外を除き、基本的には片方が停止していれば問題ないと思われる。

マイコンの中は設定可能だが、基板の配線は決まっている。リセット直後は基板にあわせたコンフィギュレーションを行う必要があるため、コンフィギュレーションとその後のGPIOロック(リファレンスマニュアル参照)を行うルーチンを用意しておく必要がありそうだ。 設定を正しく行えないと、最悪の場合は外部のICとI/Oを破壊する可能性もあるため、コンフィギュレーションについては慎重に行う必要がありそうだ。

重複ピンの内部で出力同士が衝突するかについては記述されていないが、破壊されるようなことはないと信じたい(ORバスのような何かで直接は衝突しないはず...)。

STM32のAlternate Functionが分からない

STM32ファミリのマイコンは周辺回路を多く持っている。一般的なマイコン同様、1つのI/OピンにGPIOと複数の周辺回路が割り当てられている。I/Oピンの入出力設定を行うレジスタでは、I/Oピンを入力・出力・Alternate Functionという3つのモードに切り替えられるらしい。更にプルアップやプルダウンの設定、動作速度の設定もできるらしい。(RM0008 Alternate Functionについての解説より)

GPIOの出力レジスタODR(Output Data Register)は出力バッファに接続されており、出力モードが設定されたビットにはODRの値に対応する電圧が出力される。Alternate Functionモード(これにも入出力はある)にすると、ODRのは出力バッファから切り離され、代わりに周辺回路が接続される。

この考え方は他のマイコンと同じだが、STM32では複数の周辺回路で一部のピンが重複して割り当てられていることがある。この場合周辺回路を同時に使えないはずだが、どちらの機能がピンを使えるの設定を行う方法が不明。重複した周辺回路の片方が、そのピンを使わないよう設定できたりしたら、同時に使うことができるのだろうか?

また、周辺回路は接続先のI/Oピンを切り替えられることがあるのだが(これをリマップと言い、ソフトウェアからリマップレジスタの値を書き換えることで2~4通りの接続が選択できる)、リマップ先が重複していることがある。リマップしても重複していれば当然使えないはずだが...どちらを使うかの設定はどこでするのだろう?

同じピンに複数の周辺回路が割り当てられた場合、やはり2つの回路を同時に有効にしてはいけないのだろうか(出力バッファへの入力が2つの回路から駆動されるため)。明示的に周辺回路を切り替えられる仕組みがあったりするのだろうか。何らかの注意が書かれていて欲しいが、マニュアルから見つけられずにいる。