リアルタイム API トレーニングテキスト
アドバンスドコース DDC1553B

2009/12/01 第３版
コンカレント日本株式会社
プロフェッショナルサービス部

DDC MIL-STD 1553B 基本編...............................................................................................................................3
DDC MIL-STD 1553B 応用編...............................................................................................................................8
DDC MIL-STD 1553B 応用編.............................................................................................................................11
RT送受信をダブルバッファにする。........................................................................................................................11
割込み操作...................................................................................................................................................................12
モニタ割り込み............................................................................................................................................................12
BC(Bus Controller)とRT(Remote Terminal)割り込み. ..........................................................................................12
割込みマスク ...............................................................................................................................................................14
Intermessage ルーチン.............................................................................................................................................14
RTイベントハンドラーの登録...................................................................................................................................16
RTイベントハンドラーの定義(Table 2. RT Interrupt Typesを記述した関数) .....................................................16
BCイベントハンドラーの登録...................................................................................................................................17
BCイベントハンドラーの定義(Table 3. BC Interrupt Typesを記述した関数) .....................................................17
BCとRTのイベントハンドラープログラム例 ..........................................................................................................19
bc.c................................................................................................................................................................................19
rt.c ................................................................................................................................................................................25
BCとRTのイベントハンドラープログラム結果.......................................................................................................29

2

DDC

MIL-STD 1553B

基本編

ＢＵ-65572i/72v とＢＵ-65570M でのソフトウェアは、実行時ライブラリーを使ってください。ユー
ザは直接レジスタやメモリをアクセスしてはなりません。
ユーザは、実行時ライブラリーを使って、１５５３のバス操作のすべてのアスペクトをコントロール
することができます。 それぞれのプログラムはカードをリセットして、メッセージとフレームを作って、そして次に実行させる基本的なスケルトン構成に従います。
あなたは続くサンプルコードでこの形式を見るでしょう。 下のプログラム例は RT と BC の両方をセットアップします。
#include <ts̲drv.h>ts̲drv.h ファイルはプログラムに必ず含められなくてはなりません。
アプリケーションが必要とするファンクションの#defines ストラクチャとプロトタイプ宣言は、このヘッダファイルがすべてを供給します。同様に、このヘッダーファイルは、“Ｃ”のファンクショナリティ
に必要なすべてのスタンダードヘッダーファイルを含みます。
このヘッダファイルへのパスはコンパイラにセットされなくてはなりません。
RedHawk では、/usr/include に存在します。同様にプログラムを構築するとき、 -ltstsim がメイ
クファイルに含められなくてはなりません。
以下に、典型的な Makefile を示します。
CC=gccINCLUDEDIR=/usr/include
CFLAGS=-Wall -I$(INCLUDEDIR) -g -ltstsim -lpthreadall:sample:samplesample.c$(CC) $(CFLAGS) sample.c -o sample

下に定義される変数は BC 、 RT と Monitor のオペレーションプログラムによって使われます。
実行時ライブラリーによって使われる変数の多くは、ヘッダーファイルで定義されています。
MESSAGE Message;
Device̲p pCrd;
CMD Cmd1, Cmd2;
INJ̲ERR InjErr;
U16BIT Frame[2];RT̲DEFS rt;
DRV̲CONFIG cfg;
U16BIT err;
U16BIT data[32],i,j;
S16BIT MTFilter[32][32];int main (){printf("Resetting card...\n");if(err = ddcResetCard(&pCrd,&cfg,0)){
ddcPrintErrorMessage(pCrd,err,"reset̲card");exit (1);}printf("Card reset successful!\n");3

「ddcResetCard」ファンクションはプログラムによって呼び出される最初のＲＴＬファンクションです。
このファンクションはハードウェアをリセットして、基本的な環境設定をダウンロードして、そしてハードウェアの自己診断を行ないます。 このファンクションは、 Error̲t の戻り値を持っています。
この戻り値はプログラムの命令が正しいことを保証するためにすべての関数呼び出しがないかチェックしなくてはなりません。 もしエラー状態が存在するなら、ファンクションからの戻り値は戻り値とストリングを印刷するために ddcPrintErrorMessage ルーチンに引き渡してください。
CMD ストラクチャは、メッセージのためにコマンドを作成するために正しい文字で記入されなくてはなりません。 すべてのメッセージがコマンドを必要とします。
下の例は、リモートターミナル 2 (.tadr) サブアドレス 1 (.subadr).からリモートターミナルアドレス
1 (.tadr) サブアドレス 1 (.subadr)へ 5 ワード(.wcnt)を送信(.t̲r= 0)するコマンドを作成します。
BC→RT 、RT→BC とモードコードメッセージは単一のコマンド定義で、RT→RT のみ複数のコマンドの定義が必要です。
この例の場合では、 cmd1 と cmd2 は RT-RT メッセージなので２つのコマンド定義が必要です。
下の例は RT-RT メッセージの例です。
Cmd1.wcnt = 5;
Cmd1.subadr = 1;
Cmd1.t̲r = 0;
Cmd1.tadr = 1;/* RT が 5 ワード受信 *//* RT サブアドレスは 1 *//* RT が受信(0) 5 ワード *//* RT アドレスは 1 */Cmd2.wcnt = 5;
Cmd2.subadr = 1;
Cmd2.t̲r = 1;
Cmd2.tadr = 2;/* RT が 5 ワード送信 *//* RT サブアドレスは 1*//* RT が送信(1) *//* RT アドレスは 2 */それぞれのメッセージは、エラーを検出するための機能を持っています。
これらのエラーはパルス幅タイミングのようなワードカウントとエンコーディングエラーを含みます。
もしエラータイプが E̲NONE にセットされるなら、他のエントリは無視されます。
InjErr.error = E̲NONE;
InjErr.sub̲error̲1 = 0;
InjErr.sub̲error̲2 = 0;
InjErr.sub̲error̲3 = 0
メッセージは、メッセージストラクチャを定義する事によって作られます。 メッセージストラクチャは定義されたコマンド（Cmd1 と Cmd2）を結合して、そして、アクティブなバス、タイミング、デー
タテーブルとともに、エラー（InjErr）を挿入したりします。 このストラクチャはメッセージを送るた
めに必要な情報のすべてを含んでいます。
Message.bus = BUS̲A;
Message.comm̲type = RT̲RT;
Message.cmd̲1 = Cmd1;

4

Message.cmd̲2 = Cmd2;
Message.time̲to̲next̲message = 1000;
Message.data̲table̲no = 1;
Message.first̲intermessage̲routine = NO̲OPERATION;
Message.second̲intermessage̲routine = NO̲OPERATION;
Message.inj̲error̲ptr = &InjErr;
このメッセージストラクチャは、ddcDef̲message ルーチンに呼び出しで、登録されます。

ddcDef̲message (pCrd, 1, &Message );メッセージが定義された後、それらは U16BIT フレームアレイに入力されます。 このアレイは１つのフレーム時間に処理されるであろうメッセージのすべてのためにインデックスを持つでしょう。
他のフレームシンボルが同じくマイナーなフレームとフレームを定義するために使われます。
それぞれのメッセージが ddcDef̲message 呼び出しにおいて割り当てられた番号にのフレーム
アレイの中に定義されます。 この番号は、実際に送信されるフレームにおける位置とは無関係です。 関数は、END̲OF̲MAJOR̲FRAME や END̲OF̲MINOR̲FRAME 等の実行されるフレームシ
ンボルを含めて、メッセージの数を確立します。
Frame[0] = 1;
Frame[1] = END̲OF̲MAJOR̲FRAME;
ddcDef̲frame (pCrd, 2/*個*/, Frame );２個

フレームが１度、Ｘ回、あるいは永久に、繰り返されるかもしれません。 毎回フレーム点始めから終わりへと、それは指定された時間で実行されます。
それが フレーム完了に使う時間の量は、マイナーフレーム時間にマイナーフレームの総数を掛けた時間です。 この例では、マイナーフレームは、 ddcDefMinorFrameTime ファンクションで２
６４０μ秒に設定され、ただ１つ存在します。

RT_RT 通信

ddcDefMinorFrameTime (pCrd, 2640 );マイナーサイクル 2640μ秒
同様に RT コマンド用のストラクチャが存在します。
この場合の RT コマンドは、エラー検出なし、リターンステータス 0x0000 と単純です
InjErr.error = E̲NONE;
InjErr.sub̲error̲1 = 0;
InjErr.sub̲error̲2 = 0;
InjErr.sub̲error̲3 = 0;
rt.inj̲error = &InjErr;
rt.basic̲status = 0x0000;

5

ＢＵ-65572i/72v とＢＵ-65570M はバスで１、あるいは３１の RT のすべてとして機能することができます。 ファンクション ddcDef̲emulate̲rt() は、どの RT がソフトウェアによってエミュレー
トされるかを定義します。 RT が ddcDef̲emulate̲rt()で定義された後、 構造体 rt をパラメータとする ddcDef̲rt()関数で rt の応答コマンドを定義します。
そして、 RT 用のデータテーブル ddcDef̲rt̲map にマップすることができます。
ddcDef̲emulate̲rt (pCrd, 1, YES);
ddcDef̲rt(pCrd,1, &rt);
ddcDef̲rt̲map(pCrd,1,RECEIVE,1,1);
アドレス

サブアドレス

//RT1 をエミュレートする//RT1 の応答コマンドを定義//RT1 の受信応答としてテーブル１を使用する

データテーブル番号

この例では RT - RT 通信をしていますから、 RT２を設定してください。 （そのために２番目のパラメータが２になる） ddcDef̲rt̲map を RT ２で呼び出す部分を除いて、この設定は RT １と同じです、そして３番目のパラメータは送信です。
InjErr.error = E̲NONE;
InjErr.sub̲error̲1 = 0;
InjErr.sub̲error̲2 = 0;
InjErr.sub̲error̲3 = 0;
rt.inj̲error = &InjErr;
rt.basic̲status = 0x0000;
ddcDef̲emulate̲rt (pCrd, 2, YES);//RT2 をエミュレートする
ddcDef̲rt(pCrd,2, &rt);//RT2 の応答コマンドを定義
ddcDef̲rt̲map(pCrd,2,TRANSMIT,1,1); //RT2 の送信応答としてテーブル２を使用する
次にはデータテーブルを RT １と RT ２にセットアップしなければなりません。関数
ddcDef̲table̲size() は、指定されたデータテーブル（２番目の仮引数 − １）の、大きさ（３番目の仮引数 − ５）を設定します。 そして ddcWrite̲data() を呼び出し、データテーブル１にデータを実際に書き込みます。
ddcDef̲table̲size(pCrd,1,5);
data[0]=0x0000; data[1]=0x0001; data[2]=0x0002;
data[3]=0x0003; data[4]=0x0004;
ddcWrite̲data(pCrd,1,data,5,1);
セットアップデータテーブル２。
ddcDef̲table̲size(pCrd,2,5);
data[0]=0x0000; data[1]=0x0001; data[2]=0x0002;
data[3]=0x0003; data[4]=0x0004;
ddcWrite̲data(pCrd,2,data,5,1);

6

次の設定は、モニターです。
最初の初期化は、MTFilter 配列に すべて３をセットします。
このファンクションはセットアップにスタックファイルを使用します。 1553B カードからホストに配信される割り込みのマスクビットをセットし、 応答するビットにフラグを付けます
RT はモニターがデータを取り込むときセットされます。 同様にバスが選択されます。
for (i=0; i<32; i++)for (j=0; j<32; j++)
MTFilter[i][j]= 3;
ddcDef̲monitor̲stack(pCrd, CYCLIC̲STACK);
ddcDef̲int̲mask(pCrd, 0xffff);
ddcDef̲mon̲exception̲status(pCrd, 0x07ff);
ddcCapture̲event(pCrd,CAPTURE̲IMMEDIATE,0x0000,0x0000);
ddcSelect̲bus(pCrd,YES,NO);for(i=0; i<32; i++){for(j=0; j<32; j++){if(MTFilter[i][j] & 0x1)
ddcSelect̲message(pCrd,i,TRANSMIT,j);else
ddcDeselect̲message(pCrd,i,TRANSMIT,j);if (MTFilter[i][j] & 0x2)
ddcSelect̲message(pCrd,i,RECEIVE,j);else
ddcDeselect̲message(pCrd,i,RECEIVE,j)}}ddcRun̲mon(pCrd);
RT と BC を使用するために次のルーチンを走らせてください。
BC は１つのフレームのメッセージを１００回走らせるでしょう。
ddcRun̲rt(pCrd);
ddcRun̲bc (pCrd, 1, 100);
プログラムが完了したとき、プログラムを止めてください。
printf("\nPress any key to Halt the Card\n");getch();
ddcHaltIdea(pCrd);
ddcShutDownIdea(&pCrd);
return 0;
}

7

DDC

MIL-STD 1553B

応用編

アンプの設定とカップリング//デバイスリセット
if( (nErr = ddcResetCard(&pDev, &stConfig, uhLogDev)) ){ddcPrintErrorMessage(pDev, nErr, "ddcResetCard");return -1;}// カップリング トランス有り、内蔵ターミネータオフ
if( (nErr= ddcSetCoupling(pDev, COUPLING̲TRANSFORMER,TERMINATION̲NONE)) ){ddcPrintErrorMessage(pDev, nErr, "SetCoupling");exit(1);}//アンプの設定
ddcSetAmp(pDev,0xFFF);

TerminatoriHawk
CA-2097

BC

CA-2014-180

Bus Coupler

DDC

Scope１

Terminator

Tee Adapter
Bus/Scope Test Cable

CA-2014-180

RT

CA-2097

Tee Adapter
Bus Coupler

Terminator

Scope２
Terminator

ディフォルトのアンプゲイン値 0x320.(ddcReadCoupling()を使用)
0x320= 800/4096 * 21 = 4.1V
この電圧は、Scope2 側8

オシロスコープ２側が２１V 時、メインバス側（オシロスコープ１側）の電圧は８Vになります。
下記波形は、BC,RT 側とも：ddcSetAmp(devp,0xFFF);のものです。
オシロスコープ１の波形

8V

オシロスコープ２の波形

21V

8V

本線側の電圧は、transformer coupled 時、ピークで、1.0V から 14.0V であれば規格

範囲です。

9

BC Side:ddcSetAmp(devp,0x800);
8 Volt4 Volt
RT Side:ddcSetAmp(devp,0xFFF);

本線側の電圧ですが、BC 側のアンプレンジを固定し、RT 側のアンプレンジを小さくしていくと、値が 0x29D（測定時 1.0V）が通信限界で、これ以下になると通信エラーが発生し始めます。
また、A バス以外に B バスをイネーブルにすると、レベルが下がるため、ゲインは最大を選択することが良いようです。

10

DDC

MIL-STD 1553B

応用編

RT 送受信をダブルバッファにする。
非同期にアプリケーションが１５５３のバスアクセスデータテーブルをアクセスする時、競合を避けるた
めダブルバッファリングを使用します。もしデータテーブルがダブルバッファに入れられるなら、それがデータを読む前に、そしてそれがデータを書いた後、ホストはテーブルポインタを交換します。 ルーチ
ン ddcDefDataBuffering()はサイズ ＝ ０をデータテーブル１から２５０にそしてサイズ ＝ ３２をテーブ
ル０と２５１に割り当てます。 さらに、データテーブルポインタに適切な値を割り当てることによって、メ
モリを割り当てます。 結果として、もしユーザがデータテーブルの大きさを明確にしたいなら、

ddcDefTableSize()ルーチンで再定義されなくてはなりません。
注意：フレームはサイズ ＝ ０を割り当てられるので、再定義されなくてはなりません。
TA = RT アドレス(0 から 31)
SA = RT サブアドレス(１から 31)
TR = 0::受信 1:送信
WC = ワードカウント(1 から 32)
TD = テーブル ID(1 から 1023)
InjErr.error= E̲NONE;InjErr.sub̲error̲1 = 0;
InjErr.sub̲error̲2 = 0;
InjErr.sub̲error̲3 = 0;
RT.inj̲error= &InjErr;
RT.basic̲status = 0x0000;
RT.dbca= NO;
if( (Err = ddcDef̲data̲buffering(Dev, DOUBLE)) ) {ddcPrintErrorMessage(Dev, Err, "ddcDef̲data̲buffering");return -1;}
if( (Err = ddcDef̲emulate̲rt(Dev, TA, YES)) ){ddcPrintErrorMessage(Dev, Err, "ddcDef̲emulate̲rt");return -1;}
if( (Err = ddcDef̲rt(Dev, TA, &RT)) ){ddcPrintErrorMessage(Dev, Err, "ddcDef̲rt");return -1;}
if( (Err = ddcDef̲rt̲map(Dev, TA, TR, SA, TD)) ) {ddcPrintErrorMessage(Dev, Err, "ddcDef̲rt̲map");return -1;}
if( (Err = ddcDef̲table̲size(Dev, TD, WC)) ){ddcPrintErrorMessage(Dev, Err, "ddcDef̲table̲size");return -1;}
if(TR == 受信){if( (Err = ddcDef̲table̲routine(Dev, TD, RT̲INT̲AFTER̲DATA, NO̲OPERATION)) ){ddcPrintErrorMessage(Dev, Err, "ddcDef̲table̲routine");return -1;}}else{if( (Err = ddcDef̲table̲routine(Dev, TD, NO̲OPERATION, NO̲OPERATION)) ){ddcPrintErrorMessage(Dev, Err, "ddcDef̲table̲routine");return -1;}}

11

割込み操作
割り込みは、指定した BC メッセージ、 RT データテーブル毎、あるいはモニター環状バッファが１/３フルになった場合に生成されます。
BC / RT あるいはモニタにおいて、プログラム割込みが要求されるとき、ＲＴＬは割り込み処理を行い、ユーザによって（ddcSetMonEvent()あるいは ddcSetBcrtEvent()を使って）定義されたイベ
ントハンドラー呼び出します。
ユーザ関数 mon̲event̲handler()は引数を持っていません。 ＲＴＬ割込みハンドラはユーザ関数

bcrt̲event̲handler()に、以下の２つの引数を渡します。
U16BIT vector̲type − 割込みベクトルの最初の１６ｂｉｔ長のデータ。
U16BIT vector̲parameter − 割込みベクトルの２番目の１６ｂｉｔ長のデータ

モニタ割り込み
モニタは２つのタイプの割り込みを要求することができます：− それぞれのメッセージ後の割り込み− モニター環状バッファの１/３が満たされた（およそ ２K ワード）。
たった１つのモニター割込み種別を使用することもできます。； INTERRUPT MASK の１４と１５ビットで使用している割り込みをイネーブル/ディセーブルにします。
もしモニター割り込みを使用していて、それを ddcHaltMon()あるいは ddcHaltIdea()によって停止した場合にも、モニターは同様に割り込みを出します。 この割り込みは読み取り、カードの環状バッファの「テールエンド」を使用済みにすることが出来ます（ddcReadMonStack()とddcReadMonStackParteach（）参照）。
モニターが割り込みを求めるたびに、それはカウンターを増加させます。 もし類似のカウンター
をユーザが増加させるなら、その値は失われた割り込みを検出するためにカードのカウンターと比較することができます。

BC(Bus Controller)と RT(Remote Terminal)割り込み.
BC / RT 割り込みはメッセージあるいはデータテーブルと関連づけられたメッセージ間に出されます。 それぞれの割込みはユーザに透過的に、巡回待ち行列にプッシュされた２ワードのベクトルを伴って要求されます。 キューは最高６４の割り込みベクトルを持つことができます；それで、ホストはすぐに割り込みリクエストに応答を出すように要求されません。 ユーザルーチンは、キューのベクタ毎に一度だけ呼び出されます。
割込みベクトルは下記の様に定義されます：

Table 1. Interrupt Vector
SUB-TYPE

TYPE

PARAMETER

12

Table 2. RT Interrupt Types
TYPE

SUB-TYPE

PARAMETER

EVENT

00

table number

Command

ME=0 transmit / receive

01

mode code

Command

ME=0 mode command

02

table number

Command

ME=1 transmit / receive

03

mode code

Command

ME=1 mode command

04-7F

mode code

RESERVED

注意： ME ビットは最後の状態（すなわち、モードコマンド SEND LAST STATUS に応えて送られるであろうステータス）からとられます

Table 3. BC Interrupt Types
TYPE

SUB-TYPE

PARAMETER

EVENT

80

message number

0000

successful message

81

message number

Error code

Communication error

82

message number

Statusbit set in status

83

FC

N/A

frame entry=SKIP

83

FD

N/A

frame entry=BREAK̲POINT

83

FE

N/A

frame entry=END̲OF̲MAJOR̲FRAME

83

FF

N/A

frame entry=END̲OF̲MINOR̲FRAME

84-FF

RESERVED

Table 4. BC Error Codes
ERROR CODEERROR TYPE

0000

no error0002

inverse data sync0004

invalid data0008

gap between data0010

no response0020

invalid status0080

wrong TADR in status13

割込みマスク
割込みマスクは BC / RT とモニター共有でメモリに存在する１６ビットワードです。 マスクのそれぞれのビットが、「１」にセットされるとき、ユニークなインタラプトタイプを抑制します。

Table 5. Interrupt Mask
MASK BIT

INTERRUPT TYPE

0

00

1

01

2

02

3

03

4

80

5

81

6

82

7

83

8

XX

9

XX

10

XX

11

XX

12

XX

13

XX

14

1/3 of Circular Buffer (Monitor)

15

End of Msg (Monitor)

Intermessage ルーチン
それぞれの intermessage ギャップの間に、 BC / RT はユーザによって指定された２つのINTERMESSAGE ルーチンを実行します。
これらのルーチンはＲＴＬとそれらに指定した以下のものから選ばれます：− メッセージが BC によって発行された− データテーブルがエミュレートされた RT によってアクセスされた− モードコマンドがエミュレートされた RT によって実行された呼び出しルーチンの割り当ては ddcDefMessage()、ddcDefTableRoutine()とddcDefModeRoutine()によって行われます。 もしメッセージがテスタ / シミュレーターカード内部で行われるなら、（すなわち、エミュレートされた BC とエミュレートされた RT の間に）、データ
テーブルと結び付けられるルーチンは無視されるでしょう。
同様に、もしカードが RT-to-RT 通信の RT の両方をエミュレートし BC をエミュレートしないな
ら、ただ送信 RT だけが intermessage ルーチンを実行します。

14

intermessage ルーチンはリセットプロセスの間にカードにダウンロードされます。 以下のテーブ
ルが、intermessage ルーチンのリストです。

Table 13. Intermessage Routines
INDEX
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27-30
31
32
33
34
35
36
37
38
39
40-43
44
45-46
47
48
49-50
51

FUNCTION
NO OPERATIONRETRY CURRRENT MESSAGE ON ALTERNATE BUS
RETRY CURRENT MESSAGE AND REMAIN ON ALTERNATE BUS
RETRY ON SAME BUS
INTERRUPT ON END OF MESSAGE
INTERRUPT ON FRAME SYMBOLSET SERVICE REQUEST BIT IN STATUSRESET SERVICE REQUEST BIT IN STATUS
INTERRUPT AFTER ACCESSING TX/RX DATA TABLE
INTERRUPT AFTER MODE COMMAND
INTERRUPT AFTER TX/RX COMMAND TEMPLATE MATCH
INTERRUPT AFTER MODE COMMAND TEMPLATE MATCH
TIME-TAG (STORE RTC IN A CIRCULAR QUEUE)RESERVEDRETRY ON SAME BUS AND THEN ON ALTERNATE BUS
SET STATUS BIT IN STATUSRESET STATUS BIT IN STATUSSET OUTPUT TRIGGERRESET OUTPUT TRIGGER
WAIT FOR INPUT TRIGGER
RESERVEDNO RESPONSE ON BOTH BUSESSET BUSY BIT IN STATUSRESET BUSY BIT IN STATUS
SET BUSY AND RESET SRQ IN STATUS
SET SRQ AND RESET BUSY IN STATUS
RESERVEDSKIP NEXT MESSAGE
SET̲DISCRETE̲0
SET̲DISCRETE̲1
SET̲DISCRETE̲2
SET̲DISCRETE̲3
RESET̲DISCRETE̲0RESET̲DISCRETE̲1RESET̲DISCRETE̲2RESET̲DISCRETE̲3RESERVEDSKIP NEXT MESSAGE ONCERESERVEDBLOCK̲DATA̲BCBLOCK̲DATA̲RTRESERVED
SKIP̲NEXT̲MESSAGE̲ONCE̲EX

詳細はData Device Corporation BU-69068 Manual A P P E N D I X Cを参照してください。

15

RT イベントハンドラーの登録
if( (Err = ddcSetBCRTEventEx(Dev, event̲handler)) ){ddcPrintErrorMessage(Dev, Err, "ddcSetBCRTEventEx");return -1;}
if( (Err = ddcDef̲int̲mask̲bcrt(Dev, 0x3F00U)) ){ddcPrintErrorMessage(Dev, Err, "ddcDef̲int̲mask̲bcrt");return -1;}

RT イベントハンドラーの定義(Table 2. RT Interrupt Types を記述した関数)
Error̲t event̲handler(Device̲p Crd, S16BIT Type, S16BIT SubType, S16BIT Param)
{
CMD
*Cmd;
S16BIT TableID;
S16BIT TA, SA, WC,TR;
U16BIT ModeCode;Cmd = (CMD *)&Param;TA= Cmd->tadr;//アドレスSA= Cmd->subadr;//サブアドレスWC= Cmd->wcnt;//ワードカウントTR= Cmd->t̲r;//1:送信 0:受信
switch(Type){case 0x00:// ME=0 transmit/receive
TableID = SubType;
if(TR==0){//受信処理
ddcRead̲data(Dev, TableID, &RecvBuff[TableID][0], WC)；}else{//送信処理
ddcWrite̲data(Dev, TableID, &SendBuff[TableID][0], WC, 1);}
break;
case 0x01:// ME=0 mode command
ModeCode = (U16BIT)SubType;break;
case 0x02:// ME=1 transmit/receive
TableID = SubType;break;
case 0x03:// ME=1 mode command
ModeCode = (U16BIT)hSubType;break;
default:
break;}
return 0;}

16

BC イベントハンドラーの登録
if( (Err = ddcSetBCRTEventEx(Dev, event̲handler)) ){ddcPrintErrorMessage(Dev, Err, "ddcSetBCRTEventEx");exit(1);}if( (Err = ddcDef̲int̲mask̲bcrt(Dev, 0x0F00U)) ){ddcPrintErrorMessage(Dev, Err, "ddcDef̲int̲mask̲bcrt" );exit(1);}
BC イベントハンドラーの定義(Table 3. BC Interrupt Types を記述した関数)
Error̲t event̲handler(Device̲p Crd, S16BIT Type, S16BIT SubType, S16BIT Param){
MESSAGE
Message;
S16BIT
MessageID;
S16BIT
TA, SA, WC;
Error̲tErr;static char
*MessTypeName[] ={"BC-RT", "RT-BC", "MODE", "RT-RT", "NOP"};
switch(Type){case 0x80:// successful message
break;
case 0x81:// communication error
MessageID = SubType;if( (Err = ddcRead̲message(Crd, MessageID, &Message)) ){ddcPrintErrorMessage(Crd, Err, "read̲message");return Err;}
TA = Message.cmd̲1.tadr;
SA = Message.cmd̲1.subadr;
WC = Message.cmd̲1.wcnt;
if(Message.cmd̲1.t̲r == 0)//メッセージのコマンドが受信つまり BC->RT,RT->RT{
printf("[Mess %d] %s TA=%d RECV SA=%d WC=%d << ErrorCode=%04x >>\n",MessageID, MessTypeName[(int)Message.comm̲type], TA, SA, WC,(U16BIT)Param);
printf("
RX Status=%04x\n", Message.rx̲status);}else//メッセージのコマンドが送信つまり RT->BC{
printf("[Mess %d] %s TA=%d XMIT SA=%d WC=%d << ErrorCode=%04x >>\n",MessageID, MessTypeName[(int)stMessage.comm̲type], TA, SA, WC,(U16BIT)Param);
printf("TX Status=%04x\n", Message.tx̲status);}
break;
case 0x82:// bit set in status
hMessageID = SubType;if( (Err = ddcRead̲message(Crd, MessageID, &Message)) ){17

ddcPrintErrorMessage(Crd, Err, "read̲message");return Err;}
TA = stMessage.cmd̲1.tadr;
SA = stMessage.cmd̲1.subadr;
WC = stMessage.cmd̲1.wcnt;
if(Message.cmd̲1.t̲r == 0) //受信{
printf("[Mess %d] %s TA=%d RECV SA=%d WC=%d << Status=%04x >>\n",MessageID, MessTypeName[(int)Message.comm̲type], TA, SA, WC,(U16BIT)Param);
printf("
RX Status=%04x\n", Message.rx̲status);}else//送信{
printf("[Mess %d] %s TA=%d XMIT SA=%d WC=%d << Status=%04x >>\n",MessageID, MessTypeName[(int)Message.comm̲type], TA, SA, WC,(U16BIT)Param);
printf("TX Status=%04x\n", Message.tx̲status);}
break;
case 0x83:
switch(hSubType){case 0xfc:
printf("[SKIP]\n");break;
case 0xfd:
printf("[BREAK̲POINT]\n");break;
case 0xfe:
printf("[END̲OF̲MAJOR̲FRAME]\n");break;
case 0xff:
printf("[END̲OF̲MINOR̲FRAME]\n");break;
default:
printf("[unknown event] type=%04x subtype=%04x param=%04x\n",(U16BIT)Type, (U16BIT)SubType, (U16BIT)Param);
break;}
break;
default:
printf("[unknown event] type=%04x subtype=%04x param=%04x\n",(U16BIT)Type, (U16BIT)SubType, (U16BIT)Param);
break;}
return 0;}

18

BC と RT のイベントハンドラープログラム例
bc.c#include <unistd.h>/* For 'sleep()' */#include <tstsim/ts̲drv.h> /* Tester / Simulator header */Error̲t EventHandler(Device̲p Crd, S16BIT Type, S16BIT SubType, S16BIT Param){
U16BIT Err;
MESSAGE Message;
S16BIT MessageID;
S16BIT TA, SA, WC, TR , TI;
S16BIT TA2, SA2, WC2, TR2;
S16BIT RBuff[32],TBuff[32],*Data;static char
*TRNmae[] = { "RECEIVE ","TRANSMIT",};//BC 側からみると反対になる
static char
*MessTypeName[] ={"BC-RT", "RT-BC", "MODE", "RT-RT", "NOP"};
static S16BIT count=0x0000;
register int i;
switch(Type){case 0x80:// successful message
MessageID = SubType;if( (Err = ddcRead̲message(Crd, MessageID, &Message)) ){ddcPrintErrorMessage(Crd, Err, (S8BIT *)"read̲message");return Err;}
TA = Message.cmd̲1.tadr;
SA = Message.cmd̲1.subadr;
WC = Message.cmd̲1.wcnt;
TR = Message.cmd̲1.t̲r;
TA2 = Message.cmd̲2.tadr;
SA2 = Message.cmd̲2.subadr;
WC2 = Message.cmd̲2.wcnt;
TR2 = Message.cmd̲2.t̲r;
TI = Message.data̲table̲no;/* データテーブル番号*/
printf("Success [Mess %d] %s TA1=%d %s SA1=%d WC1=%d ",MessageID, MessTypeName[(int)Message.comm̲type], TA,TRNmae[TR], SA, WC);
if (Message.comm̲type==RT̲RT){
printf("TA2=%d %s SA2=%d WC2=%d ",TA2,TRNmae[TR2], SA2, WC2);}
if (Message.comm̲type == TRANSMIT){
Data = RBuff;if( (Err = ddcRead̲data(Crd, TI, &RBuff[0],WC)) ){ddcPrintErrorMessage(Crd, Err, (S8BIT *)"ddcRead̲data");}printf("TI=%d <<RData[0]=0x%04X >>\n",TI, (U16BIT)Data[0]);}else if (Message.comm̲type == RECEIVE){
count++;
Data = TBuff;for(i=0; i<32; i++) TBuff[i] = count;if( (Err = ddcWrite̲data(Crd, TI, &TBuff[0], WC, 1)) ){ddcPrintErrorMessage(Crd, Err, (S8BIT *)"ddcWrite̲data");}printf("TI=%d <<TData[0]=0x%04X >>\n",TI, (U16BIT)Data[0]);}else{printf("TI=%d\n",TI);}
break;

19

case 0x81:// communication error
MessageID = SubType;if( (Err = ddcRead̲message(Crd, MessageID, &Message)) ){ddcPrintErrorMessage(Crd, Err, (S8BIT *)"read̲message");return Err;}
TA = Message.cmd̲1.tadr;
SA = Message.cmd̲1.subadr;
WC = Message.cmd̲1.wcnt;
TR = Message.cmd̲1.t̲r;
TA2 = Message.cmd̲2.tadr;
SA2 = Message.cmd̲2.subadr;
WC2 = Message.cmd̲2.wcnt;
TR2 = Message.cmd̲2.t̲r;
printf("Error [Mess %d] %s TA1=%d %s SA1=%d WC1=%d ",MessageID, MessTypeName[(int)Message.comm̲type], TA,TRNmae[TR], SA, WC);
if (Message.comm̲type==RT̲RT){
printf("TA2=%d %s SA2=%d WC2=%d",TA2,TRNmae[TR2], SA2, WC2);}
printf(" << ErrorCode=%04x >>\n", (U16BIT)Param);
break;
case 0x83:
switch(SubType){case 0xfc:
printf("[SKIP]\n");break;
case 0xfd:
printf("[BREAK̲POINT]\n");break;
case 0xfe:
printf("[END̲OF̲MAJOR̲FRAME]\n");break;
case 0xff:
printf("[END̲OF̲MINOR̲FRAME]\n");break;
default:
printf("[unknown event] type=%04x subtype=%04x param=%04x\n",(U16BIT)Type, (U16BIT)SubType, (U16BIT)Param);
break;}
break;
default:
printf("[unknown event] type=%04x subtype=%04x param=%04x\n",(U16BIT)Type, (U16BIT)SubType, (U16BIT)Param);
break;}
return 0;}
int main(){
MESSAGE
Message;
INJ̲ERR
InjErr;
U16BIT
DRV̲CONFIG
Error̲t
Err;
S16BIT
Device̲p Dev;
U8BIT

Frame[10];cfg;
i, data[32];Channel;Channel = 0;
printf("Resetting card...\n");if( (Err = ddcResetCard(&Dev, &cfg, Channel)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"reset̲card");exit(1);}
printf("Card reset successful!\n");20

/* Set the callback function. */if( (Err = ddcSetBCRTEventEx(Dev, EventHandler)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"set̲mon̲evnt");exit(3);}printf("Setting up BC ...\n");/* Set termination for loop back with no card connections. */if( (Err = ddcSetCoupling(Dev, COUPLING̲TRANSFORMER, TERMINATION̲HALF)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"SetCoupling");exit(1);}
if ( (Err=ddcSetAmp(Dev,0xFFF) ) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"SetAmp");exit(1);}/*

Define Message 1 */Message.bus = BUS̲A;
Message.comm̲type = RT̲RT;
Message.cmd̲1.wcnt = 31;
Message.cmd̲1.tadr = 1;/* RT Address is 1 */Message.cmd̲1.subadr = 1;/* RT Sub address is 1 */Message.cmd̲1.t̲r = RECEIVE;/* should be 0 for a RECEIVE command */Message.cmd̲2.wcnt = 31;
Message.cmd̲2.tadr = 2;/* RT Address is 2 */Message.cmd̲2.subadr = 1;/* RT Sub address is 1 */Message.cmd̲2.t̲r = TRANSMIT; /* should be 1 for a TRANSMIT command */Message.time̲to̲next̲message = 100;
Message.data̲table̲no = 1;/* データテーブルは 1*/
Message.last̲data̲table̲no = 1;/* データテーブルは 1*/
Message.first̲intermessage̲routine = INT̲ON̲END̲OF̲MESSAGE;
Message.second̲intermessage̲routine = NO̲OPERATION;
Message.inj̲error̲ptr = &InjErr;
InjErr.error = E̲NONE;
InjErr.sub̲error̲1 = 0;
InjErr.sub̲error̲2 = 0;
InjErr.sub̲error̲3 = 0;
if( (Err = ddcDef̲message (Dev, 1, &Message )) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲message");exit(1);}/*

Define Message 2 */Message.bus = BUS̲A;
Message.comm̲type = RT̲RT;
Message.cmd̲1.wcnt = 31;
Message.cmd̲1.tadr = 2;/* RT Address is 2 */Message.cmd̲1.subadr = 1;/* RT Sub address is 1 */Message.cmd̲1.t̲r = RECEIVE;
Message.cmd̲2.wcnt = 31;
Message.cmd̲2.tadr = 1;/* RT Address is 1 */Message.cmd̲2.subadr = 1;/* RT Sub address is 1 */Message.cmd̲2.t̲r = TRANSMIT;
Message.time̲to̲next̲message = 100;
Message.data̲table̲no = 2;/* データテーブルは 2*/
Message.last̲data̲table̲no = 2;/* データテーブルは 2*/
Message.first̲intermessage̲routine = INT̲ON̲END̲OF̲MESSAGE;
Message.second̲intermessage̲routine = NO̲OPERATION;
Message.inj̲error̲ptr = &InjErr;
InjErr.error = E̲NONE;
InjErr.sub̲error̲1 = 0;
InjErr.sub̲error̲2 = 0;
InjErr.sub̲error̲3 = 0;
if( (Err = ddcDef̲message (Dev, 2, &Message )) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲message");exit(1);}/*

Define Message 3. Only changed values are listed */21

Message.bus = BUS̲A;
Message.comm̲type = RECEIVE;
Message.cmd̲1.wcnt = 31;
Message.cmd̲1.tadr = 3;/* RT Address is 3 */Message.cmd̲1.subadr = 1;/* RT Sub address is 1 */Message.cmd̲1.t̲r = RECEIVE;
Message.cmd̲2.wcnt = 0;
Message.cmd̲2.tadr = 0;
Message.cmd̲2.subadr = 0;
Message.time̲to̲next̲message = 100;
Message.data̲table̲no = 3;/* データテーブルは 3*/
Message.last̲data̲table̲no = 3;/* データテーブルは 3*/
Message.first̲intermessage̲routine = INT̲ON̲END̲OF̲MESSAGE;
Message.second̲intermessage̲routine = NO̲OPERATION;
Message.inj̲error̲ptr = &InjErr;
InjErr.error = E̲NONE;
InjErr.sub̲error̲1 = 0;
InjErr.sub̲error̲2 = 0;
InjErr.sub̲error̲3 = 0;
if( (Err = ddcDef̲message (Dev, 3, &Message )) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲message");exit(1);}/*

Define Message 4. Only changed values are listed */Message.bus = BUS̲A;
Message.comm̲type = TRANSMIT;
Message.cmd̲1.wcnt = 31;
Message.cmd̲1.tadr = 4;/* RT Address is 4 */Message.cmd̲1.subadr = 1;/* RT Sub address is 1 */Message.cmd̲1.t̲r = TRANSMIT;
Message.cmd̲2.wcnt = 0;
Message.cmd̲2.tadr = 0;
Message.cmd̲2.subadr = 0;
Message.time̲to̲next̲message = 100;
Message.data̲table̲no = 4;/* データテーブルは 4*/
Message.last̲data̲table̲no = 4;/* データテーブルは 4*/
Message.first̲intermessage̲routine = INT̲ON̲END̲OF̲MESSAGE;
Message.second̲intermessage̲routine = NO̲OPERATION;
Message.inj̲error̲ptr = &InjErr;
InjErr.error = E̲NONE;
InjErr.sub̲error̲1 = 0;
InjErr.sub̲error̲2 = 0;
InjErr.sub̲error̲3 = 0;
if( (Err = ddcDef̲message (Dev, 4, &Message )) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲message");exit(1);}
Message.comm̲type= NOP;
Message.first̲intermessage̲routine = INT̲FRAME̲SYMBOL;
Message.second̲intermessage̲routine = NO̲OPERATION;
if( (Err = ddcDef̲message(Dev, END̲OF̲MINOR, &Message)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"ddcDef̲message");exit(1);}if( (Err = ddcDef̲message(Dev, END̲OF̲MAJOR, &Message)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"ddcDef̲message");exit(1);}/*

Set up BC Frame using messages defined above */Frame[0] = 1;/* RT->RT */22

Frame[1] = END̲OF̲MINOR;
Frame[2] = 2;/* RT->RT */Frame[3] = END̲OF̲MINOR;
Frame[4] = 3;/* BC->RT */Frame[5] = END̲OF̲MINOR;
Frame[6] = 4;/* RT->BC */Frame[7] = END̲OF̲MAJOR;
if( (Err = ddcDef̲frame ( Dev, 8, Frame )) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲frame");Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲minor̲frame̲time ( Dev, 1000 )) ){// 1msec
ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲minor̲frame̲time");exit(1);}for(i=0; i<4; i++){if( (Err = ddcDef̲table̲size (Dev, i+1, 32)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲table̲size");
Err = ddcShutDownIdea( &Dev );exit(1);}}for(i=0; i<32; i++)data[i] = 0x1111;
ddcWrite̲data(Dev, 1, data, 32, 1);for(i=0; i<32; i++)data[i] = 0x2222;
ddcWrite̲data(Dev, 2, data, 32, 1);for(i=0; i<32; i++)data[i] = 0x3333;
ddcWrite̲data(Dev, 3, data, 32, 1);for(i=0; i<32; i++)data[i] = 0x4444;
ddcWrite̲data(Dev, 4, data, 32, 1);
if( (Err = ddcDef̲int̲mask̲bcrt(Dev, 0x3F00U)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"ddcDef̲int̲mask̲bcrt" );exit(1);}/*Run BC Frame twice */if( (Err = ddcRun̲bc (Dev, 1, 2)) ){//メジャーフレームを２回実行する
ddcPrintErrorMessage(Dev, Err, (S8BIT *)"run̲bc");
Err = ddcShutDownIdea( &Dev );exit(1);}/*delay until BC finishes *///sleep(1);/* Wait for user keypress to quit. */while(getchar() == 0);
if( (Err = ddcRead̲message(Dev, 1, &Message)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"read̲message");
Err = ddcShutDownIdea( &Dev );exit(1);}
printf("Message1 Rx Status = %4.4x, Detected error = %d\n", Message.rx̲status, Message.det̲error);if( (Err = ddcRead̲message(Dev, 2, &Message)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"read̲message");
Err = ddcShutDownIdea( &Dev );exit(1);}
printf("Message2 Tx Status = %4.4x, Detected error = %d\n", Message.tx̲status, Message.det̲error);/* Write the application level buffer to file. */23

if( (Err = ddcShutDownIdea( &Dev )) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"shut̲down̲idea");exit(1);}
printf("Card shut down successful, terminating program.\n");return 0;
}

24

rt.c
#include <unistd.h>/* For 'sleep()' */#include <tstsim/ts̲drv.h> /* Tester / Simulator header */Error̲t EventHandler(Device̲p Crd, S16BIT Type, S16BIT SubType, S16BIT Param){
U16BIT Err;
CMD
*Cmd;
S16BIT TA, SA, WC, TR,TI;
U16BIT MC;
S16BIT RBuff[32],TBuff[32];static S16BIT count=0x0000;
register int i;
Cmd = (CMD *)&Param;TA= Cmd->tadr;SA= Cmd->subadr;
WC= Cmd->wcnt;
TR= Cmd->t̲r;
printf("Type=0x%02x sub=0x%02x TA=%d TR=%d SA=%d WC=%d", Type, SubType, TA, TR, SA, WC);switch(Type){case 0x00:// ME=0 transmit/receive
TI = SubType;
if(TR == RECEIVE){
if( (Err = ddcRead̲data(Crd, TI, &RBuff[0],WC)) ){ddcPrintErrorMessage(Crd, Err, (S8BIT *)"ddcRead̲data");}printf(" <<RData[0]=0x%04X >>\n", (U16BIT)RBuff[0]);}else{count--;
for(i=0; i<32; i++) TBuff[i] = count;if( (Err = ddcWrite̲data(Crd, TI, &TBuff[0], WC, 1)) ){ddcPrintErrorMessage(Crd, Err, (S8BIT *)"ddcWrite̲data");}printf(" <<TData[0]=0x%04X >>\n", (U16BIT)TBuff[0]);}break;
case 0x01:// ME=0 mode command
MC = (U16BIT)SubType;
if(TR == RECEIVE)
{
}
else
{
}
printf("\n");break;
case 0x02:// ME=1 transmit/receive
TI = SubType;
if(TR == RECEIVE)
{
}
else
{
}
printf("\n");break;
case 0x03:// ME=1 mode command
MC = (U16BIT)SubType;printf("\n");break;
default:
printf("\n");break;

25

}
return 0;}
int main(){
INJ̲ERR
InjErr;RT̲DEFSrt;
DRV̲CONFIG
Error̲t
Err;
S16BIT
Device̲p Dev;
U8BIT

cfg;
i,j, data[32];Channnel;

Channnel = 1;
printf("Resetting card...\n");if( (Err = ddcResetCard(&Dev, &cfg, Channnel)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"reset̲card");exit(1);}
printf("Card reset successful!\n");if( (Err = ddcDef̲data̲buffering(Dev, /*SINGLE*/ DOUBLE )) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"ddcDef̲data̲buffering");
return -1;}
printf("Setting up RTs...\n");/* Set termination for loop back with no card connections. */if( (Err = ddcSetCoupling(Dev, COUPLING̲TRANSFORMER, TERMINATION̲HALF)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"SetCoupling");exit(1);}
if ( (Err=ddcSetAmp(Dev,0xFFF) ) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"SetAmp");exit(1);}/*

Set up RT1 */InjErr.error = E̲NONE;
InjErr.sub̲error̲1 = 0;
InjErr.sub̲error̲2 = 0;
InjErr.sub̲error̲3 = 0;
rt.inj̲error = &InjErr;
rt.basic̲status = 0x0000;
rt.dbca = NO;
if( (Err = ddcDef̲emulate̲rt( Dev, 1, YES)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲emulate̲rt");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt(Dev,/*TA*/ 1, &rt)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt̲map(Dev, /*TA*/1, RECEIVE, /*SA*/1, /*TB*/1)) ){//受信用にテーブルが１つ
ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt̲map");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt̲map(Dev, /*TA*/1, TRANSMIT, /*SA*/1, /*TB*/2)) ){//送信用にテーブルが１つ
ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt̲map");
Err = ddcShutDownIdea( &Dev );exit(1);
}

26

/*

/*

/*

/*

Set up RT2 */if( (Err = ddcDef̲emulate̲rt(Dev, /*TA*/ 2, YES)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲emulate̲rt");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt(Dev,/*TA*/ 2, &rt)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt̲map(Dev, /*TA*/2, RECEIVE, /*SA*/1, /*TB*/3)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt̲map");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt̲map(Dev, /*TA*/2, TRANSMIT, /*SA*/1, /*TB*/4)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt̲map");
Err = ddcShutDownIdea( &Dev );exit(1);}
Set up RT3 */if( (Err = ddcDef̲emulate̲rt(Dev, /*TA*/ 3, YES)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲emulate̲rt");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt(Dev,/*TA*/ 3, &rt)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt̲map(Dev, /*TA*/3, TRANSMIT, /*SA*/1, /*TB*/5)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt̲map");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt̲map(Dev, /*TA*/3, RECEIVE, /*SA*/1, /*TB*/6)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt̲map");
Err = ddcShutDownIdea( &Dev );exit(1);}
Set up RT4 */if( (Err = ddcDef̲emulate̲rt(Dev, /*TA*/ 4, YES)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲emulate̲rt");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt(Dev,/*TA*/ 4, &rt)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt̲map(Dev, /*TA*/4, TRANSMIT, /*SA*/1, /*TB*/7)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt̲map");
Err = ddcShutDownIdea( &Dev );exit(1);}if( (Err = ddcDef̲rt̲map(Dev, /*TA*/4, RECEIVE, /*SA*/1, /*TB*/8)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲rt̲map");
Err = ddcShutDownIdea( &Dev );exit(1);}
Set up Data Tables */for(i=0; i<8; i++){if( (Err = ddcDef̲table̲size (Dev, i+1, 32)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"def̲table̲size");
Err = ddcShutDownIdea( &Dev );exit(1);}for(j=0; j<32; j++) data[j] = i+1; //テーブル番号を初期値に設定

27

ddcWrite̲data(Dev, i+1, data, 32, 1);//SINGLE バッファなら１度で良い
ddcWrite̲data(Dev, i+1, data, 32, 1);//DOUBLE バッファなら２度書き出す必要がある
if( (Err = ddcDef̲table̲routine(Dev, i+1, RT̲INT̲AFTER̲DATA, NO̲OPERATION)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"ddcDef̲table̲routine");return -1;}}/* Set the callback function. */if( (Err = ddcSetBCRTEventEx(Dev, EventHandler)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"set̲rt̲evnt");exit(3);}if( (Err = ddcDef̲int̲mask̲bcrt(Dev, 0x3F00U)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"ddcDef̲int̲mask̲bcrt");return -1;}
if( (Err = ddcRun̲rt(Dev)) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"ddcRun̲rt");return -1;}
printf("RT start\n\n");sleep(1);/* Wait for user keypress to quit. */while(getchar() == 0);
if( (Err = ddcShutDownIdea( &Dev )) ){ddcPrintErrorMessage(Dev, Err, (S8BIT *)"shut̲down̲idea");exit(1);}
printf("Card shut down successful, terminating program.\n");return 0;}28

BC と RT のイベントハンドラープログラム結果
ｂｃ側[root@ihawk ddc.sample]# ./bc
Resetting card...
Card reset successful!
RT2→RT1
Setting up BC ...
Success [Mess 1] RT-RT TA1=1 RECEIVE SA1=1 WC1=31 TA2=2 TRANSMIT SA2=1 WC2=31 TI=1
RT1→RT2[END̲OF̲MINOR̲FRAME]
Success [Mess 2] RT-RT TA1=2 RECEIVE SA1=1 WC1=31 TA2=1 TRANSMIT SA2=1 WC2=31 TI=2
[END̲OF̲MINOR̲FRAME]
Success [Mess 3] BC-RT TA1=3 RECEIVE SA1=1 WC1=31 TI=3 <<TData[0]=0x0001 >>[END̲OF̲MINOR̲FRAME]
Success [Mess 4] RT-BC TA1=4 TRANSMIT SA1=1 WC1=31 TI=4 <<RData[0]=0x0007 >> 初期化の次に書き出したデータ[END̲OF̲MAJOR̲FRAME]
Success [Mess 1] RT-RT TA1=1 RECEIVE SA1=1 WC1=31 TA2=2 TRANSMIT SA2=1 WC2=31 TI=1
[END̲OF̲MINOR̲FRAME]
Success [Mess 2] RT-RT TA1=2 RECEIVE SA1=1 WC1=31 TA2=1 TRANSMIT SA2=1 WC2=31 TI=2
[END̲OF̲MINOR̲FRAME]
Success [Mess 3] BC-RT TA1=3 RECEIVE SA1=1 WC1=31 TI=3 <<TData[0]=0x0002 >>[END̲OF̲MINOR̲FRAME]
Success [Mess 4] RT-BC TA1=4 TRANSMIT SA1=1 WC1=31 TI=4 <<RData[0]=0xFFFD >>[END̲OF̲MAJOR̲FRAME]
Message1 Rx Status = 0800, Detected error = 0
Message2 Tx Status = 0800, Detected error = 0
Card shut down successful, terminating program.

ｒｔ側
Resetting card...
Card reset successful!
Setting up RTs...
RT start

1 回目の TRANSMIT で書き出した
0xFFFF データを 2 回目で受信バッファ番号 4 が初期値なのは、RT2 の TRANSMIT
同様に RT1 の TRANSMIT

Type=0x00 sub=0x04 TA=2 TR=1 SA=1 WC=31 <<TData[0]=0xFFFF >>Type=0x00 sub=0x01 TA=1 TR=0 SA=1 WC=31 <<RData[0]=0x0004 >>Type=0x00 sub=0x02 TA=1 TR=1 SA=1 WC=31 <<TData[0]=0xFFFE >>Type=0x00 sub=0x03 TA=2 TR=0 SA=1 WC=31 <<RData[0]=0x0002 >>Type=0x00 sub=0x06 TA=3 TR=0 SA=1 WC=31 <<RData[0]=0x3333 >>Type=0x00 sub=0x07 TA=4 TR=1 SA=1 WC=31 <<TData[0]=0xFFFD >>Type=0x00 sub=0x04 TA=2 TR=1 SA=1 WC=31 <<TData[0]=0xFFFC >>Type=0x00 sub=0x01 TA=1 TR=0 SA=1 WC=31 <<RData[0]=0xFFFF >>Type=0x00 sub=0x02 TA=1 TR=1 SA=1 WC=31 <<TData[0]=0xFFFB >>Type=0x00 sub=0x03 TA=2 TR=0 SA=1 WC=31 <<RData[0]=0xFFFE >>Type=0x00 sub=0x06 TA=3 TR=0 SA=1 WC=31 <<RData[0]=0x0001 >>Type=0x00 sub=0x07 TA=4 TR=1 SA=1 WC=31 <<TData[0]=0xFFFA >>RT2→RT1
RT1→RT2

１回目

BC→RT3
2 回目の RT4→BC データ
RT2→RT1
RT1→RT2

２回目

BC→RT3
3 回目の RT4→BC データ

Card shut down successful, terminating program.

初期化時に 0x3333 を書き出している

RT2→RT1
0x0004

RT1→RT2
0x0002

BC→RT30x3333

初期化時の RT 側のデータは、テーブル番号

RT2→RT1
0xFFFF

RT1→RT2
0xFFFE

RT4→BC
0x0007

初期化時に 0x0007 を書き出している

BC 送信後割込み時に 0x0001 を書き出している

BC→RT30x0001

RT4→BC
0xFFFD
RT 送信後割込み時に 0xFFFD を書き出している

割り込み時 RT 側のデータは、デクリメント

2930