snifer

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

0
阅读(3233)

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;    
 }

}