RX621のDMAでFT232Hに書き込みました

RX621のDMAでFT232Hに書き込みました。

●実験の構成と動作結果

 RX621のDMAでFT232Hに書き込みの信号をロジックスコープ観測した波形と、構成と、プログラムを下記します。



 



 RX621のDMAでFT232Hに書き込む手順を次の構成図に示します。
 詳しくは、プログラムを見て下さい。

 
T:初期設定する

 
U:開始ボタン押下で、
   ・RAMに出力データ設定
   ・IRQ3割り込み許可設定

 
V:IRQ3割り込みで、DMA2を起動

 
W:DMA2が、外部バスを起動

 
X:FT232Hに書込み


 



 




●実験のプログラム

 HEWで作成したプログラムを下に置きます。

 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/***********************************************************************/
/* */
/* FILE :Rx621_Cpld_Ft232h.c */
/* DATE :Mon, Jul 27, 2015 */
/* DESCRIPTION :Main Program */
/* CPU TYPE :RX62N */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.53). */
/* NOTE:THIS IS A TYPICAL EXAMPLE. */
/* */
/***********************************************************************/



//#include "typedefine.h"
#ifdef __cplusplus
//#include <ios> // Remove the comment when you use ios
//_SINT ios_base::Init::init_cnt; // Remove the comment when you use ios
#endif

void main(void);
#ifdef __cplusplus
extern "C" {
void abort(void);
}
#endif


#include "iodefine.h" // Include iodefine.h

// **********************************************
// ********** Global variable definition
unsigned char LedDat[2];
unsigned char InSwitchData, InSwitch0, InSwitch1, InSwitch2, InSwitch3;

// ***** FtDatRamAd address *****
unsigned char FtDatRam[1200];
static unsigned char * p_FtDatRamAd = FtDatRam; // address pointer(FtDatRamAd)

// ***** Ft232H address *****
unsigned long Ft_DatAdrs = 0x06000000; // Ft_RxF address 0600 0000 Cs2 //
unsigned long Ft_RxfAdrs = 0x06000002; // Ft_RxF address 0600 0002 Cs2 //
unsigned long Ft_TxeAdrs = 0x06000003; // Ft_RxF address 0600 0003 Cs2 //


// **********************************************
// ********** 関数のプロトタイプ
void Init_IcuDmaBsc(void); //システムクロック,ICU,DMA,BSC レジスタ初期設定
void Init_cmt(void); // コンペアマッチタイマ(CMT)初期設定
void process_switch(void); // スイッチ処理ルーチン
void process_Ft(void); // Ft入出力処理ルーチン
void process_switch(void); // スイッチ処理ルーチン

// **********************************************
void Init_IcuDmaBsc(void)
{
// ********** システムクロック設定
SYSTEM.SCKCR.LONG = 0x00010100; // システムクロック設定 ICLK=96MHz, BCLK=48MHz, PCLK=48MHz

// ********** BCLK出力ポート初期設定
PORT5.DDR.BIT.B3 = 1; // P53ディレクションレジスタ(DDR)の設定

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ********** ICUの初期設定   FT232Hの制御に使うICU
// ********** FT232HのnTXEをICUのIRQ3に接続してDMAC2を起動させる。
// ********** DMAC2の起動で、RAMからデータ他を取得して、BSCのnCS2を使いデータをFT232Hに書き込む。


// ********** IRQ3割り込みの 許可/不許可 初期設定
IEN(ICU,IRQ3) = 0; // IRQ3割り込み要求を不許可設定は、IENマクロを使用。
// IENマクロ(割り込み要求元, 割り込み信号名)

// ********** IRQ3割り込みでDMAを起動させる設定
ICU.DMRSR2 = 67; // IRQ3割り込みでDMAC2を起動させる

// ********** PORT13をIRQ3割り込み入力にする設定
PORT1.ICR.BIT.B3 = 1; // PORT13をIRQ3割り込み入力にする

// ********** ポートファンクション(PORT13をIRQ3) 初期設定
IOPORT.PF9IRQ.BIT.ITS3 = 1; // PORT13をIRQ3設定

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ********** DMACモジュールストップ解除
MSTP(DMAC) = 0; // DMACモジュールストップ解除

// ********** DMAC2初期設定
DMAC2.DMAMD.WORD = 0x8000; // DMA2アドレスモードレジスタ設定
//  転送元アドレス更新モード:プラス方向
//  転送元アドレス拡張リピート領域:設定しない
//  転送先アドレス更新モード:固定(FT232H)
//  転送先アドレス拡張リピート領域:設定しない

DMAC2.DMCNT.BYTE = 0x00; // DMA2起動不許可設定

DMAC2.DMTMD.WORD = 0x2001; // DMA2モードレジスタ設定
//  転送モード:ノーマル転送
//  リピート領域:設定しない
//  転送データビット長:8bit
//  転送要求:周辺モジュールか

DMAC2.DMSAR = (void*) p_FtDatRamAd; // 転送元アドレス設定
DMAC2.DMDAR = (void*) Ft_DatAdrs; // 転送先アドレス設定 (FT232H Data Write)
DMAC2.DMCRA = 0x00000008; // 転送バイト数設定
DMAC2.DMCRB = 0x0000; // 不使用 リピート転送カウント設定

// ********** DMAC2起動設定 転送許可
DMAC.DMAST.BYTE = 0x01; // DMACモジュール起動設定
DMAC2.DMCNT.BYTE = 0x01; // DMAC2転送許可

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ********** 外部バス CS2 初期設定

BSC.CS2CR.WORD = 0x0020; // CS2制御レジスタ設定
//  エンディアンモード:動作モードのエンディアンと同じ
//  外部バス幅:8ビットバス
//  動作許可:動作禁止

BSC.CS2REC.WORD = 0x0202; // CS2リカバリサイクル設定
//  ライトリカバリ:2
//  リードリカバリ:2

BSC.CS2MOD.WORD = 0x0000; // CS2モードレジスタ設定
//  ページリードアクセスモード:ノーマルアクセス互換モード
//  ページライトアクセス許可:ページライトアクセス禁止
//  ページリードアクセス許可:ページリードアクセス禁止
//  外部ウェイト許可:外部ウェイト禁止
//  ライトアクセスモード:バイトストローブ

BSC.CS2WCR1.LONG = 0x03030000; // CS2ウェイト制御レジスタ1設定
//  ノーマルリードサイクルウェイト:3
//  ノーマルライトサイクルウェイト:3
//  ページリードサイクルウェイト:0
//  ページライトサイクルウェイト:0

BSC.CS2WCR2.LONG = 0x01220111; // CS2ウェイト制御レジスタ2設定
//  CSアサートウェイト:0
//  ライトデータ出力ウェイト:1
//  WRアサートウェイト:2
//  RDアサートウェイト:2
//  ライトデータ出力延長サイクル:1
//  ライト時CS延長サイクル:1
//  リード時CS延長サイクル:1


BSC.CS2CR.BIT.EXENB = 1; // 外部バス CS2動作許可
// CS2制御レジスタに動作許可を設定


// ********** ポートファンクション(外部バス CS2) 初期設定

IOPORT.PF0CSE.BYTE = 0x06; // ポートファンクションレジスタ0設定
//  CS1とCS2出力許可

IOPORT.PF2CSS.BYTE = 0x14; // ポートファンクションレジスタ2設定
//  P71からCS1#-Bを出力 / P72からCS2#-Bを出力

IOPORT.PF4BUS.BYTE = 0x01; // ポートファンクションレジスタ4設定
//  A9〜A4出力無効、A3〜A0出力有効

IOPORT.PF9IRQ.BYTE = 0x1C; // ポートファンクションレジスタ9設定
//  P12/P13/P14をIRQ2/IRQ3/IRQ4入力端子として設定

PORT1.ICR.BYTE = 0x1C; //入力バッファコントロールレジスタ設定
//  P12/P13/P14をIRQ2/IRQ3/IRQ4入力端子として設定

// ********** 外部バス有効を設定
SYSTEM.SYSCR0.WORD = 0x5A03; // システムコントロールレジスタ0に外部バス有効を設定



}

// ********** Ledとスイッチ用ポート初期設定
void InitPort_LedSw(void)
{
// ********** Ledとスイッチ接続ポート初期設定
PORT0.DR.BYTE = 0xff; // P0データレジスタ(DR)の設定
// (LED1,0(P0_1,P0_0)に消灯データ(0xff)を設定)

PORT0.DDR.BYTE = 0x03; // P0データディレクションレジスタ(DDR)の設定
// LED1:P0_1, LED0:P0_0を出力方向
// PBUT0:P0_7, SW2:P0_5, SW1:P0_3, SW0:P0_2を入力方向
}

// ********** コンペアマッチタイマ(CMT)初期設定と起動
void Init_cmt(void)
{
// ********** CMT0初期設定
SYSTEM.MSTPCRA.BIT.MSTPA15 = 0; // CMT0モジュールストップ解除

CMT0.CMCR.WORD = 0x0043; // カウントソース:PCLK/512=93.75KHz(PCLK=48MHz)
// 割り込み要因の出力を許可(IRビットに反映)
CMT0.CMCOR = 1875-1; // 20ms周期 PCLK/512/46,875=50Hz

// ********** CMT0コンペアマッチ割り込みの 許可/不許可 初期設定
IEN(CMT0,CMI0) = 0; // CMT0コンペアマッチ割り込み要求を不許可は、IENマクロを使用。
// IENマクロ(割り込み要求元, 割り込み信号名)

// ********** CMT0起動
CMT.CMSTR0.BIT.STR0 = 1; // CMT0起動
}


// **********************************************
// ******************** main ********************
void main(void)
{
unsigned char LedCntr;


Init_IcuDmaBsc(); //システムクロック,ICU,DMA,BSC レジスタ初期設定
InitPort_LedSw(); //Ledとスイッチ用ポート初期設定
Init_cmt(); //コンペアマッチタイマ(CMT)初期設定と起動


// ********** スイッチ入力変数初期化
InSwitchData = 0x00; // スイッチ入力変数初期化
InSwitch3 = 0x00; // スイッチ入力変数初期化
InSwitch2 = 0x00; // スイッチ入力変数初期化
InSwitch1 = 0x00; // スイッチ入力変数初期化
InSwitch0 = 0x00; // スイッチ入力変数初期化

// ********** 変数初期化
LedCntr = 0x00; // LedCntr変数初期化

// ******************** メインループ

while( 1 ) {
if ( IR(CMT0,CMI0) == 1 ) { // CMT0コンペアマッチ のカウントアップしたか? 20ms周期
IR(CMT0,CMI0) = 0; // CMT0コンペアマッチ リセット

// *************************************
// ******************** 20mS毎の処理

// ********** Ft処理ルーチン
// process_Ft(); // Ft処理ルーチン

// ********** LED点滅処理
if ( LedCntr >= 25 ) // 20ms周期 x 25 = 500mS
{
LedCntr = 0x00; // LedCntr変数初期化
PORT0.DR.BIT.B0 = ~PORT0.DR.BIT.B0; // P00(LED)極性逆転
}
else{
LedCntr = LedCntr + 1; // LedCntr変数 + 1
}


// ********** スイッチ入力してチャタフリー
InSwitch2 = InSwitch1;
InSwitch1 = InSwitch0;
InSwitch0 = ~PORT0.PORT.BYTE; //スイッチを入力して極性逆転

InSwitch3 = InSwitch0;
InSwitchData = ~InSwitch2 & InSwitch1 & InSwitch0;

process_switch(); // スイッチ処理ルーチン

} //End Of CMT0コンペアマッチ のカウントアップしたか? 20ms周期
}
}


// ************************************************************
// ******************** スイッチ処理ルーチン ********************

void process_switch(void)
{
// int i;
unsigned char ucSwitchData;


// ******************** スイッチ入力ポート
// PBUT0:P0_7, SW2:P0_5, SW1:P0_3, SW0:P0_2
// ******************** PBUT0押下有りか?
if(InSwitchData & 0x80) // PBUT0押下有りか?
{

PORT0.DR.BIT.B1 = ~PORT0.DR.BIT.B1; // P01(LED)極性逆転

ucSwitchData = InSwitch3; //スイッチ入力を抽出
// ucSwitchData = SwitchData & 0x2C; //スイッチ入力を抽出
ucSwitchData = 0x00; //スイッチ入力を抽出



// ******************** スイッチ状態で分岐
switch(ucSwitchData)
{
case 0x00: // SW2, SW1, SW0 : OFF, OFF, OFF

* p_FtDatRamAd = 0x30; // p_FtDatRamAdに書込み
* (p_FtDatRamAd + 1) = 0x31; // p_FtDatRamAdに書込み
* (p_FtDatRamAd + 2) = 0x32; // p_FtDatRamAdに書込み
* (p_FtDatRamAd + 3) = 0x33; // p_FtDatRamAdに書込み
* (p_FtDatRamAd + 4) = 0x34; // p_FtDatRamAdに書込み
* (p_FtDatRamAd + 5) = 0x35; // p_FtDatRamAdに書込み
* (p_FtDatRamAd + 6) = 0x36; // p_FtDatRamAdに書込み
*( p_FtDatRamAd + 7) = 0x37; // p_FtDatRamAdに書込み


// ********** IRQ3割り込みの 許可/不許可 初期設定
IEN(ICU,IRQ3) = 1; // IRQ3割り込み要求を不許可設定は、IENマクロを使用。

break;

case 0x04: // SW2, SW1, SW0 : OFF, OFF, ON
break;

case 0x08: // SW2, SW1, SW0 : OFF, ON, OFF
break;

case 0x0C: // SW2, SW1, SW0 : OFF, ON, ON
break;

case 0x20: // SW2, SW1, SW0 : ON, OFF, OFF
break;

case 0x24: // SW2, SW1, SW0 : ON, OFF, ON
break;

case 0x28: // SW2, SW1, SW0 : ON, ON, OFF
break;

case 0x2C: // SW2, SW1, SW0 : ON, ON, ON
break;

default:
break;

} //End Of switch
} //End Of if(InSwitchData & 0x80){ // PBUT0押下有りか?

}



#ifdef __cplusplus
void abort(void)
{

}
#endif



ホームへ戻る