新闻  |   论坛  |   博客  |   在线研讨会
CS5532参考程序
0750long | 2009-05-10 10:44:23    阅读:12720   发布文章

 

 

#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  n_nop(uchar);
void n_nop(uchar n)
{
int i;
for(i=0;i<n;i++){_nop_();}
}
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;
 
  n_nop(4);
  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;
  n_nop(4);

/*
  CS5532_Txd(0x81);    // 自偏移校准
  while(CS5532_SDO)
  n_nop(4);
*/
/*
  CS5532_Txd(0x82);    //  自增益校准
  while(CS5532_SDO)
  n_nop(4);
*/


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

/*
  CS5532_Txd(0x86);    //  增益校准
  while(CS5532_SDO)
  n_nop(4);
*/
/*
                         // 测试寄存器写回默认值
   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;
  n_nop(16);
//  address_pt = 48;
  CS5532_Txd(0x80);
  while(CS5532_SDO)
  n_nop(4);
  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)
  n_nop(4);

  for(i=0;i<5;i++)
 { 
   for(k=0;k<20;k++)  _nop_();//delay1
//  address_pt = 48;
   while(CS5532_SDO)
  n_nop(4);
  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)
  n_nop(4);
  DBYTE[address_pt++]=0xC0;
  read_data1(address_pt);
     address_pt = address_pt +4;
   for(k=0;k<20;k++)  _nop_(); //delay
  }

  while(CS5532_SDO)
 n_nop(4);
     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;
      n_nop(4);
      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;            //时钟低
      n_nop(12);
       }
      }

 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++)
      n_nop(3);
      for(i=0;i<8;i++)             // 8 个清串口时钟
      {
     CS5532_SCLK=1;    //时钟高  
      n_nop(24);
   

        CS5532_SCLK=0;    //时钟低
      n_nop(24);

      }

      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;            //时钟低
      n_nop(24);

       }
      }

 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;    //时钟高  
      n_nop(24);

   

        CS5532_SCLK=0;    //时钟低
      n_nop(24);


      }

      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;            //时钟低
      n_nop(24);

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
tywood  2012-03-30 16:50:41 

学习中...

推荐文章
最近访客