#include "platform.h" #include #include #ifdef __CCRX__ #include #endif //定数の定義// #define SINE 0x2000 //サイン波 #define SQUARE 0x2028 //方形波 #define TRIANGLE 0x2002 //三角波 #define REF_FREQ 25000000.0 //AD9833のMCLK //FSYNCピン(SS)の設定// #define FSYNC_PORT PORT4 //FSYNCピンのポート(PORT4を使用) #define FSYNC_PIN 0 //FSYNCピンのピン番号(P40を使用) //遅延調整用の定数// #define N 12 //プロトタイプ宣言// void AD9833_Reset(void); void AD9833_SetFrequency(uint32_t frequency, uint16_t Waveform); void WriteRegister(uint16_t data); void init_SPI(void); void init_GPIO(void); void delay_us(uint32_t us); //グローバル変数// uint16_t waveType = TRIANGLE; uint32_t freq = 2000; //初期周波数を2kHZに設定 /** * Function Name : main * Description : メイン関数 * Arguments : none * Return Value : none */ void main(void) { //初期化処理// init_GPIO(); //GPIO (FSYNCピン) の初期化 init_SPI(); //SPI (RSPI) の初期化 //AD9833のリセット// AD9833_Reset(); //周波数と波形の設定// AD9833_SetFrequency(freq, waveType); while(1) { //メインループ処理// } } /** *Function Name: init_GPIO *Description : GPIO (FSYNCピン)の初期化 *Arguments : none *Return Value : none */ void init_GPIO(void) { //FSYNCピンを出力に設定// MPC.P40PFS.BYTE = 0x00; //P40のピン機能をGPIOに設定 FSYNC_PORT.PDR.BIT.B0 = 1; //出力に設定 FSYNC_PORT.PODR.BIT.B0 = 1; //初期値をHIGHに設定 FSYNC_PORT.PMR.BIT.B0 = 0; //周辺機能を無効化(GPIOとして使用) } /** *Function Name: init_SPI *Description : RSPI(SPI)の初期化 *Arguments : none *Return Value : none */ void init_SPI(void) { /* モジュールストップを解除 */ SYSTEM.MSTPCRB.BIT.MSTPB17 = 0; //RSPIを動作させる /* RSPIのリセット */ RSPI0.SPCR.BIT.SPE = 0; //RSPIを無効化 RSPI0.SPCR.BIT.SPTIE = 0; //送信割り込み無効 RSPI0.SPCR.BIT.SPRIE = 0; //受信割り込み無効 /* RSPIの設定 */ RSPI0.SPPCR.BYTE = 0x00; //フレーム長 : 16ビット RSPI0.SPCKD.BYTE = 0x00; //クロック遅延なし RSPI0.SSLND.BYTE = 0x00; //スレーブセレクトネゲート遅延なし RSPI0.SPND.BYTE = 0x00; //次アクセス遅延なし RSPI0.SPCR2.BYTE = 0x00; //割り込み関連無効 /* コマンドレジスタの設定 */ RSPI0.SPCMD0.WORD = 0xF02; //ビット長16ビット、MSBファースト、SPIモード2 /* RSPIの動作開始 */ RSPI0.SPCR.BYTE = 0x48; /* RSPIのピン設定 */ MPC.PA5PFS.BYTE = 0x0D; //PA5をRSPCKAに設定 MPC.PA6PFS.BYTE = 0x0D; //PA6をMOSIAに設定 PORTA.PMR.BIT.B5 = 1; //周辺機能として使用 PORTA.PMR.BIT.B6 = 1; } /** *Function Name: AD9833_Reset *Description : Ad9833をリセット *Arguments : none *Return Value : none */ void AD9833_Reset(void) { WriteRegister(0x0100); //コントロールレジスタのD8ビットを1に設定 delay_us(10); //10マイクロ秒の遅延 } /** *Function Name: AD9833_SetFrequency *Description : 周波数と波形を設定 *Arguments : frequency - 設定する周波数 (Hz) * Waveform - 波形種別 (SINE, SQUARE, TRIANGLE) *Return Value : none */ void AD9833_SetFrequency(uint32_t frequency, uint16_t Waveform) { uint32_t FreqWord; uint16_t MSB, LSB; /* 周波数ワードの計算 */ FreqWord = (uint32_t)((frequency * 268435456.0) / REF_FREQ); //2^28 /* 周波数ワードの分割 */ MSB = (uint16_t)((FreqWord & 0xFFFC000) >> 14); //上位14ビットを抽出します。 >>14で下位14ビットにシフト。 LSB = (uint16_t)(FreqWord & 0x3FFF); //下位14ビットを抽出します。 /* 制御ビットの設定 */ MSB |= 0x4000; LSB |= 0x4000; /* レジスタへの書き込み */ WriteRegister(0x2100); //28ビットモード、リセット WriteRegister(LSB); //下位14ビット WriteRegister(MSB); //上位14ビット WriteRegister(0xC000); //位相レジスタに0を設定 WriteRegister(Waveform); //波形の設定とリセット解除 } /** *Function Name: WriteRegister *Description : AD9833のレジスタにデータを書き込む *Arguments : data - 書き込む 16ビットデータ *Return Value : none */ void WriteRegister(uint16_t data) { /* AD9833用のSPIモードに設定 (Mode 2: CPOL = 1, CPHA = 0) */ RSPI0.SPCMD0.WORD = 0xF02; //MSBファースト, 16ビット長, Mode2 /* FSYNCをLOWに設定してデータ受信を開始 */ FSYNC_PORT.PODR.BIT.B0 = 0; //FSYNC = LOW delay_us(10); //10マイクロ秒の遅延 /* データ送信 - ワードアクセスで16ビットデータを送信 */ RSPI0.SPDR.WORD.H = data; /* 送信完了待ち */ while(!RSPI0.SPSR.BIT.SPTEF) { /* 送信完了を待機 */ } /* FSYNCをHIGHに設定してデータ受信を終了 */ FSYNC_PORT.PODR.BIT.B0 = 1; //FSYNC = HIGH } /** *Function Name: delay_us *Description : 指定されたマイクロ秒だけ待機 *Arguments : us - 待機時間 (マイクロ秒) *Return Value : none */ void delay_us(uint32_t us) { /* クロック周波数に応じて調整 */ /* 以下はシンプルなウェイトループの例 */ for (uint32_t count = 0; count < us * N; count++) { #ifdef __CCRX__ nop(); //CC-RXコンパイラの場合 #else __asm__("nop"); //GCCコンパイラの場合 #endif } }