📄 ad6620.c
字号:
/*! \file ad6620.c \brief Analog Devices AD6620 Digital Receiver Driver. */
//*****************************************************************************
//
// File Name : 'ad6620.c'
// Title : Analog Devices AD6620 Digital Receiver Driver
// Author : Pascal Stang - Copyright (C) 2004
// Created : 2004.07.08
// Revised : 2004.07.12
// Version : 0.1
// Target MCU : ARM processors
// Editor Tabs : 4
//
// NOTE: This code is currently below version 1.0, and therefore is considered
// to be lacking in some functionality or documentation, or may not be fully
// tested. Nonetheless, you can expect most functions to work.
//
// This code is distributed under the GNU Public License
// which can be found at http://www.gnu.org/licenses/gpl.txt
//
//*****************************************************************************
#include "lpc210x.h"
#include "global.h"
#include "timer.h"
#include "membus.h"
#include "rprintf.h"
#include "ad6620.h"
// global variables
void ad6620Init(void)
{
membusInit();
// reset device
//IOSET = AD9854_RESET;
//IODIR |= AD9854_RESET;
//delay(10000);
//IOCLR = AD9854_RESET;
// initialize registers
// initialize receiver - set soft reset
ad6620WriteReg(AD6620_REG_MODE_CTRL, 0x01);
// set NCO
ad6620WriteReg(AD6620_REG_NCO_SYNC, 0);
ad6620WriteReg(AD6620_REG_NCO_PHASE, 0);
ad6620WriteReg(AD6620_REG_NCO_FREQ, 0);
// set CIC2 filter
ad6620WriteReg(AD6620_REG_CIC2_SCALE, 1);
ad6620WriteReg(AD6620_REG_CIC2_DECIM, 4-1);
// set CIC5 filter
ad6620WriteReg(AD6620_REG_CIC5_SCALE, 1);
ad6620WriteReg(AD6620_REG_CIC5_DECIM, 10-1);
// set RCF filter
ad6620WriteReg(AD6620_REG_RCF_CTRL, 1);
ad6620WriteReg(AD6620_REG_RCF_DECIM, 52-1);
ad6620WriteReg(AD6620_REG_RCFADDR_OFS, 0);
ad6620WriteReg(AD6620_REG_RCF_TAPS, 52-1);
// set reserved register to zero
ad6620WriteReg(AD6620_REG_RESERVED, 0x00);
// initialize receiver - set operation mode
ad6620WriteReg(AD6620_REG_MODE_CTRL, 0x08);
}
void ad6620WriteReg(u16 reg, u32 data)
{
// write address
membusWrite(AD6620_REG_BASE+AD6620_REG_AMR, reg>>8);
membusRead(0);
membusWrite(AD6620_REG_BASE+AD6620_REG_LAR, reg);
membusRead(0);
// write value
membusWrite(AD6620_REG_BASE+AD6620_REG_DR3, data>>24);
membusRead(0);
membusWrite(AD6620_REG_BASE+AD6620_REG_DR2, data>>16);
membusRead(0);
membusWrite(AD6620_REG_BASE+AD6620_REG_DR1, data>>8);
membusRead(0);
membusWrite(AD6620_REG_BASE+AD6620_REG_DR0, data);
membusRead(0);
}
u32 ad6620ReadReg(u16 reg)
{
u32 data;
// write address
membusWrite(AD6620_REG_BASE+AD6620_REG_AMR, reg>>8);
membusRead(0);
membusWrite(AD6620_REG_BASE+AD6620_REG_LAR, reg);
membusRead(0);
// read value
data = (membusRead(AD6620_REG_BASE+AD6620_REG_DR0) & 0x000000FF);
membusRead(0);
data |= (membusRead(AD6620_REG_BASE+AD6620_REG_DR1) & 0x000000FF)<<8;
membusRead(0);
data |= (membusRead(AD6620_REG_BASE+AD6620_REG_DR2) & 0x000000FF)<<16;
membusRead(0);
data |= (membusRead(AD6620_REG_BASE+AD6620_REG_DR3) & 0x000000FF)<<24;
membusRead(0);
return data;
}
void ad6620ShowRegisters(void)
{
// read and print all registers
rprintfStr("Mode Control : ");
rprintfu08(ad6620ReadReg(AD6620_REG_MODE_CTRL));
rprintfCRLF();
rprintfStr("NCO Control : ");
rprintfu08(ad6620ReadReg(AD6620_REG_NCO_CTRL));
rprintfCRLF();
rprintfStr("NCO SYNC Control : ");
rprintfu32(ad6620ReadReg(AD6620_REG_NCO_SYNC));
rprintfCRLF();
rprintfStr("NCO Frequency : ");
rprintfu32(ad6620ReadReg(AD6620_REG_NCO_FREQ));
rprintfCRLF();
rprintfStr("NCO Phase Offset : ");
rprintfu16(ad6620ReadReg(AD6620_REG_NCO_PHASE));
rprintfCRLF();
rprintfStr("INPUT/CIC2 Scale : ");
rprintfu08(ad6620ReadReg(AD6620_REG_CIC2_SCALE));
rprintfCRLF();
rprintfStr("CIC2 Decimation : ");
rprintfu08(ad6620ReadReg(AD6620_REG_CIC2_DECIM));
rprintfCRLF();
rprintfStr("CIC5 Scale : ");
rprintfu08(ad6620ReadReg(AD6620_REG_CIC5_SCALE));
rprintfCRLF();
rprintfStr("CIC5 Decimation : ");
rprintfu08(ad6620ReadReg(AD6620_REG_CIC5_DECIM));
rprintfCRLF();
rprintfStr("OUTPUT/RCF Control: ");
rprintfu08(ad6620ReadReg(AD6620_REG_RCF_CTRL));
rprintfCRLF();
rprintfStr("RCF Decimation : ");
rprintfu08(ad6620ReadReg(AD6620_REG_RCF_DECIM));
rprintfCRLF();
rprintfStr("RCF Address Offset: ");
rprintfu08(ad6620ReadReg(AD6620_REG_RCFADDR_OFS));
rprintfCRLF();
rprintfStr("RCF Taps : ");
rprintfu08(ad6620ReadReg(AD6620_REG_RCF_TAPS));
rprintfCRLF();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -