チュートリアル

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

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の出力が行われる際に使用するポートレジスタの設定・初期化を行う関数です。
SPI接続では、CS,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    */
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 );
}
2-3.portReverseCLK/portSetCLK関数の修正

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

/*==================================================================*/
/* Func: portSetCLK                              */
/* Desc: Please describe the code to set the value to CLK Port.   */
/*==================================================================*/
DT_INLINE void portSetCLK( DT_UINT dat)
{
/* ex)
PA.bit.b0 = dat?1:0;
*/
GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_2, dat?0xff:0x00 );
}
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を変更する関数です。
引数datの値が0であれば、LOW。それ以外の場合は、HIになるように処理を変更します。

/*==================================================================*/
/* Func: portSetDATA                             */
/* Desc: Please describe the code to set the value to DATA Port.   */
/*==================================================================*/
DT_INLINE void portSetDATA(DT_UINT dat)
{
/* ex)
PA.bit.b2 = dat?1:0;
*/
GPIOPinWrite( GPIO_PORTA_BASE, GPIO_PIN_2, dat?0xff:0x00 );
}
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   */
3-3.出力時のループ処理変更オプション

SPI接続の出力時に行われているループ処理を使用しない処理に変更するオプションです。
16bit以下のマイコンや低クロックのCPUの場合にオーバヘッドが軽減されることあります。

/*==================================================================*/
/* Macro: DT_USE_LOOP                             */
/* Desc: Please change the value 0 or 1. If 1 is set, loop is used. */
/*==================================================================*/
#define DT_USE_LOOP 1

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

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

レポート取得へ