マイコン、初心者です。表題のターゲットボードを使用し、AD9833(信号発生器)にて信号を出力してみたいと思いいざ、プログラムを書いて実行してみるとまったく動いている気配がありません。クロック設定などはtargetboard for RX65N のボードサプライパッケージ?をダウンロードし使用しています。何が足りないのか、いろいろ分からないなりに調べつつ試している最中ですが動く気配がなく困っております、、汗何か、とんでもない欠陥や見落としがあると思うのですが、、どなたか、教えてください。コードとクロック設定やデバック構成などのスクショを添付しました。/cfs-file/__key/communityserver-discussions-components-files/395/rxdeAD9938.txt
ご指摘ありがとうございます。正直勉強不足で現状半分も理解できないですが、貴重な意見非常に有難いです。はい、RSPIを使用しています。FSYNCは(いろいろ紆余曲折あり)なぜかGPIOピンを使用しています。(苦笑)"4線式の気をつける点はバッファのアクセス幅で指定したサイズをN個送信するという考え方です。"今回は1コマンド1フレーム(16ビット)を一回送信する関数を使用しましたが(最初なのでこれでいいのか自信はなかったです)、今後もう少し複雑な通信にチャレンジする際に大いに参考にさせて頂きます。実は最初はスマートコンフィギュレータで作成していたのですが、その時はSPI通信周りの設定があやふやだったのかうまく動作せずで、AD9833のデータシートをもう一度読み直し、SPI通信についても少し調べ、レジスタ操作でやってみた結果、やっと期待する2Khzの三角波を出力できました。練習のため、スマートコンフィギュレータの生成コードを活用したヴァージョンも作成しようと思います。手順まで示してくださりありがとうございます、、m(__)mこの度はお忙しい中本当にありがとうございました。
/*ビットレートを設定した気になっていましたが、出来てませんね。。。 この場合、PCLKAを何分周かした値がデフォルトのSCLKとして供給されるそうです。*/ #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 { TRIANGLE_WAVE = 0x2002 } 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) { // メインループ } }