チュートリアル
GPIO 4bit / 2bit接続 / I2C接続
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.ターゲットのコンパイル
お使いの開発環境に、カスタマイズしたドライバファイルを追加します。
コンパイルしていただき、問題なくターゲットが動作するかを確認します。