原创 CS5532程序

2008-9-14 11:13 4914 10 10 分类: 测试测量

#include "reg51.h"   //
#include "stdio.h"
#include "intrins.h"
#include "stdlib.h"
#include "absacc.h"
#define uchar unsigned char
// Original design board
sbit CS5532_CS=P1^2;
sbit CS5532_SDI=P1^3;
sbit CS5532_SCLK=P1^5;
sbit CS5532_SDO=P2^4;


// all  design board ?
sbit CS5532_A0=P1^6;
sbit CS5532_A1=P1^7;



#define  RxdTxd4b_0  DBYTE[0x20]
#define  RxdTxd4b_1  DBYTE[0x21]
#define  RxdTxd4b_2  DBYTE[0x22]
#define  RxdTxd4b_3  DBYTE[0x23]



uchar idata RxdTxd4b[4];


void CS5532_Txd(uchar);
void CS5532_Txd_init(uchar);
void  read_reg(uchar address_pt);
void  read_data(uchar address_pt);
void  read_data1(uchar address_pt);
void  CS5532_init(void);
 
void main(void)
{
  
   uchar i,k,address_pt;
   uchar flag="0";
   address_pt  = 32;     // RAM 数据区起始地址
   CS5532_init();


   for(k=0;k<20;k++)  _nop_();


//************************************************
//  系统软复位( CS5532_init() 包含该部分)
  
   CS5532_Txd(0x03);    // Soft Reset
   CS5532_Txd(0x2A);
   CS5532_Txd(0x00);
   CS5532_Txd(0x04);
   CS5532_Txd(0x00);


   CS5532_Txd(0x0B);    // Read Config Reg
   DBYTE[address_pt++]=0x0B;
   read_reg(address_pt);
   address_pt = address_pt +4;
   CS5532_Txd(0x0B);    // Read Config Reg
   DBYTE[address_pt++]=0x0B;
   read_reg(address_pt);
   address_pt = address_pt +4;
//////////////////////////////////////////////


   CS5532_Txd(0x05);    // Setup REG
   CS5532_Txd(0x32);
   CS5532_Txd(0x34);
   CS5532_Txd(0x00);
   CS5532_Txd(0x00);
 
   CS5532_Txd(0x03);    // Config ReG
   CS5532_Txd(0x40);
   CS5532_Txd(0x00);
   CS5532_Txd(0x00);
   CS5532_Txd(0x00);


   CS5532_Txd(0x03);    // Config ReG
   CS5532_Txd(0xC0);
   CS5532_Txd(0x00);
   CS5532_Txd(0x00);
   CS5532_Txd(0x00);


   CS5532_Txd(0x03);    // Config ReG
   CS5532_Txd(0x01);
   CS5532_Txd(0x80);
   CS5532_Txd(0x00);
   CS5532_Txd(0x00);


   CS5532_Txd(0x0B);    // Read Config Reg
   DBYTE[address_pt++]=0x0B;
   read_reg(address_pt);
   address_pt = address_pt +4;


   CS5532_Txd(0x0D);    // Read Setup Reg
   DBYTE[address_pt++]=0x0D;
   read_reg(address_pt);
   address_pt = address_pt +4;
 


   _nop_(); _nop_(); _nop_(); _nop_();


  address_pt  = 52;
  CS5532_CS=1;          // 未校准前转换
  CS5532_Txd(0x80);
  while(CS5532_SDO)
  _nop_();  _nop_(); _nop_(); _nop_();
  DBYTE[address_pt++]=0x80;
  read_data(address_pt);
  address_pt = address_pt +4;
  _nop_();  _nop_(); _nop_(); _nop_();


/*
  CS5532_Txd(0x81);    // 自偏移校准
  while(CS5532_SDO)
  _nop_();  _nop_(); _nop_(); _nop_();
*/


/*
  CS5532_Txd(0x82);    //  自增益校准
  while(CS5532_SDO)
  _nop_();  _nop_(); _nop_(); _nop_();
*/



  CS5532_Txd(0x85);    // 偏移校准
  while(CS5532_SDO)
  _nop_();  _nop_(); _nop_(); _nop_();



/*
  CS5532_Txd(0x86);    //  增益校准
  while(CS5532_SDO)
  _nop_();  _nop_(); _nop_(); _nop_();
*/


/*
                         // 测试寄存器写回默认值
   CS5532_Txd(0x07);    // REF TEST
   CS5532_Txd(0x00);
   CS5532_Txd(0x00);
   CS5532_Txd(0x1A);
   CS5532_Txd(0x00);
*/


//单次转换
//////////////////////////////////////////////////


for(i=0;i<5;i++)
 {
   CS5532_CS=1;
   _nop_(); _nop_(); _nop_(); _nop_();
   _nop_(); _nop_(); _nop_(); _nop_();
   _nop_(); _nop_(); _nop_(); _nop_();
//  address_pt = 48;
  CS5532_Txd(0x80);
  while(CS5532_SDO)
  _nop_();  _nop_(); _nop_(); _nop_();
  DBYTE[address_pt++]=0x80;
  read_data1(address_pt);
  address_pt = address_pt +4;
  for(k=0;k<20;k++)  _nop_(); 
  }


 // 连续转换
 //***************************************************


     CS5532_Txd(0xC0);//连续转换命令
  while(CS5532_SDO)
     _nop_();  _nop_(); _nop_(); _nop_(); 


  for(i=0;i<5;i++)
 { 
   for(k=0;k<20;k++)  _nop_();//delay1
//  address_pt = 48;
   while(CS5532_SDO)
     _nop_();  _nop_(); _nop_(); _nop_();
  DBYTE[address_pt++]=0xC0;
  read_data1(address_pt);
     address_pt = address_pt +4;
   for(k=0;k<20;k++)  _nop_(); //delay
 }


   for(i=0;i<5;i++)
 { 
   for(k=0;k<20;k++)  _nop_();//delay1
//  address_pt = 48;
   while(CS5532_SDO)
     _nop_();  _nop_(); _nop_(); _nop_();
  DBYTE[address_pt++]=0xC0;
  read_data1(address_pt);
     address_pt = address_pt +4;
   for(k=0;k<20;k++)  _nop_(); //delay
  }


  while(CS5532_SDO)
      _nop_();  _nop_(); _nop_(); _nop_();
     CS5532_Txd(0xFF);
     CS5532_Txd(0x00);
     CS5532_Txd(0x00);
     CS5532_Txd(0x00);
     CS5532_Txd(0x00);


   CS5532_Txd(0x0B);    // Read Config Reg
   DBYTE[address_pt++]=0x0B;
   read_reg(address_pt);
   address_pt = address_pt +4;


   CS5532_Txd(0x03);    // Power Save Select
   CS5532_Txd(0x80);
   CS5532_Txd(0x00);
   CS5532_Txd(0x00);
   CS5532_Txd(0x00);


_nop_();
}



 
void  read_reg(uchar address_pt)
{
 uchar i,j;
// EX1=0;    
      CS5532_SCLK = 0;  //时钟低
      CS5532_SDI = 0;
      _nop_(); _nop_(); _nop_();


      for(j=0;j<4;j++)
      {
       for(i=0;i<8;i++)
       {
        CS5532_SCLK=1;     //时钟高   
        RxdTxd4b[j]<<=1;    
        if(CS5532_SDO)
         RxdTxd4b[j]|=0x01;  //从SDO读取数据
        CS5532_SCLK=0;            //时钟低
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
       }
      }


 DBYTE[address_pt]=RxdTxd4b[0];
 DBYTE[address_pt+1]=RxdTxd4b[1];
 DBYTE[address_pt+2]=RxdTxd4b[2];
 DBYTE[address_pt+3]=RxdTxd4b[3];
}


void  read_data(uchar address_pt)
{
 uchar i,j;
// EX1=0;    
       CS5532_SCLK = 0;  //时钟低
      CS5532_SDI = 0;
   //for(i=0;i<16;i++)
      _nop_(); _nop_(); _nop_();
      for(i=0;i<8;i++)             // 8 个清串口时钟
      {
     CS5532_SCLK=1;    //时钟高  
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
   


        CS5532_SCLK=0;    //时钟低
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
     _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
   _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();


      }


      for(j=0;j<4;j++)
      {
       for(i=0;i<8;i++)
       {
        CS5532_SCLK=1;     //时钟高   
        RxdTxd4b[j]<<=1;    
        if(CS5532_SDO)
         RxdTxd4b[j]|=0x01;  //从SDO读取数据
        CS5532_SCLK=0;            //时钟低
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
       }
      }


 DBYTE[address_pt]=RxdTxd4b[0];
 DBYTE[address_pt+1]=RxdTxd4b[1];
 DBYTE[address_pt+2]=RxdTxd4b[2];
 DBYTE[address_pt+3]=RxdTxd4b[3];
}


void CS5532_init(void)
{
 uchar k;
 //串口初始化
 uchar i;
 CS5532_CS=1;
 for(k=0;k<200;k++)  _nop_();


 CS5532_CS=0; //片选使能
 for(k=0;k<200;k++)  _nop_();
 CS5532_SDI=0;
 CS5532_SDO=1;
 CS5532_SCLK=0;


 for(i=0;i<180;i++)
 CS5532_Txd_init(0xFF);//发送命令
 CS5532_Txd(0xFE); 
 for(i=0;i<18;i++) _nop_();
 for(i=0;i<18;i++) _nop_();
 


 //配置寄存器
 CS5532_Txd(0x03);
 CS5532_Txd(0x20);
 CS5532_Txd(0x00);
 CS5532_Txd(0x00);
 CS5532_Txd(0x00);
for(k=0;k<200;k++)  _nop_();
for(k=0;k<200;k++)  _nop_();


/*
 //配置寄存器
 CS5532_Txd(0x03);
 CS5532_Txd(0x02);
 CS5532_Txd(0x40);
 CS5532_Txd(0x00);
 CS5532_Txd(0x02);
 
 CS5532_Txd(0x05);
 CS5532_Txd(0x84);
 CS5532_Txd(0x00);
 CS5532_Txd(0x84);
 CS5532_Txd(0x00);
 */    
//---------------------------    
}
 
void CS5532_Txd(uchar dat)//向CS5532写一字节数据
{
     uchar i,k;
     CS5532_SCLK=0;//时钟低  
     CS5532_CS=0;
     _nop_();
//    for(i=0;i<16;i++)
//  _nop_();
//  _nop_();
  _nop_();
  _nop_();
     for(i=0;i<8;i++)
     {
      if((dat<<i)&0x80)
       CS5532_SDI=1;   //数据送到SPI的SDI口
       else            
       CS5532_SDI=0;
       _nop_();
    _nop_();
//    for(i=0;i<16;i++)
//    _nop_();
    _nop_();
       CS5532_SCLK=1;    //时钟高  
      for(k=0;k<20;k++)  _nop_();
      CS5532_SCLK=0;    //时钟低
      for(k=0;k<20;k++)  _nop_();
     }
     CS5532_SDI=0;
}


void CS5532_Txd_init(uchar dat)//向CS5532写一字节数据
{
     uchar i,k;
     CS5532_SCLK=0;//时钟低  
     CS5532_CS=0;
     _nop_();
     for(i=0;i<8;i++)
     {
      if((dat<<i)&0x80)
       CS5532_SDI=1;   //数据送到SPI的SDI口
       else            
       CS5532_SDI=0;
       _nop_();
       CS5532_SCLK=1;    //时钟高  
      for(k=0;k<190;k++)  _nop_();
      CS5532_SCLK=0;    //时钟低
       _nop_();
      for(k=0;k<190;k++)  _nop_();
     }
}


void  read_data1(uchar address_pt)
{
 uchar i,j;
// EX1=0;    
       CS5532_SCLK = 0;  //时钟低
      CS5532_SDI = 0;
   //for(i=0;i<16;i++)
      _nop_(); _nop_(); _nop_();
      for(i=0;i<8;i++)             // 8 个清串口时钟
      {
     CS5532_SCLK=1;    //时钟高  
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
   


        CS5532_SCLK=0;    //时钟低
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
     _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
   _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();


      }


      for(j=0;j<4;j++)
      {
       for(i=0;i<8;i++)
       {
        CS5532_SCLK=1;     //时钟高   
        RxdTxd4b[j]<<=1;    
        if(CS5532_SDO)
         RxdTxd4b[j]|=0x01;  //从SDO读取数据
        CS5532_SCLK=0;            //时钟低
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
       _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();
       }
      }
  
  if(RxdTxd4b[0] > 0x7F)
    {
//     RxdTxd4b[3] = ~RxdTxd4b[3];
       RxdTxd4b[2] = ~RxdTxd4b[2];
      RxdTxd4b[1] = ~RxdTxd4b[1];
       RxdTxd4b[0] = ~RxdTxd4b[0];
 }


     DBYTE[address_pt]=RxdTxd4b[0];
     DBYTE[address_pt+1]=RxdTxd4b[1];
      DBYTE[address_pt+2]=RxdTxd4b[2];
     DBYTE[address_pt+3]=RxdTxd4b[3];
}
 
 

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条