snifer

[原创]ADI量产产品ADuC7026的应用

0
阅读(3188)

ADuC7026目前已经量产,内部集成了1 MSPS、12位数据采集系统,在单芯片内集成高性能多通道ADC、16位/32位MCU和Flash/EE存储器。

ADC具有多达12路单端输入。另外还可提供4路输入与4个DAC输出引脚复用。4路DAC输出只是在特定型号上提供(ADuC7020和ADuC7026)。然而,在无DAC输出的情况下,这些引脚仍然可以用作ADC的输入引脚,这样ADC的输入最多可以达到16通道。ADC可以工作在单端或差分输入模式下。ADC输入电压范围为0 V至VREF。 低漂移带隙基准电压源、温度传感器和电压比较器完善了ADC的外设设置。

根据器件型号不同,片内最多可内置4个缓冲电压输出DAC。通过编程可以将DAC输出范围设置为三种电压范围之一(官网),目前利用该芯片完成了一个小项目,当然还用到了ADI公司的另外一块芯片 AD2S1210,主要利用ADUC7020的GPIO口仿真AD2S1210的SPI通信。

写一下这个驱动,

#include "ADuC7026.h"
#include "ADuC7026Driver.h"

// 来源于复制到得Keil uV4

tyVctHndlr IRQ = (tyVctHndlr)0x0;
tyVctHndlr SWI = (tyVctHndlr)0x0;
tyVctHndlr FIQ = (tyVctHndlr)0x0;
tyVctHndlr UNDEF = (tyVctHndlr)0x0;
tyVctHndlr PABORT = (tyVctHndlr)0x0;
tyVctHndlr DABORT = (tyVctHndlr)0x0;

void IRQ_Handler (void) __irq;
void SWI_Handler (void) __irq;
void FIQ_Handler (void) __irq;
void Undef_Handler (void) __irq;
void PAbt_Handler (void) __irq;
void DAbt_Handler (void) __irq;
void IRQ_Handler(void) __irq
{
if ( *IRQ !=0x00)
{
IRQ();
}
}
void FIQ_Handler(void) __irq
{
if ( *FIQ !=0x00)
{
FIQ();
}
}
void SWI_Handler(void) __irq
{
if ( *SWI !=0x00)
{
SWI();
}
}
void Undef_Handler(void)__irq
{
if ( *UNDEF !=0x00)
{
UNDEF();
}
}
void PAbt_Handler(void) __irq
{
if ( *PABORT !=0x00)
{
PABORT();
}
}
void DAbt_Handler(void) __irq
{
if ( *DABORT !=0x00)
{
DABORT();
}
}
/* 中断功能指针*/
// 加入了C文件
void ADuC7026_Initiate(void)
{
//Clock Initial
POWKEY1 = 0x01; //Start PLL Setting
POWCON = 0x00; //Set PLL Active Mode With CD = 0 CPU CLOCK DIVIDER = 41.78MHz
POWKEY2 = 0xF4; //Finish PLL Setting
GP1CON = 0x011; //PIN set up for UART

GP0DAT = GP0DAT & 0xDFFFFFFF; //Configure the P0.5 pin as input for SDOUT
GP4DAT = GP4DAT | 0xffff0000; //Configure the P4.x pin as output


//UART Initial?ê?Baud Rate = 9600
COMCON0 = 0x080;
COMDIV0 = 0x088;
COMDIV1 = 0x000;
COMCON0 = 0x007;
}
void delay (int length)
{
while (length >0)
length--;
}
void putchar(unsigned char ch)/* Write character to Serial Port */
{
COMTX = ch; //COMTX is an 8-bit transmit register.
while(!(0x020==(COMSTA0 & 0x020)))
{;}
}

void SPIWrite(unsigned char count, unsigned char *buf)
{
unsigned char ValueToWrite = 0;
unsigned char i = 0;
unsigned char j = 0;

for(i=count;i>0;i--)
{
ValueToWrite = *(buf + i - 1);
for(j=0; j<8; j++)
{
SET_SCLK();
if(0x80 == (ValueToWrite & 0x80))
{
SET_SDI(); //Send one to SDI pin
}
else
{
CLR_SDI(); //Send zero to SDI pin
}
delay(1);
CLR_SCLK();
delay(1);
ValueToWrite <<= 1; //Rotate data
}
}
}

//---------------------------------
//void ReadFromAD2S(unsigned char count,unsigned char *buf)
//---------------------------------
//Function that reads from the AD2S via the SPI port.
//--------------------------------------------------------------------------------
void SPIRead(unsigned char count, unsigned char *buf)
{
unsigned char i = 0;
unsigned char j = 0;
unsigned int iTemp = 0;
unsigned char RotateData = 0;

for(j=count; j>0; j--)
{
for(i=0; i<8; i++)
{
SET_SCLK();
RotateData <<= 1; //Rotate data
delay(1);
iTemp = GP0DAT; //Read SDO of AD2S
CLR_SCLK();
if(0x00000020 == (iTemp & 0x00000020))
{
RotateData |= 1;
}
delay(1);

}
*(buf + j - 1)= RotateData;
}

}
Baidu
map