歩き遍路 平成19年春(J1) 記録の準備
UTMI/ULPIでUSB( 4) パソコンからUSB3300の
           レジスタを読み書き

 パソコンからUSB3300のレジスタを読み書きしました。
 USB3300を動かすコマンドは、Idle,Transmit,Register Write,Register Readの4つがあります。今回はこの内Register Write,Register Readを使います。

●USB3300のレジスタの構成

 次に、コマンド表、レジスタ一覧とRegister Write,Register Readのタイミングを示します。
 Register Write,Register Readのコマンドは、先頭2ビットがコマンドの種類分けで、下位ビットがレジスタアドレスです。レジスタの書き込みは、普通の書き込みだけで無くビット単位にセットやクリアすることができます。普通の書き込みとセットとクリアは、レジスタアドレスを変えるだけです。




●パソコン側の構成

 パソコン側は、VisualC#で作った次の操作パネルで操作します。
 パネルはラジオボタンの選択で次の様に4種類のレジスタセットをリストボックスに表示します。例えば一番下の「Scratch Register」見ると先頭にあるレジスタアドレスが違います、これが普通の書き込みとセットとクリアを分けています。





●次にプログラムの「MAIN」部分をしめします

/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
//ここから記述する
byte indata;//入力データ格納変数
//ポートAの入力関数
public void inp_a()
{
yprio.outportb(yprio.port + 2, 0x22);//入力に切り替えとポート選択
yprio.outportb(yprio.port + 2, 0x23);//入力に切り替えとポート選択
indata = yprio.inportb(yprio.port);//0x378番地から入力
yprio.outportb(yprio.port + 2, 0x22);//入力に切り替えとポート選択
yprio.outportb(yprio.port + 2, 0);//ここで出力される
}
//ポートB出力関数
public void out_b(byte outdata)//出力データを受け取る
{
yprio.outportb(yprio.port + 2, 0);//ここで出力される
yprio.outportb(yprio.port,outdata);//出力データセット
yprio.outportb(yprio.port + 2, 1);//出力に切り替え、ポート選択
yprio.outportb(yprio.port + 2, 0);//ここで出力される
}
//ポートC出力関数
public void out_c(byte outdata)
{
yprio.outportb(yprio.port + 2, 6);//ポート選択
yprio.outportb(yprio.port, outdata);
yprio.outportb(yprio.port + 2, 7);//ポート選択
yprio.outportb(yprio.port + 2, 6);//ポート選択
yprio.outportb(yprio.port + 2, 0);
}
//ポートD入力関数
public void inp_d()//上位5ビット、下位3ビットを0にする
{
indata = (byte)(yprio.inportb(yprio.port+1) & 0xf8);//バイトにキャスト
}
private void Form1_Load(object sender, System.EventArgs e)
{

}
//実行ボタン
private void button1_Click(object sender, System.EventArgs e)
{
string strRegData, strRegAdrs, strRegWriteData;
byte bytRegAdrs, bytRegWriteData;
int intRegAdrs, intRegWriteData;

strRegData = listBox1.SelectedItem.ToString(); //リストボックスの指定の内容を入力
strRegAdrs = strRegData.Substring(0,2);
intRegAdrs = Convert.ToInt32(strRegAdrs, 16);
bytRegAdrs = (byte)intRegAdrs;
// textBox2.Text = String.Format("{0:X2}",bytRegAdrs);
strRegWriteData = textBox1.Text;
bytRegWriteData = (byte)Convert.ToInt32(strRegWriteData, 16);


if (radioButton1.Checked)
{ //Register Read
out_c(0xC0); //コマンド出力
out_b((byte)(0xC0 + bytRegAdrs)); //データ1出力
inp_a();//スイッチの入力,入力データはindataに入る
textBox2.Text = String.Format("{0:X2}", indata);
}
if (radioButton2.Checked)
{ //Register Write
out_c(0x80); //コマンド出力
out_b((byte)(0x80 + bytRegAdrs)); //データ1出力
out_b(bytRegWriteData); //データ2出力
}
if (radioButton3.Checked)
{ //Register Set
out_c(0x80); //コマンド出力
out_b((byte)(0x80 + bytRegAdrs)); //データ1出力
out_b(bytRegWriteData); //データ2出力
}
if (radioButton4.Checked)
{ //Register Clear
out_c(0x80); //コマンド出力
out_b((byte)(0x80 + bytRegAdrs)); //データ1出力
out_b(bytRegWriteData); //データ2出力
}
// textBox2.Text = listBox1.SelectedItem.ToString();//テキストボックスに表示
// out_c(0xC0); //コマンド出力
// out_b(0xC0); //データ1出力
// inp_a();//スイッチの入力,入力データはindataに入る
// textBox1.Text=Convert.ToString(indata);//テキストボックスに表示
}

//プログラムの終了
private void button3_Click(object sender, System.EventArgs e)
{
Close();//終了
}

private void textBox2_TextChanged(object sender, EventArgs e)
{

}

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{ //レジスタRead
listBox1.Items.Clear();

listBox1.Items.Add("00h VId Low");
listBox1.Items.Add("01h VId High");
listBox1.Items.Add("02h PId Low");
listBox1.Items.Add("03h PId High");
listBox1.Items.Add("04h Function Control");
listBox1.Items.Add("07h Interface Control");
listBox1.Items.Add("0Ah OGT Control");
listBox1.Items.Add("0Dh USB IntEna Rising");
listBox1.Items.Add("10h USB IntEna Falling");
listBox1.Items.Add("13h USB Int Status");
listBox1.Items.Add("14h USB Int Latch");
listBox1.Items.Add("15h Debug");
listBox1.Items.Add("16h Scratch Register");
listBox1.SelectedIndex = 0;
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)
{ //レジスタWrite
listBox1.Items.Clear();

listBox1.Items.Add("04h Function Control");
listBox1.Items.Add("07h Interface Control");
listBox1.Items.Add("0Ah OGT Control");
listBox1.Items.Add("0Dh USB IntEna Rising");
listBox1.Items.Add("10h USB IntEna Falling");
listBox1.Items.Add("16h Scratch Register");
listBox1.SelectedIndex = 0;
}

private void radioButton3_CheckedChanged(object sender, EventArgs e)
{ //レジスタSet
listBox1.Items.Clear();

listBox1.Items.Add("05h Function Control");
listBox1.Items.Add("08h Interface Control");
listBox1.Items.Add("0Bh OGT Control");
listBox1.Items.Add("0Eh USB IntEna Rising");
listBox1.Items.Add("11h USB IntEna Falling");
listBox1.Items.Add("17h Scratch Register");
listBox1.SelectedIndex = 0;

}

private void radioButton4_CheckedChanged(object sender, EventArgs e)
{ //レジスタClear
listBox1.Items.Clear();

listBox1.Items.Add("06h Function Control");
listBox1.Items.Add("09h Interface Control");
listBox1.Items.Add("0Ch OGT Control");
listBox1.Items.Add("0Fh USB IntEna Rising");
listBox1.Items.Add("12h USB IntEna Falling");
listBox1.Items.Add("18h Scratch Register");
listBox1.SelectedIndex = 0;

}

private void textBox1_TextChanged(object sender, EventArgs e)
{

}

private void label1_Click(object sender, EventArgs e)
{

}

}
}



●USB3300のレジスタを読み書きの結果

 VBUSの制御を含めパソコンからUSB3300のレジスタの読み書きは、問題無くできました。普通の書き込みだけでなく、セットとクリアはScratch Registerを1ビット毎セットした後読み出しをFFになるまで続けた後、1ビット毎クリアした後読み出しを00になるまで確認しました。



ホームへ戻る