歩き遍路 平成19年春(J1) 記録の準備
SPIでUSB( 7) SPIでMAX3420とMAX3421を
        H8/3067で制御 ハードウエア

 SPIでUSB( 2)で作ったMAX3420ボードの空きスペースにUSBペリフェラル/ホストコントローラのMAX3421を追加してH8/3067でテストプログラムで制御しました。
 テストプログラムは、MAX3421のアプリケーションノート AN3936 に有るテストプログラム boardtest をH8/3067用に修正しました。AN3936 に有るテストプログラムは、ARM用ソースプログラムですが修正部分は上手く纏められています。

●USBペリフェラル/ホストコントローラ MAX3421 はどんなLSI?

 USBペリフェラル/ホストコントローラ MAX3421は、USBのペリフェラルコントローラとホストコントローラをワンチップにしたハードウエアで制御マイコンとSPIインタフェースで接続します。
 ●USBのペリフェラルコントローラの機能は、SPIでUSB( 2)で使ったMAX3420と同等で、フルスピードで動作します。
 ●USBのホストコントローラの機能は、フルスピードとロースピードのホスト動作をします。

 ペリフェラルコントローラはMAX3420が有るので、MAX3421はホストコントローラの機能を期待しています。
に修正しました。AN3936 に有るテストプログラムは、ARM用ソースプログラムですが修正部分は上手く纏められています。

●MAX342xボード






 実験中の写真です

・上:MAX342xボードで

 左側がUSBペリフェラルコントローラの
MAX3420

 右側がUSBペリフェラル/ホストコントローラのMAX3421


・中間のケープルはSPIケーブルです。




・下:H8/3067マイコンボードです。




























・ペリフェラル/ホストコントローラの
MAX3421とUSBホストコネックタ、LED,スイッチです。
水晶発振子は変換基盤のパッドに付けています。

 C を表示しているタイミングを写しました。







































●テストプログラム

 テスト内容は単純で、MAX3420に接続した4つのLEDを周期的に1個だけ点灯させてシフトと、MAX3421に接続した7セグメントLEDの値を0からFまで昇順に変化させませす。ただし、スイッチを押している間は変化を停止します。

 プログラムは次の4ファイルで構成しています。
  ソフトウエアは、イエローソフト社のCコンパイラとデバッガを使います。

 ・boardtest.c Main() が有り、初期設定後周期的にMAX3420とMAX3421をアクセスしてLEDを変化させる。
 ・SPI_FNs.c  ハードウエアを制御します。マイコンの相違はこのファイルで吸収します。
 ・SPI_FNs.h  SPI_FNs.c 用のヘッダファイル。
 ・MAX3421E.h  MAX3420とMAX3421のレジスタとビットの定義するヘッダファイル。

 次は boardtest.c のコードです。
 ・ヘッダファイルのインクルードに続いてH8のポートを定義しています。
 ・Main() の先頭でMAX3420とMAX3421のレジスタを初期化します。
  注意点は、MAX3420とMAX3421のSPI通信をfull-duplexにすることです。
 ・Main() の後半は、ループで周期的にMAX3420とMAX3421を制御します。
  ほとんど時間待ちですが、MAX3420とMAX3421のスイッチの状態を調べ押下無しならLEDを変化させます。

// ********** boardtest.c をH8化 20090329

#include "SPI_FNs.h" // Basic functions to read and write the MAX3420E and MAX3421E regs.
#include "MAX3421E.h" // MAX3421E registers and bit names

#include <sysio.h> // for Yellow H8 C Compiler

#define P4DR (*((volatile unsigned char *)(0xffffd3)))
#define P4DDR (*((volatile unsigned char *)(0xfee003)))
#define P7DR (*((volatile unsigned char *)(0xffffd6)))
#define PADR (*((volatile unsigned char *)(0xffffd9)))
#define PADDR (*((volatile unsigned char *)(0xfee009)))
#define PBDR (*((volatile unsigned char *)(0xffffda)))
#define PBDDR (*((volatile unsigned char *)(0xfee00a)))

#define SMR2 (*((volatile unsigned char *)(0xffffc0)))
#define BRR2 (*((volatile unsigned char *)(0xffffc1)))
#define SCR2 (*((volatile unsigned char *)(0xffffc2)))
#define TDR2 (*((volatile unsigned char *)(0xffffc3)))
#define SSR2 (*((volatile unsigned char *)(0xffffc4)))
#define RDR2 (*((volatile unsigned char *)(0xffffc5)))
#define SCMR2 (*((volatile unsigned char *)(0xffffc6)))

// ********************
// ***** メイン
void main()
{

//??? void boardtest(void) // hangs here until board reset
//??? {

unsigned char dum, dum2, chase, rix, timeval;
//

//??? _ei(); /* 割込み許可 */
init_IO(); // IOの初期化

Hwreg(rIOPINS1,0x00); // 7-seg iff
Hwreg(rIOPINS2,0x00); // 7-seg off, VBUS to peripheral OFF
Hwreg(rPINCTL,0x10); // MAX3420: SPI=full-duplex

Pwreg(rPINCTL,0x1B); // MAX3420: SPI=full-duplex, INT=neg level, GPX=SOF

rix=0;
timeval = 0;
chase = 0x01;

// ********************
while(1) // copy buttons to lights
{
if(timeval > 10)
{
timeval=0;
dum = Prreg(rIOPINS1);
if((dum&0xF0)== 0xF0) // if all P buttons up (don't freeze)
{
chase <<= 1;
if (chase==0x10) chase = 0x01;
Pwreg(rIOPINS1,chase);
}
dum = Hrreg(rIOPINS1);
dum2 = Hrreg(rIOPINS2);
if (((dum&0x80)==0x80) & (dum2&0xF0)==0xF0) // if all H buttons up
{
if(rix==0x11) rix=0; // count 0-F in 7-seg readout
readout(rix++);
}
} //End Of if(timeval > 10)
TD10CYx(100);
TD10CYx(100);
TD10CYx(100);
TD10CYx(100);
TD10CYx(100);
TD10CYx(100);
TD10CYx(100);
TD10CYx(100);
TD10CYx(100);
TD10CYx(100);
timeval++;
} //End Of while(1)
} //End Of main()


●プログラムの実行と結果

 問題無く、LEDが変化中にスイッチを操作するとLEDの変化が停止しました。 


ホームへ戻る