OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于ad芯片cs5532的输出问题,求助

共6条 1/1 1 跳转至

关于ad芯片cs5532的输出问题,求助

菜鸟
2014-03-17 18:12:02    评分

我用的是STM32加CS5532,但是复位后C5532的输出引脚SDO总是高电平,读数总是ffffffff,求大神指导下面是比分程序:

void CS5532W2Command(unsigned char date)//cs5532写命令
{
unsigned char temp,i;
   temp = date;
  CS5532_SCLK = 0;  
  CS5532_CS = 0; 
  CS5532_DIN = 0;////////////
  delay_us(3);
for(i=0; i<8; i++)
{
if((temp<<i)&0x80)
CS5532_DIN = 1; //如果为1写1
else
CS5532_DIN = 0;  //如果为0写0
delay_us(3);
CS5532_SCLK = 1; 
delay_us(3); //添加5us
CS5532_SCLK = 0;
delay_us(3); //添加5us
}
CS5532_DIN = 0;
// CS5532_CS = 1; //片选拉低
}
void CS5532W2Command1(unsigned char date)//cs5532写命令
{
unsigned char temp,i;
   temp = date;
  CS5532_SCLK = 0;  
  CS5532_CS = 0; 
CS5532_DIN = 0;///////////
     delay_us(1);
for(i=0; i<8; i++)
{
if((temp<<i)&0x80)
CS5532_DIN = 1; //如果为1写1
else
CS5532_DIN = 0;  //如果为0写0
delay_us(10);
CS5532_SCLK = 1;  
delay_us(190); //添加5us
CS5532_SCLK = 0;
delay_us(190); //添加5us
}
// CS5532_CS = 1; //片选拉低
}


void CS5532SoftwareReset(void)
{
unsigned char i;
CS5532_CS = 1;
delay_us(200); 
CS5532_CS = 0; 
delay_us(200); 

CS5532_DIN = 0;
CS5532_SCLK = 0; 

for(i=0;i<31; i++)  //
CS5532W2Command1(0xff);
CS5532W2Command(0xfe);
delay_ms(1000); 


CS5532W2Command(0x03);
CS5532W2Command(0x22);
CS5532W2Command(0x00);
CS5532W2Command(0x00);
CS5532W2Command(0x00);
delay_ms(1000); 
}
//读取CS5532的各大寄存器的值
unsigned long int ReadCS5532RegData(void)
{
unsigned char i;
  unsigned long int da;
CS5532_CS = 0; //片选拉低
CS5532_SCLK = 0; 

CS5532_DIN = 0;

delay_us(4); //添加5us  
for(i=0;i<32; i++)  //
{
CS5532_SCLK = 1; 
     da<<=1;           //读入数据,高位在前
da+=CS5532_DOUT;
CS5532_SCLK = 0;  
delay_us(12);   
  }
return da;
// CS5532_CS = 1; //片选释放
}
//读取CS5532的采样数据,为高24位
unsigned long int ReadCS5532SampData(void)
{
unsigned char i;
unsigned int da=0;
CS5532_CS = 0; 
CS5532_SCLK = 0; 
CS5532_DIN = 0;
da1=0;
delay_us(3); 

for(i=0;i<8;i++)            // 8 个清串口时钟
      { 
      CS5532_SCLK=1;    //时钟高   
    delay_us(24); 
      CS5532_SCLK=0;    //时钟低
      delay_us(24); 
      }

for(i=0;i<24; i++)  //
{
CS5532_SCLK = 1;  
     da<<=1;//读入数据,高位在前
da+=CS5532_DOUT;
     CS5532_SCLK = 0;  
    delay_us(24); //添加5us  
  }

for(i=0;i<8; i++)  //
{
     CS5532_SCLK = 1;  
da1<<=1;//读入数据,高位在前
da1+=CS5532_DOUT;
     CS5532_SCLK = 0;  
     delay_us(24); //添加5us  
  }
return da;
}




关键词: CS5532    

菜鸟
2014-03-17 18:12:55    评分
2楼
int main(void)
{


unsigned int Code,i;//24位,读取采样值
unsigned int Code1,Code2,Code3;
unsigned long int RegCode;//32位,读取寄存器值
unsigned long int RegCode1,RegCode2;//32位,读取寄存器值
delay_init();     //延时函数初始化  
bsp_InitUart(COM1,115200);
CS5532Initialization();  //CS5532硬件初始化GPIO


ADG509_A0 = 1;
ADG509_A1 = 1;

CS5532_CS = 0; //片选拉低
delay_ms(50);
CS5532SoftwareReset();   //CS5532软件复位
printf("CS5532驱动测试\r\n");
delay_ms(1);


//************************************************
//  系统软复位( CS5532_init() 包含该部分)

//  0x2A000400,RS=1,IS=1各通道输入在内部短接
//GB=0,将A0设置为正常的输出锁存引脚
//VRS=1,电压参考1V<Vref<2.5V
//A1,A0为00,OLS=0,低电平时通道设置寄存器作为A0A1的源
//OGS=0,按所有设置单元(Setup)中的CS1-CS2位选择校准寄存器
//FRS=0,第19位,使用缺省字速率
   CS5532W2Command(0x03);    // Soft Reset //写配置寄存器
   CS5532W2Command(0x2A); //  0x2A000400,RS=1,IS=1各通道输入在内部短接
   CS5532W2Command(0x00);
   CS5532W2Command(0x00);
   CS5532W2Command(0x00);


delay_ms(1000); 
    CS5532_DIN = 0;
  CS5532W2Command(0x0B);    // Read Config Reg  0000 1011
  RegCode= ReadCS5532RegData();/////读取的32位放到全局变量 RxdTxd4b[j]中
  printf("初始化后配置寄存器的值为:0x%X\r\n",RegCode);
CS5532W2Command(0x0B);    // Read Config Reg
  RegCode= ReadCS5532RegData();//参数没有意义
  printf("初始化后配置寄存器的值为:0x%X\r\n",RegCode);
delay_ms(1000); 
//////////////////////////////////////////////
//通道设置寄存器0x32340000即:0011 0010 0011 0100后面全是0
//CS1.2为00选择物理通道1
//G2.1.0为110增益为64为,单极性输入范围=[(Vref+)-(Vref-)]/64*a,VRS=1则A=1,VRS=0则A=2,有配置寄存器可知VRS=1
//WR3-0为0100,字速率为7.5Sps或者6.25Sps,由配置寄存器的FRS=0可知选用7.5Sps
//U/B=0,单极性模式
//OL1-0,为11,由于配置寄存器的OLS=0,所以片内逻辑输出有VA+与VA-供电,A0、A1=11
//DT=0,立即开始转换
//OCD=1,激活电流源(开路检测位)
//OG1.0=00,从物理通道1选用偏移和增益寄存器
   CS5532W2Command(0x05);    // Setup REG 0000 0101写通道设置寄存器1
CS5532W2Command(0x32);
   CS5532W2Command(0x34);
   CS5532W2Command(0x00);
   CS5532W2Command(0x00);
/////////////////////////////////////////////////////////////////////////
///0x40000000即0100 0000000.....000配置寄存器
//
printf("采样值中。。。\r\n");
  delay_ms(1000); 
   CS5532W2Command(0x03);    // Config ReG 0000 0011
   CS5532W2Command(0x40);
   CS5532W2Command(0x00);
   CS5532W2Command(0x00);
   CS5532W2Command(0x00);
printf("采样值中。。。\r\n");
delay_ms(1000); 
   CS5532W2Command(0x03);    // Config ReG 
   CS5532W2Command(0xC0);
   CS5532W2Command(0x00);
   CS5532W2Command(0x00);
   CS5532W2Command(0x00);
printf("采样值中。。。\r\n");
delay_ms(1000); 
   CS5532W2Command(0x03);    // Config ReG 
   CS5532W2Command(0x01);
   CS5532W2Command(0x80);
   CS5532W2Command(0x00);
   CS5532W2Command(0x00);
printf("采样值中。。。\r\n");
delay_ms(1000); 
   CS5532_CS=1;          // 未校准前转换
   CS5532W2Command(0x80);//执行单次转换Setup1 


   while(CS5532_DOUT) delay_us(1);
   delay_us(3);
   Code= ReadCS5532SampData();
   delay_us(4);
delay_ms(1000); 
 printf("采样值1:0x%X\r\n",Code);


  CS5532W2Command(0x85);    // 偏移校准
  while(CS5532_DOUT)  delay_us(4);
delay_ms(1000); 
//单次转换
//////////////////////////////////////////////////
for(i=0;i<5;i++)
 {
  CS5532_CS=1;
  delay_us(16);
  
CS5532W2Command(0x80);
  while(CS5532_DOUT)
  delay_us(4);
  Code1+=ReadCS5532SampData();
  delay_us(20); 
  }
  Code1=Code1/5;
printf("采样值2:0x%X\r\n",Code);

}

高工
2014-03-18 23:06:11    评分
3楼

1)检查硬件电路连线,短路虚焊什么的有木有

2)程序是用IO口模拟SPI,在读写函数结束部分CS是需要置1的,都给屏蔽了??

// CS5532_CS = 1; //片选释放


菜鸟
2014-03-19 17:33:23    评分
4楼
谢谢指导,首先我的CS5532W2Command()函数里面都是CS5532_CS = 0;的,就是说在使用的时候片选一直是低电平的,所以在片选逻辑上是没有问题的。大神的意思是说CS5532_CS平常应该为高电平屏蔽掉,在通信的时候才置低使能,就是在读写子涵数中首先CS5532_CS = 0,结束时CS5532_CS = 1;是吗?我试试,应该不可以,我之前是这样改过来的。。。

高工
2014-03-21 21:57:09    评分
5楼
传送一帧数据CS需要1--0---1,不能一直为0,SPI一般都这样,具体看手册上时序图,一帧数据可以是1个字节,也可以是n个字节,要看手册,不同的命令不一样

菜鸟
2019-05-20 19:49:32    评分
6楼

STM32+CS5532,供电:VA+=2.5V,VA-=-2.5V,VD+=5V,Vref=1.25V

IO模拟SPI,读SDO一直为高。程序见附录:


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]