チュートリアル

PIO 4bit / 2bit接続 / I2C接続接続において、通常のテストポイント情報を取得する為に、
ドライバファイルをカスタマイズする方法を説明します。

1.出力ポートのレジスタ設定の調査

汎用ポートを使用する接続では、テストポイント情報を出力する際にポートのHI/LOW制御が必要になります。
出力ポートのレジスタのアドレスを調査していただき、使用するポートを出力ポートに設定します。

2.サンプルドライバのカスタマイズ

ダウンロードいただいたドライバファイルは、ターゲット環境に合わせて、下記の内容を変更します。

2-1.ヘッダファイルのInclude

下記の変更内容のコントロール等に必要なヘッダファイルをIncludeしてください。

※”Common.h”は、弊社のサンプル環境における制御ポートのdefineや制御APIなどが定義されているヘッダファイルです。
削除するか、コメントアウトしてお使いください。

/*==================================================================*/
/*  Desc:   Header for FROM Control                     */
/*==================================================================*/
#include  "Common.h"
2-2._TP_BusPortInit関数を記述する

_TP_BusPortInit関数は、初めてTPの出力が行われる際に使用するポートレジスタの設定・初期化を行う関数です。
CS,CLKと4bitの場合は、DAT0-3を設定します。( 2bitの場合は、DAT0-1。I2Cの場合は、CLKとDAT0 )
ターゲット側の初期化処理で定義される場合は空関数で構いません。
なお、CS,CLKに割り当てられたポートは、初期値が必ずHI出力になるように設定してください。
初期値がLOW出力の場合は、初期化した際にDT10上で、不要なデータとして検出されることがあります。

サンプル環境での記述例のため、実際のターゲット環境において不要となるコードは削除してください。

ポート制御の際、制御にAPIが必要な場合は、
下記例の”GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_3, GPIO_PIN_3);”のように変更します。
直接レジスタの変更が可能な場合は、上記例のコメントのように”PA.DIR = 0x3f;”のように変更します。

/*==================================================================*/
/*  Func:   _TP_BusPortInit                         */
/*  Desc:   Please describe the code to initializes ports.      */
/*==================================================================*/
static void _TP_BusPortInit(void)
{
   /* ex)   
         PA.DIR = 0x3f;
         PD.DIR = 0x3f;
         PA.word = 0x3f;
         PD.word = 0x3f;   
   */
   SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOA );
   SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOD );
   GPIOPinTypeGPIOOutput( GPIO_PORTD_BASE, GPIO_PIN_2 );   /*   CLK     */
   GPIOPinTypeGPIOOutput( GPIO_PORTD_BASE, GPIO_PIN_3 );   /*   CS     */
   GPIOPinTypeGPIOInput( GPIO_PORTD_BASE, GPIO_PIN_6 );    /*   DOUT   */
   GPIOPinTypeGPIOOutput( GPIO_PORTA_BASE, GPIO_PIN_2 );   /*   DAT0   */
   GPIOPinTypeGPIOOutput( GPIO_PORTA_BASE, GPIO_PIN_3 );   /*   DAT1   */
   GPIOPinTypeGPIOOutput( GPIO_PORTA_BASE, GPIO_PIN_4 );   /*   DAT2   */
   GPIOPinTypeGPIOOutput( GPIO_PORTA_BASE, GPIO_PIN_5 );   /*   DAT3   */
   GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_2, GPIO_PIN_2);
   GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_3, GPIO_PIN_3);
   GPIOPinWrite( GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_PIN_2 );
   GPIOPinWrite( GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3 );
   GPIOPinWrite( GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4 );
   GPIOPinWrite( GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_PIN_5 );
}
2-3.portReverseCLK/portSetCLK関数の修正

portReverseCLK関数はデータ出力の際のCLKの反転処理を行う関数です。
関数がコールされるたびに、現在のポートのHI/LOWが反転するように処理を変更します。

/*==================================================================*/
/*  Macro:  portReverseCLK                           */
/*  Desc:   Please describe the code to reverse CLK Port.       */
/*==================================================================*/
DT_INLINE void portReverseCLK(void)
{
   /* ex)
      PA.bit.b0 ^= 1;
   */
   if( GPIOPinRead( GPIO_PORTD_BASE, GPIO_PIN_2 ) ){
      GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_2, 0 );
   }
   else{
      GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_2, GPIO_PIN_2 );
   }
}
2-4.portSetCS関数の変更

portSetCS関数はデータ出力の際にCSのHI/LOWを変更する関数です。
引数datの値が0であれば、LOW。それ以外の場合は、HIになるように処理を変更します。

/*==================================================================*/
/*  Func:   portSetCS                             */
/*  Desc:   Please describe the code to set the value to CS Port.  */
/*==================================================================*/
DT_INLINE void portSetCS(DT_UINT dat)
{
   /* ex)
      PA.bit.b1 = dat?1:0;
   */
   GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_3, dat?0xff:0x00 );
}
2-5.portSetData関数の変更

portSetDATA関数はデータ出力の際に各DATA端子のHI/LOWを変更する関数です。
GPIO4bitの場合は、引数datの最下位4bitに各端子のHI/LOWが割り当てられます。
DATA0が4bit中の最下位bitとなりますので、以後DATA1が2bit目、DATA3が3bit…となるように設定します。

なお、GPIO2bitの場合は、引数datの最下位2bitに各端子のHI/LOWが割り当てられます。
こちらもGPIO4bit接続と同様に、DATA0が4bit中の最下位bit、DATA1が2bit目となるよう設定します。

/*==================================================================*/
/*  Func:   portSetDATA                           */
/*  Desc:   Please describe the code to set the value to DATA Port. */
/*==================================================================*/
DT_INLINE void portSetDATA(DT_UINT dat)
{
   /* ex)
      PA.word = (PA.word & 0xff0f) | (dat << 4);
   */
   GPIOPinWrite( GPIO_PORTA_BASE, (GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5), dat << 2 );
}
2-6.enterCritical/exitCritical関数の変更

enterCritical/exitCritical関数はそれぞれ割り込み禁止、解除を行う関数です。
未設定の場合、データ取得が正常に行えない場合がありますので、必ず設定します。

/*==================================================================*/
/*  Func:   enterCritical                          */
/*  Desc:   Please describe the code to enter Critical Section.   */
/*==================================================================*/
DT_INLINE void enterCritical(void)
{
   // ex) DI();
   //
   taskENTER_CRITICAL();
}

/*==================================================================*/
/*  Func:   exitCritical                           */
/*  Desc:   Please describe the code to exit Critical Section.    */
/*==================================================================*/
DT_INLINE void exitCritical(void)
{
   // ex) EI();
   //
   taskEXIT_CRITICAL();
}

3.各種Include,defineの設定

3-1.ターゲット環境での符号なし32bitの型名指定

通常は変更不要です。符号無し32bitの型名を記載します。
もしこちらの項目を変更した場合は、DT10アプリ側の設定も変更する必要があります。

/*==================================================================*/
/*  Macro:  DT_UINT                             */
/*  Desc:   Please change Test Point argument type for DT10 Project setting.*/
/*==================================================================*/
#define DT_UINT unsigned int
3-2.関数のInline化

ターゲット環境で関数のInline化が可能な場合は、ここで定義します。
オーバヘッドの削減の為、各関数をinline化します。
不必要な場合はコメントアウトして、”#define DT_INLINE static”を有効にします。

/*==================================================================*/
/*  Macro:  DT_INLINE                            */
/*  Desc:   Please use "static" instead of "inline" if "inline" cannot be used. */
/*==================================================================*/
#define	DT_INLINE inline
/*#define DT_INLINE _inline  /* for Windows              */
/*#define DT_INLINE static  /* when "inline" cannot be used   */

4.ターゲットのコンパイル

お使いの開発環境に、カスタマイズしたドライバファイルを追加します。
コンパイルしていただき、問題なくターゲットが動作するかを確認します。

レポート取得へ