{{category 電子工作}} !!!現象 *PSoC3 FTK に付属のサンプル BubbleLevel コードを参考に ADC からの引き取りを DMA->ISR(割り込み) 経由で行おうと変更してみたが、うまく動作するときとしないときがあった。 <変更した ADC ブロック図> {{ref_image BubbleLevel_DMA.gif}} !!!対処 ・同じ RAMアドレス(下記サンプルではグローバル変数BubbleValueG)にワード転送を繰り返す場合でも、TD_INC_DST_ADR が必要なようである。 ・上記オプションをつけなくとも、きちんと2バイト転送される(一見正常に見える)ことがあったので、注意が必要。 !!!DMA 部初期化コード例 /* Variable declarations for DMA_1 */ int16 BubbleValueG ; uint8 DMA_1_Chan; uint8 DMA_1_TD[1]; /* DMA Configuration for DMA_1 */ #define DMA_1_BYTES_PER_BURST 2 #define DMA_1_REQUEST_PER_BURST 1 #define DMA_1_SRC_BASE (CYDEV_PERIPH_BASE) #define DMA_1_DST_BASE (CYDEV_SRAM_BASE) void dma_init() { DMA_1_Chan = DMA_1_DmaInitialize(DMA_1_BYTES_PER_BURST, DMA_1_REQUEST_PER_BURST, HI16(DMA_1_SRC_BASE), HI16(DMA_1_DST_BASE)); DMA_1_TD[0] = CyDmaTdAllocate(); CyDmaTdSetConfiguration(DMA_1_TD[0], 2, DMA_INVALID_TD, TD_SWAP_EN | TD_INC_DST_ADR | DMA_1__TD_TERMOUT_EN); CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)ADC_DEC_SAMP_PTR), LO16((uint32)&BubbleValueG)); CyDmaChSetInitialTd(DMA_1_Chan, DMA_1_TD[0]); CyDmaChEnable(DMA_1_Chan, 1); }