トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

PSoC3 ADCからDMAでデータ引取りに失敗する

[電子工作]

現象

  • PSoC3 FTK に付属のサンプル BubbleLevel コードを参考に ADC からの引き取りを DMA->ISR(割り込み) 経由で行おうと変更してみたが、うまく動作するときとしないときがあった。

<変更した ADC ブロック図>

対処

・同じ 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);
}
BubbleLevel_DMA.gif

 カテゴリ : もくしいゲームレシピコンピュータ雑文生活電子工作おいしい店マップ

                  Topページへ | もてないSNS「もくしい」