マイコン、初心者です。表題のターゲットボードを使用し、AD9833(信号発生器)にて信号を出力してみたいと思いいざ、プログラムを書いて実行してみるとまったく動いている気配がありません。クロック設定などはtargetboard for RX65N のボードサプライパッケージ?をダウンロードし使用しています。何が足りないのか、いろいろ分からないなりに調べつつ試している最中ですが動く気配がなく困っております、、汗何か、とんでもない欠陥や見落としがあると思うのですが、、どなたか、教えてください。コードとクロック設定やデバック構成などのスクショを添付しました。/cfs-file/__key/communityserver-discussions-components-files/395/rxdeAD9938.txt
わわいです
そのボードに添付されているサンプルソフトは動くんでしょうか。
それが動かない、ということであれば、そのボードの不良ってことが疑われるでしょう。
そうでないなら、あなたが組んだプログラムというものが、不完全ということになろうかと思われます。
回答ありがとうございます。サンプルソフトは動きました。LEDを点滅させるものです。こちらいろいろ、プログラムを修正してみると、今度は70hzくらいの矩形波が出てきました。(出したいのは2khzの三角波)AD9833の仕様としてVccに電源を接続するだけ(SPIインタフェースでデータを設定しなくとも)で、「xx」MHz(xxはモジュールによって異なるみたいです)のサイン波が発生できます。ですが、出たのは矩形波です(苦笑)なんらかの信号は送れたのか、、、おっしゃる通りコードが不完全ということだと思いますので1から見直してみます。
わわいさまいろいろ、見直してみて修正をし、なんとか期待する2000hzの三角波を出力できました。やはり、おっしゃる通り思ったように動かないときは自分が悪いですね、、有難いご指摘ありがとうございました。 //ビットレートは1Mbps/8 //SPI2 #include "r_smc_entry.h" /* 定数定義 */ #define FSYNC_LOW() (PORTC.PODR.BIT.B0 = 0) #define FSYNC_HIGH() (PORTC.PODR.BIT.B0 = 1) const float REF_FREQ = 25000000UL; // AD9833の基準クロック(25MHz) /* 波形タイプ */ typedef enum { SINE_WAVE = 0x2000, // 正弦波 TRIANGLE_WAVE = 0x2022, // 三角波 SQUARE_WAVE = 0x2028 // 矩形波 } AD9833_WaveType; /* プロトタイプ宣言 */ void init_SPI(void); void WriteRegister(uint16_t data); void AD9833reset(void); void AD9833setFrequency(uint32_t frequency, AD9833_WaveType waveform); void init_SPI(void) { /* モジュールストップ解除 */ SYSTEM.MSTPCRB.BIT.MSTPB17 = 0; /* ピン設定: RSPCKA、MOSIA */ MPC.PWPR.BIT.B0WI = 0; MPC.PWPR.BIT.PFSWE = 1; MPC.PA5PFS.BYTE = 0x0D; // RSPCKA MPC.PA6PFS.BYTE = 0x0D; // MOSIA PORTA.PMR.BIT.B5 = 1; PORTA.PMR.BIT.B6 = 1; /* RSPI停止 */ RSPI0.SPCR.BIT.SPE = 0; /* RSPI設定 */ RSPI0.SPPCR.BYTE = 0x00; RSPI0.SPCKD.BYTE = 0x00; RSPI0.SSLND.BYTE = 0x00; RSPI0.SPND.BYTE = 0x00; RSPI0.SPCR2.BYTE = 0x00; // 16ビット、MSBファースト、SPIモード2(CPOL=1, CPHA=0) RSPI0.SPCMD0.WORD = 0x0F02; /* RSPI開始 */ RSPI0.SPCR.BYTE = 0x48; // MSTR=1, SPE=1 } void WriteRegister(uint16_t data) { FSYNC_LOW(); // 送信レジスタに16ビット書き込み (WORDアクセス) RSPI0.SPDR.WORD.H = data; // 送信バッファエンプティフラグ (SPTEF) が1になるまで待機 // SPTEF=1は、送信バッファに次のデータを書き込める状態を示します。 // ただし、これだけでは転送が完全に完了した保証にはなりません。 while (!RSPI0.SPSR.BIT.SPTEF) { // 送信完了待ち } // より確実に転送完了を確認したい場合は、 // RSPIがアイドル状態になるのを待つ(IDLNF=0になるまで待機)ことも検討します。 while (RSPI0.SPSR.BIT.IDLNF) { // RSPIがアイドル状態になるまで待つ } FSYNC_HIGH(); } void AD9833reset(void) { WriteRegister(0x0100); R_BSP_SoftwareDelay(10, BSP_DELAY_MILLISECS); } void AD9833setFrequency(uint32_t frequency, AD9833_WaveType waveform) { if (frequency > (REF_FREQ / 2)) { return; // エラーチェック } uint32_t freqWord = (uint32_t)((frequency * (1ULL << 28)) / REF_FREQ); uint16_t MSB = (uint16_t)((freqWord & 0xFFFC000) >> 14); uint16_t LSB = (uint16_t)(freqWord & 0x3FFF); MSB |= 0x4000; LSB |= 0x4000; WriteRegister(0x2100); WriteRegister(LSB); WriteRegister(MSB); WriteRegister(0xC000); WriteRegister((uint16_t)waveform); } void main(void) { R_Systeminit(); init_SPI(); R_BSP_SoftwareDelay(50, BSP_DELAY_MILLISECS); AD9833reset(); R_BSP_SoftwareDelay(50, BSP_DELAY_MILLISECS); uint32_t frequency = 2000; AD9833setFrequency(frequency, TRIANGLE_WAVE); while (1) { // メインループ } }
//ビットレートは1Mbps/8 //SPI2 #include "r_smc_entry.h" /* 定数定義 */ #define FSYNC_LOW() (PORTC.PODR.BIT.B0 = 0) #define FSYNC_HIGH() (PORTC.PODR.BIT.B0 = 1) const float REF_FREQ = 25000000UL; // AD9833の基準クロック(25MHz) /* 波形タイプ */ typedef enum { SINE_WAVE = 0x2000, // 正弦波 TRIANGLE_WAVE = 0x2022, // 三角波 SQUARE_WAVE = 0x2028 // 矩形波 } AD9833_WaveType; /* プロトタイプ宣言 */ void init_SPI(void); void WriteRegister(uint16_t data); void AD9833reset(void); void AD9833setFrequency(uint32_t frequency, AD9833_WaveType waveform); void init_SPI(void) { /* モジュールストップ解除 */ SYSTEM.MSTPCRB.BIT.MSTPB17 = 0; /* ピン設定: RSPCKA、MOSIA */ MPC.PWPR.BIT.B0WI = 0; MPC.PWPR.BIT.PFSWE = 1; MPC.PA5PFS.BYTE = 0x0D; // RSPCKA MPC.PA6PFS.BYTE = 0x0D; // MOSIA PORTA.PMR.BIT.B5 = 1; PORTA.PMR.BIT.B6 = 1; /* RSPI停止 */ RSPI0.SPCR.BIT.SPE = 0; /* RSPI設定 */ RSPI0.SPPCR.BYTE = 0x00; RSPI0.SPCKD.BYTE = 0x00; RSPI0.SSLND.BYTE = 0x00; RSPI0.SPND.BYTE = 0x00; RSPI0.SPCR2.BYTE = 0x00; // 16ビット、MSBファースト、SPIモード2(CPOL=1, CPHA=0) RSPI0.SPCMD0.WORD = 0x0F02; /* RSPI開始 */ RSPI0.SPCR.BYTE = 0x48; // MSTR=1, SPE=1 } void WriteRegister(uint16_t data) { FSYNC_LOW(); // 送信レジスタに16ビット書き込み (WORDアクセス) RSPI0.SPDR.WORD.H = data; // 送信バッファエンプティフラグ (SPTEF) が1になるまで待機 // SPTEF=1は、送信バッファに次のデータを書き込める状態を示します。 // ただし、これだけでは転送が完全に完了した保証にはなりません。 while (!RSPI0.SPSR.BIT.SPTEF) { // 送信完了待ち } // より確実に転送完了を確認したい場合は、 // RSPIがアイドル状態になるのを待つ(IDLNF=0になるまで待機)ことも検討します。 while (RSPI0.SPSR.BIT.IDLNF) { // RSPIがアイドル状態になるまで待つ } FSYNC_HIGH(); } void AD9833reset(void) { WriteRegister(0x0100); R_BSP_SoftwareDelay(10, BSP_DELAY_MILLISECS); } void AD9833setFrequency(uint32_t frequency, AD9833_WaveType waveform) { if (frequency > (REF_FREQ / 2)) { return; // エラーチェック } uint32_t freqWord = (uint32_t)((frequency * (1ULL << 28)) / REF_FREQ); uint16_t MSB = (uint16_t)((freqWord & 0xFFFC000) >> 14); uint16_t LSB = (uint16_t)(freqWord & 0x3FFF); MSB |= 0x4000; LSB |= 0x4000; WriteRegister(0x2100); WriteRegister(LSB); WriteRegister(MSB); WriteRegister(0xC000); WriteRegister((uint16_t)waveform); } void main(void) { R_Systeminit(); init_SPI(); R_BSP_SoftwareDelay(50, BSP_DELAY_MILLISECS); AD9833reset(); R_BSP_SoftwareDelay(50, BSP_DELAY_MILLISECS); uint32_t frequency = 2000; AD9833setFrequency(frequency, TRIANGLE_WAVE); while (1) { // メインループ } }