广告

原创 CS5532参考程序

2009-5-3 22:02 1477 0 分类: 工业电子

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

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
wisdomme 2009-05-04 20:25
电磁炉电路板简单维修方法
电磁炉电路板简单维修方法 (转)一、电路板烧IGBT或保险丝的维修程序 电流保险丝或IGBT烧坏,不能马上换上该零件,必须确认下列其它零件是在正常状态时才能进行更换,否则,IGBT和保险丝又会烧坏。 ...
wisdomme 2009-05-04 19:55
电磁炉重要零部件检验规定
电磁炉重要零部件检验规定(转)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   ...
我要评论
0
0
广告