RX72T
以前、RX72M 発表の際、デバイス単体で購入すべく、色々探して、最短で入手できる(マウサー)処から購入した。
その時、RX72T も販売していたので割高だったけど「ついでに」購入していた。
144ピンタイプで、変換基板が手元に無く、動かせていなかったが、変換基板を入手したので、動かしてみた。
RX72T は最大 200MHz で動作し、標準で USB を内蔵しており、エアコンなど家電向けのデバイスとなっている。
自分が買った時は、1500 円くらいだったと思うが、現在は 1000 円くらい( 100 ピンタイプ)で入手出来るようだ、RX66T と余り変わらない・・
※ RX66T は入手性が悪い。
基本的なスペック:
- 3.3V~5V 動作
- RXv3 コア
- 最大 200MHz 動作
- ROM (512K/1024K)
- RAM 128KB
- データフラッシュ 32KB
- ECC 付 RAM 16KB
- USB 内臓
※RXv3 コアだけど、DFPU はサポートしていない。
基本的なピン接続
最低限必要なピンだけ配線して、動作させた。
※自分はシリアル接続を基本としているので、SCI ブートモードを利用する。
ピン番は144ピンタイプのデバイスなので注意
ピン名 | ピン番 | 通常動作 | ブート時 |
---|---|---|---|
MD/FINED | 11 | PU(1) | PD(0) |
P00/UB | 9 | PD(0) | PD(0) |
PD5/RXD1 | 25 | TXD | TXD |
PD3/TXD1 | 27 | RXD | RXD |
EMLE | 7 | PD(0) | PD(0) |
/RES | 15 | PU(1) | PU(1) |
P37/XTAL | 16 | 16MHz | 16MHz |
P36/EXTAL | 18 | 16MHz | 16MHz |
VCL | 10 | 0.47uF | 0.47uF |
PD: プルダウン (4.7K)
PU: プルアップ (4.7K)
Vcc、Vss を全て接続して、バイパスコンデンサ(0.1uF)を接続する。
AVcc、AVss も同様に接続。
※ A/D変換で SN を上げる為には、アナログ系の電源に工夫をする必要がある。
- 動作レベル設定では、直で Vcc、Vss に接続しない事、必ず適当な抵抗を介して接続する。(入出力の場合がある)
- VCL は 0.47uF のセラミックコンデンサで Vss に接続。
- クリスタルは 16MHz を選んだ。(共振コンデンサは、8pF)
- 「/RES」にはリセット SW を設ける。
- USB ブートの場合は、「P00/UB」端子を「High」とする。
詳しくは、「RX72Tグループ ユーザーズマニュアル ハードウェア編」、「45. フラッシュメモリ」、「45.7.1 ブートモード (SCI インタフェース )」を参照
RX72T 対応サンプルコード
USER_DEFS = SIG_RX72T \
F_ICLK=192000000 \
F_PCLKA=96000000 F_PCLKB=48000000 F_PCLKC=192000000 F_PCLKD=48000000 \
F_FCLK=48000000 F_BCLK=48000000
RX72N 対応の時、RX72T も大体対応していたと思うので、FIRST_sample は普通に動作した。
※RX72T は、RX72N より、RX66T に仕様が近い。
#elif defined(SIG_RX72T)
static const char* system_str_ = { "RX72T" };
typedef device::system_io<16'000'000, 192'000'000> SYSTEM_IO;
typedef device::PORT<device::PORT0, device::bitpos::B1> LED;
typedef device::SCI1 SCI_CH;
FIRST_sample では、LED は P00 に接続するのが通例だったが、P00 は USB ブート時のサイン入力なので避け、P01 にしてある。
クリスタルは、USB 使用時は 192MHz 動作が必要で、USB を使わない最大速度 200MHz も可能なように 16MHz を選択した。
ソフトウェアーループの遅延を調整した。
static void micro_second(uint32_t us)
{
while(us > 0) {
...
#elif defined(SIG_RX72T)
// 192MHz: 250KHz: (63) 3008239 -> 253.304KHz
// 192MHz: 250KHz: (64) 3000000 -> 249.357KHz
for(uint32_t n = 0; n < (F_ICLK / 3000000); ++n) {
asm("nop");
}
...
SCI_sample を試したら、上手く通信出来ない・・
調べると、通信速度が半分になっていた。
最初、クロックデバイダの不具合なのかと思い、system_io クラスを調べたが問題無い。
原因は、sci_io クラスで、ボーレートクロックを微調整するパラメーターの問題だった。
「微調整機構 (MDDR)」では、全体のボーレートを、n/256 で微調整する。
誤差が、1/256 以下の場合(誤差 0.39% 以下)の場合、微調整をバイパスする必要がある。
if(mddr >= 128) brme = true;
mddr は、誤差が0の場合、256 が来る、それで、MDDR には「0」が設定されてしまう・・・
以下のように修正した。
if(mddr >= 128 && mddr < 256) brme = true;
結構、実装には自信があったクラスだけに多少ショックを受けている・・、まだまだだなーと思う瞬間だった・・
ついでに、ボーレートクロックの精度を高めるようなコードを追加した。
現状でサポートして動作確認したサンプルは以下のようになっている。
- FIRST_sample
- SCI_sample
- RAYTRACER_sample
- CALC_sample
フラッシュ書き込みプログラム「rx_prog」は対応済みで、問題無く書き込めた。
まとめ
RX72T はチップ単体の価格が1000円くらいでありながら、極めて高性能で、それなりに RAM もあるので、小物を作る際には重宝しそうなデバイスだと思う。
5V でも動作して、200MHz で動くのは、それなりにメリットがあるものと思う。
USB も標準で持っているので、PC に接続するようなデバイスを作成する場合にも便利そうだー
今後、サンプルコード対応をしていく。