歩き遍路 平成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の変化が停止しました。
ホームへ戻る