电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

CS5532程序

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

博主
wnhb5183@yahoo.com.cn
wnhb's Blog
wnhb
点击跳转