入出力ポートなどと同様に
TWB_PortWrite()
、TWB_PortRead()
関数を使用して、書込み、読出し が行えます。Port
引数には表 70の値を指定してください。表 70 ユーザーステータスレジスタを指定する定数
言語 値 説明
C/C++ TWB_USER_STATUS
ユーザーステータスレジスタの読み書き時に指定します。
C++ TWB::WPORT::USER_STATUS TWB::RPORT::USER_STATUS VB/VBA TWB_WPORT.USER_STATUS
TWB_RPORT.USER_STATUS C# TWB.WPORT.USER_STATUS TWB.RPORT.USER_STATUS
ユーザーメモリの操作方法
TWB_PortBRead()
、TWB_PortBWrite()
関数(表 65、表 66)を使用すると、大きなデータを効率良 くリード/ライトできます。これらの関数ではPort
引数にアドレス、nData
引数にバイト数を指定してデ バイス上の任意のメモリアドレスにアクセスできます。• ユーザーメモリ以外の領域に対して読み書きを行うと、誤動作する場合があります。
• ユーザーメモリはユーザーファームの動作にも使用します。ユーザーファーム利用時には自由に使 用できる領域が変化しますので誤って操作しないように特に注意が必要です。
63
フラッシュメモリの利用
製品にはフラッシュメモリが内蔵されています。フラッシュメモリは電源を切っても記録した情報が保 存される不揮発性のメモリ空間で、製品が動作するためのファームウェアもこの領域に書き込まれて います。図 20はフラッシュメモリ領域を詳しく示した図です。
フラッシュメモリは消去単位毎に
EB0~EB15
の16
ブロックに分けて管理されます。このうち、EB1~EB3の
12K
バイトの領域がユーザーに開放されています。電源を切っても内容が消えないため、アプリケーション固有の設定情報やキャリブレーションデータの保存などに利用可能です。
EB0(システムで使用)
EB1 EB2 EB3 EB4(システムで使用) EB5(システムで使用) EB6(システムで使用) EB7(システムで使用)
EB8-EB11 (システムで使用)
EB12-EB15 (ユーザーファーム用) H’000000
H’000FFF H’001000 H’001FFF H’002000 H’002FFF H’003000 H’003FFF H’004000
H’007FFF H’008000
H’03FFFF H’040000
H’07FFFF
4KB×8
224KB
256KB
図 20 フラッシュメモリマップ
表 71 フラッシュメモリの操作に使用する関数
モード 関数名 説明
フラッシュ書換えモード で使用する関数
TWB_FlashEraseBlk() フラッシュ書換えモード用。フラッシュメモリの指定ブロッ
クを消去します。
TWB_FlashWrite() フラッシュ書換えモード用。フラッシュメモリに書込みを行
います。
TWB_FlashRead() フラッシュ書換えモード用。フラッシュメモリからデータを
読み出します。
ユーザープログラムモ ードで使用する関数
TWB_UPFlashAttachWriter()
ユーザープログラムモード用。フラッシュメモリの消去/
書込みのためのファームウェアをデバイスにダウンロード します。
TWB_UPFlashEraseBlk() ユーザープログラムモード用。フラッシュメモリの指定ブロ
ックを消去します。
TWB_UPFlashWrite() ユーザープログラムモード用。フラッシュメモリに書込みを
行います。
TWB_PortBRead() ユーザープログラムモード用。フラッシュメモリからデータ
を読み出します。
64
表 72 フラッシュメモリ操作のサンプルプログラム
開発環境 プロジェクト名またはファイル名 説明
Visual C++ (MFC) FlashSample フラッシュ書換えモードのデバイスに接続し、フラッシュメモ
リの状態表示、ファイルデータのフラッシュメモリへの書込 みを行います。
Visual Basic FlashSampleVB Viusal C# FlashSampleCS
VBA FlashSample.xls
セルを利用した簡易バイナリエディタです。編集内容をフラ ッシュメモリに書き込むことができます。フラッシュ書換えモ ード用です。
Visual C++ (MFC) UPFlashSample ユーザープログラムモードのデバイスに接続し、フラッシュ
メモリの状態表示、ファイルデータのフラッシュメモリへの書 込みを行います。
Visual Basic UPFlashSampleVB Viusal C# UPFlashSampleCS
フラッシュメモリへの書込み操作は特殊で、通常のメモリのように
1
バイト単位でデータを書き込むこ とはできません。書込みを行う領域には、まず消去の操作を行います。消去の単位は図 20 に示し たEB1~EB3
のブロック単位で、消去対象のブロックは全ビットが"1"となります。続いて、実際に保存するデータの書込み行います。書込みは
128
バイト毎のブロック単位で行いま す。そのため、書込みの先頭アドレスは常に128
バイト境界(アドレスの下位7
ビットが0)となります。
• フラッシュメモリの書換え可能回数の目安は
100
回、データ保持年数は10
年です。『USBM3069(F)』、『LANM3069』で、フラッシュメモリを操作するには、フラッシュ書換えモードに設 定する必要があります。その他のデバイスではフラッシュ書換えモードとユーザープログラムモード のどちらかでフラッシュメモリを操作します。それぞれのモードで使用できる関数が異なりますのでご 注意ください。
フラッシュメモリの消去方法(フラッシュ書換えモード) 1. デバイスをフラッシュ書換えモードで起動します。
2.
Opt
引数にTWB_MODE_FLASH
(相当のオプション) を指定してTWB_Open()
、 または、TWB_OpenByAddress()
関数でデバイスに接続します。3.
TWB_FlashEraseBlk()
関数を呼び出します。Blk
引数に消去したいブロック番号(1~3)を指定します。
表 73 TWB_FlashEraseBlk() の関数宣言
言語 関数宣言
C/C++ TW_STATUS TWB_FlashEraseBlk(TW_HANDLE hDev, long Blk) VB Function TWB_FlashEraseBlk(ByVal hDev As System.IntPtr,
ByVal Blk As Integer) As Integer
VBA Function TWB_FlashEraseBlk(ByVal hDev As Long, ByVal Blk As Long) As Long C# STATUS FlashEraseBlk(System.IntPtr hDev, int Blk)
65
フラッシュメモリの読出し、および、書込み方法(フラッシュ書換えモード) 1. デバイスをフラッシュ書換えモードで起動します。
2.
Opt
引数にTWB_MODE_FLASH
(相当のオプション)を指定してTWB_Open()
、 または、TWB_OpenByAddress()
関数でデバイスに接続します。3. フラッシュ書換えモードのデバイスからデータを読み出すには
TWB_FlashRead()
関数を使用す る必要があります。Address
引数には書込み先のアドレスとして 0x1000~0x3f80 の値が指定でき ますが、128 バイト境界に合わせる必要がありますので、下位 7 ビットは常に 0 になります。また、nData
引数に指定する書込みバイト数も128の倍数としてください。表 74 TWB_FlashRead() の関数宣言
言語 関数宣言
C/C++ TW_STATUS TWB_FlashRead(TW_HANDLE hDev, DWORD Address, void *pData, long nData) VB Function TWB_FlashRead(ByVal hDev As System.IntPtr, ByVal Address As Integer,
ByVal pData As Object, ByVal nData As Integer) As Integer VBA Function TWB_FlashRead(ByVal hDev As Long, ByVal Address As Long,
ByRef pData As Any, ByVal nData As Long) As Long C# SATUS FlashRead(System.IntPtr hDev, uint Address, object pData, int nData)
4. フラッシュメモリに書込みを行うには
TWB_FlashWrite()
関数を呼び出します。Address
引数には 書込み先のアドレスとして 0x1000~0x3f80 の値が指定できますが、128 バイト境界に合わせる必 要がありますので、下位7ビットは常に0になります。また、nData
引数に指定する書込みバイト数も 128の倍数としてください。表 75 TWB_FlashWrite() の関数宣言
言語 関数宣言
C/C++ TW_STATUS TWB_FlashWrite(TW_HANDLE hDev, DWORD Address, void *pData, long nData) VB Function TWB_FlashWrite(ByVal hDev As System.IntPtr, ByVal Address As Integer,
ByVal pData As Object, ByVal nData As Integer) As Integer VBA Function TWB_FlashWrite(ByVal hDev As Long, ByVal Address As Long,
ByRef pData As Any, ByVal nData As Long) As Long C# SATUS FlashWrite(System.IntPtr hDev, uint Address, object pData, int nData)
66
リスト 32 フラッシュ書換えモードでのフラッシュメモリ操作例(C言語)
TW_HANDLE hDev;
char cWrite[128] = "Hello World";
char cRead[128];
//フラッシュ書換えモードのデバイスに接続
TWB_Open(&hDev, NULL, 0, TWB_IF_ANY | TWB_MODE_FLASH);
if(m_hDev){
//ブロック1を消去
TWB_FlashEraseBlk(hDev, 1);
//書込み
TWB_FlashWrite(hDev, 0x1000, cWrite, 128);
//読出し
TWB_FlashRead(hDev, 0x1000, cRead, 128);
OutputDebugStringA(cRead);
TWB_Close(hDev);
}
リスト 33 フラッシュ書換えモードでのフラッシュメモリ操作例(Visual Basic) Dim hDev As System.IntPtr
Dim strWrite As New System.Text.StringBuilder("Hello World") Dim bBuff(127) As Byte
strWrite.Length = 128
'フラッシュ書換えモードのデバイスに接続
TWB_Open(hDev, Nothing, 0, TWB_OPEN_OPT.IF_ANY Or TWB_OPEN_OPT.MODE_FLASH)
If hDev <> System.IntPtr.Zero Then
'ブロック1を消去
TWB_FlashEraseBlk(hDev, 1)
'書込み
TWB_FlashWrite(hDev, &H1000, strWrite, 128)
'読出し
TWB_FlashRead(hDev, &H1000, bBuff, 128)
Debug.WriteLine(System.Text.Encoding.GetEncoding(932).GetString(bBuff, 0, 128))
TWB_Close(hDev) End If
67
リスト 34 フラッシュ書換えモードでのフラッシュメモリ操作例(C#)
System.IntPtr hDev;
StringBuilder strWrite = new System.Text.StringBuilder("Hello World");
byte[] bBuff = new byte[128];
strWrite.Length = 128;
//フラッシュ書換えモードのデバイスに接続
TWB.Open(out hDev, null, 0, TWB.OPEN_OPT.IF_ANY | TWB.OPEN_OPT.MODE_FLASH);
if (hDev != System.IntPtr.Zero) {
//ブロック1を消去
TWB.FlashEraseBlk(hDev, 1);
//書込み
TWB.FlashWrite(hDev, 0x1000, strWrite, 128);
//読出し
TWB.FlashRead(hDev, 0x1000, bBuff, 128);
Debug.WriteLine(System.Text.Encoding.GetEncoding(932).GetString(bBuff, 0, 128));
TWB.Close(hDev);
}
フラッシュメモリの消去方法(ユーザープログラムモード)
ユーザープログラムモードでフラッシュメモリの消去/書込みを行う際には、予めフラッシュメモリを 制御するためのファームウェアをデバイスにダウンロードする必要があります。このファームウェアは ユーザーメモリ(61 ページ参照)にダウンロードされますので、ユーザーメモリは一時的に使用できな くなり、内部のデータも破壊されてしまいますので注意してください。
1. デバイスをユーザープログラムモードに変更します。通常モードからユーザープログラムモードへの 変更は起動後に行うこともできます。
2. 通常モードと同様の手順でデバイスに接続します。
3.
TWB_UPFlashAttachWriter()
関数を呼び出します。4. 消去したいブロック番号(1~3)を引数として、
TWB_UPFlashEraseBlk()
関数を呼び出します。68
フラッシュメモリへの書込み方法(ユーザープログラムモード)
1. デバイスをユーザープログラムモードに変更します。通常モードからユーザープログラムモードへの 変更は起動後に行うこともできます。
2. 通常モードと同様の手順でデバイスに接続します。
3.
TWB_UPFlashAttachWriter()
関数を呼びます。4.
TWB_UPFlashWrite()
関 数を呼び 出し ます 。Address
引数に は書込 み先のア ド レスとし て0x1000~0x3f80の値が指定できますが、128バイト境界に合わせる必要がありますので、下位7ビ ットは常に0です。また、
nData
引数に指定する書込みバイト数も128の倍数としてください。ユーザープログラムモードでのフラッシュメモリの読出しは、通常モードのメモリ読出しと同様に
TWB_PortBRead()
関数で行うことができます。リスト 35 ユーザープログラムモードでのフラッシュメモリ操作例(C言語)
char cWrite[128] = "Hello World";
char cRead[128];
//ファームウェアのダウンロード TWB_UPFlashAttachWriter(hDev);
//ブロック1を消去
TWB_UPFlashEraseBlk(hDev, 1);
//書込み
TWB_UPFlashWrite(hDev, 0x1000, cWrite, 128);
//読出し
TWB_PortBRead(hDev, 0x1000, cRead, 128);
OutputDebugStringA(cRead);
リスト 36 ユーザープログラムモードでのフラッシュメモリ操作例(Visual Basic) Dim strWrite As New System.Text.StringBuilder("Hello World")
Dim bBuff(127) As Byte
strWrite.Length = 128
'ファームウェアのダウンロード TWB_UPFlashAttachWriter(hDev)
'ブロック1を消去
TWB_UPFlashEraseBlk(hDev, 1)
'書込み
TWB_UPFlashWrite(hDev, &H1000, strWrite, 128)
'読出し
TWB_PortBRead(hDev, &H1000, bBuff, 128)
Debug.WriteLine(System.Text.Encoding.GetEncoding(932).GetString(bBuff, 0, 128))
69
リスト 37 ユーザープログラムモードでのフラッシュメモリ操作例(C#)
StringBuilder strWrite = new System.Text.StringBuilder("Hello World");
byte []bBuff = new byte[128];
strWrite.Length = 128;
//ファームウェアのダウンロード TWB.UPFlashAttachWriter(hDev);
//ブロック1を消去
TWB.UPFlashEraseBlk(hDev, 1);
//書込み
TWB.UPFlashWrite(hDev, 0x1000, strWrite, 128);
//読出し
TWB.PortBRead(hDev, 0x1000, bBuff, 128);
Debug.WriteLine(System.Text.Encoding.GetEncoding(932).GetString(bBuff, 0, 128));
70
エラー処理
TWB
ライブラリの関数のほとんどは戻り値で関数の実行結果を返します。本リファレンスのプログラ ム例は要点を分かりやすくするために、関数の戻り値チェックを省略していますが、実際のプログラ ムでは関数が正しく実行されたかどうかチェックすることを推奨します。関数の戻り値についての詳細は「関数リファレンス」(72ページ)を参照してください。
リスト 38 エラー処理の例(C言語)
TW_STATUS ret;
ret = TWB_PortWrite(hDev, TWB_POUT, 0x00, 0xff);
if(ret){
TWB_Close(hDev);
hDev = 0;
printf("エラーが発生しました。TW_STATUS = %08X(HEX), ret);
return ret;
}
リスト 39 エラー処理の例(C++、MFC) CString str;
TW_STATUS ret;
ret = TWB_PortWrite(hDev, TWB::WPORT::POUT, 0x00);
if(ret){
TWB_Close(hDev);
hDev = 0;
str.Format(_T("エラーが発生しました。TW_STATUS=%08X(HEX)"), ret);
AfxMessageBox(str);
return ret;
}
リスト 40 エラー処理の例(Visual Basic) Dim ret As Integer
ret = TWB_PortWrite(hDev, TWB_WPORT.POUT, &H0)
If ret <> TW_STATUS.TW_OK Then TWB_Close(hDev)
hDev = System.IntPtr.Zero
MsgBox(String.Format("エラーが発生しました。TW_STATUS = {0:X8}(HEX)", ret)) Exit Sub
End If