⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad7794.c

📁 对A/D7794的编程
💻 C
字号:
#include "msp430x44x.h"
#include "math.h"

#include "../utility/delay.h"
#include "../main/parameter.h"

#include "IO_init.h"
#include "ad7794.h"


void write_8bit(unsigned char writeData)
{  
   unsigned char j;
   
   SET_SCLK;
 
   for(j = 0; j < 8; j++)
   {
       if(writeData & 0x80) SET_DOUT;
       else CLR_DOUT;
       
       CLR_SCLK;
       writeData <<= 1;
       SET_SCLK;
   }
   SET_DOUT;
}


void write_16bit(unsigned int writeData)
{
   unsigned char j;
   
   SET_SCLK;
 
   for(j = 0; j < 16; j++)
   {
       if(writeData & 0x8000) SET_DOUT;
       else CLR_DOUT;
       
       CLR_SCLK;
       writeData <<= 1;
       SET_SCLK;
   }
   SET_DOUT;
}


unsigned char read_8bit(void)
{
   unsigned char readData;
   unsigned char j;
   
   SET_SCLK;
   SET_DOUT;
   
   for(j = 0; j < 8; j++)
   {      
       CLR_SCLK;
       readData <<= 1;
       if(READ_DIN == ADC_DIN) readData |= 1;
       SET_SCLK;
   }

   return readData;
}


unsigned int read_16bit(void)
{
   unsigned int readData;
   unsigned char j;
   
   SET_SCLK;
   SET_DOUT;
   
   for(j = 0; j < 16; j++)
   {      
       CLR_SCLK;
       readData <<= 1;
       if(READ_DIN == ADC_DIN) readData |= 1;
       SET_SCLK;
   }

   return readData;
}


unsigned int read_24bit(void)
{
   //unsigned long int readData;
   unsigned int readData;
   unsigned char j;
   SET_SCLK;
   SET_DOUT;
     
   for(j = 0; j < 16; j++)
   {      
       CLR_SCLK;
       readData <<= 1;
       if(READ_DIN == ADC_DIN) readData |= 1;
       SET_SCLK;
   }

   for(j = 0; j < 8; j++)
   {      
       CLR_SCLK;
       CLR_SCLK;
       SET_SCLK;
       SET_SCLK;
   }
    
   return readData;
}



unsigned char AD7794ReadConfig(unsigned char adcType)
{
   unsigned char temp;
   SET_SCLK;
   SET_DOUT;
   
   if(adcType == 0)
   {
      CLR_ADCS0;
   }
   else
   {
      CLR_ADCS1;
   }
   
   write_8bit(STATUS_REGISTER | READ);  
   temp  = read_8bit();
   if(temp == 0x4D)//channel 6
     temp = 0x0D;
   temp &= 0x78;
   SET_ADCS0;
   SET_ADCS1;
   
   return temp;
}


unsigned int read_adc(unsigned char adcType)
{
   unsigned int readData;

   SET_SCLK;
   SET_DOUT;
   
   SET_ADCS0;
   SET_ADCS1;
   
   if(adcType == 0)
   {
      CLR_ADCS0;
   }
   else
   {
      CLR_ADCS1;
   }
      
   write_8bit(READ | DATA_REGISTER);
   SET_DOUT;
   readData = read_24bit(); 
   
   SET_ADCS0;
   SET_ADCS1;
   
   return readData;
}


void set_adc_channel(unsigned int adcChannel, unsigned char adcType)
{    
   unsigned int temp;
   
   SET_SCLK;
   SET_DOUT;
   
   SET_ADCS0;
   SET_ADCS1;
         
   if(adcType == 0)
   {    
      do
      {
         CLR_ADCS0;
         write_8bit(CONFIG_REGISTER);
         write_16bit(adcChannel);   
         SET_ADCS0;
      
         CLR_ADCS0;
         write_8bit(CONFIG_REGISTER | READ);
         temp = read_16bit();
         SET_ADCS0;
      }
      while(temp != adcChannel);
     
      adcChannel &= 0x07;
   
      do
      {
         CLR_ADCS0;
         write_8bit(STATUS_REGISTER | READ);  
         temp = (unsigned int)read_8bit();
         SET_ADCS0;
         temp &= 0x07;
      }
      while(temp != adcChannel);      
   }
   else
   {
      do
      {
         CLR_ADCS1;
         write_8bit(CONFIG_REGISTER);
         write_16bit(adcChannel);   
         SET_ADCS1;
      
         CLR_ADCS1;
         write_8bit(CONFIG_REGISTER | READ);
         temp = read_16bit();
         SET_ADCS1;
      }
      while(temp != adcChannel);
     
      adcChannel &= 0x07;
   
      do
      {
         CLR_ADCS1;
         write_8bit(STATUS_REGISTER | READ);  
         temp = (unsigned int)read_8bit();
         SET_ADCS1;
         temp &= 0x07;
      }
      while(temp != adcChannel);     
     
   }
   
   delay_ms(SAMPLING_TIME/2);
   read_adc(adcType);  
}


void ADCPortInit(void)
{
   ADC_SEL  &= ~(ADC_SCLK + ADC_DIN + ADC_DOUT + ADC_PSW + ADCCS0 + ADCCS1);
   ADC_DIR  |= ADC_SCLK + ADC_DOUT + ADC_PSW + ADCCS0 + ADCCS1;

   DIN_IN;   

   delay_ms(5);
   ADC_OUT  |= ADC_SCLK + ADC_DOUT + ADC_PSW + ADCCS0 + ADCCS1;
   delay_ms(500);
}


void ADCInit(void)
{ 
   unsigned int temp, ADCParameter;
   
   SET_SCLK;
   SET_DOUT;

   SET_ADCS0;
   SET_ADCS1;
  
   do
   {
       CLR_ADCS0;  
       write_8bit(STATUS_REGISTER | READ);  
       temp  = (unsigned int)read_8bit();
       temp &= 0x58;
       SET_ADCS0;
   }
   while(temp != 0x08); 
   
   do
   {
      ADCParameter = CONTINUOUS_MODE | ADC_470HZ;
      CLR_ADCS0;        
      //set adc mode register
      write_8bit(MODE_REGISTER);
      write_16bit(ADCParameter);
      SET_ADCS0;  
      
      CLR_ADCS0;        
      //set adc mode register
      write_8bit(MODE_REGISTER | READ);
      temp = read_16bit();
      SET_ADCS0;  
   }
   while(temp != ADCParameter);
   
   do
   {
      CLR_ADCS0;        
      //set adc mode register
      write_8bit(CONFIG_REGISTER);
      write_16bit(VRR_CHANNEL);
      SET_ADCS0;  
      
      CLR_ADCS0;        
      //set adc mode register
      write_8bit(CONFIG_REGISTER | READ);
      temp = read_16bit();
      SET_ADCS0;  
   }
   while(temp != VRR_CHANNEL);
 
   CLR_ADCS0;  
   //enable AIN6 as analog input
   write_8bit(IO_REGISTER);
   write_8bit(0);  
   SET_ADCS0;
   
   delay_ms(1);

#if DOUBLE_ADC == 1 
   //init adc1
   do
   {
       CLR_ADCS1;  
       write_8bit(STATUS_REGISTER | READ);  
       temp  = (unsigned int)read_8bit();
       temp &= 0x58;
       SET_ADCS1;
   }
   while(temp != 0x08); 
   
   do
   {
      ADCParameter = CONTINUOUS_MODE | ADC_470HZ;
      CLR_ADCS1;        
      //set adc mode register
      write_8bit(MODE_REGISTER);
      write_16bit(ADCParameter);
      SET_ADCS1;  
      
      CLR_ADCS1;        
      //set adc mode register
      write_8bit(MODE_REGISTER | READ);
      temp = read_16bit();
      SET_ADCS1;  
   }
   while(temp != ADCParameter);
   
   do
   {
      CLR_ADCS1;        
      //set adc mode register
      write_8bit(CONFIG_REGISTER);
      write_16bit(VH_CHANNEL);
      SET_ADCS1;  
      
      CLR_ADCS1;        
      //set adc mode register
      write_8bit(CONFIG_REGISTER | READ);
      temp = read_16bit();
      SET_ADCS1;  
   }
   while(temp != VH_CHANNEL);
  
   CLR_ADCS1;  
   //enable AIN6 as analog input
   write_8bit(IO_REGISTER);
   write_8bit(0);  
   SET_ADCS1;
#endif   
}


void ADCLowPowerMode(void)
{
   //enable analog power supply
   SET_PWR;
   
   SET_ADCS0; 
   SET_ADCS1; 
   SET_PSW; 
   CLR_DOUT;
   CLR_SCLK; 
}


void ADCActiveMode(void)
{
   //enable analog power supply
   CLR_PWR;
   
   SET_SCLK;
   SET_DOUT;
   SET_ADCS0; 
   SET_ADCS1; 
   SET_PSW; 
   CLR_DOUT;
   CLR_SCLK;
   delay_ms(100);
   ADCInit();
   delay_ms(30);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -