読者です 読者をやめる 読者になる 読者になる

VDAC、DMA を試す

DDS を作ってみたかったので、それの前準備として VDAC, DMA を試してみました。

回路図

DMA を1から設定するのは結構面倒なのですが、DMA Wizard が用意されているので
それを使ってあげればソースコードのテンプレートを作ってくれます。

Wizard で DMA が準備できたあとは、忘れずに VDAC_Start() などを追加します
(忘れて1時間くらいはまりました)。

波形が汚いので実際に DDS 組むときはノイズ対策をしないといけなさそうです。

ソースコード

/* ========================================
 *
 * Copyright YOUR COMPANY, THE YEAR
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF your company.
 *
 * ========================================
*/
#include <project.h>
#include <math.h>

#define size (1024)
uint8 VDAC_DATA1[size];
uint8 VDAC_DATA2[size];

/* DMA Configuration for DMA_1 */
#define DMA_1_BYTES_PER_BURST 1
#define DMA_1_REQUEST_PER_BURST 1
#define DMA_1_SRC_BASE (CYDEV_SRAM_BASE)
#define DMA_1_DST_BASE (CYDEV_PERIPH_BASE)

void VDAC_Setup()
{
  /* Variable declarations for DMA_1 */
  /* Move these variable declarations to the top of the function */
  uint8 DMA_1_Chan, DMA_2_Chan;
  uint8 DMA_1_TD[2];
  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_2_Chan = DMA_2_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();
  DMA_1_TD[1] = CyDmaTdAllocate();
  CyDmaTdSetConfiguration(DMA_1_TD[0], size, DMA_1_TD[0], TD_INC_SRC_ADR);
  CyDmaTdSetConfiguration(DMA_1_TD[1], size, DMA_1_TD[1], TD_INC_SRC_ADR);
  CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)VDAC_DATA1), LO16((uint32)VDAC8_1_Data_PTR));
  CyDmaTdSetAddress(DMA_1_TD[1], LO16((uint32)VDAC_DATA2), LO16((uint32)VDAC8_2_Data_PTR));
  CyDmaChSetInitialTd(DMA_1_Chan, DMA_1_TD[0]);
  CyDmaChSetInitialTd(DMA_2_Chan, DMA_1_TD[1]);
  CyDmaChEnable(DMA_1_Chan, 1);
  CyDmaChEnable(DMA_2_Chan, 1);
  VDAC8_1_Start();
  Opamp_1_Start();
  VDAC8_2_Start();
  Opamp_2_Start();
}

int main()
{
  /* Place your initialization/startup code here (e.g. MyInst_Start()) */
  uint16 i = 0;
  for(i=0; i<size; i++) {
    VDAC_DATA1[i] = (int8)(sin(4*M_PI*i/size)*127) + 127;
    VDAC_DATA2[i] = (int8)(sin(6*M_PI*i/size)*127) + 127;
  }

  VDAC_Setup();
  /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
  for(;;)
  {
    /* Place your application code here. */
  }
}

/* [] END OF FILE */

次は SD Card からデータが読めるようにしたいですね。