haolaishi 发表于 2013-1-22 22:25:46

CS5532读数据不成功,寻求原因

本帖最后由 haolaishi 于 2013-1-22 22:30 编辑

单片机用的STC12C5A60S2,1T的单片机,现已验证5532复位成功,但是读取AD值时都为ff?
现在有几个疑问
1.5532只有一个数据存储寄存器,可是有两个通道,如何确定所读数值是哪一通道的呢?
2.通道设置寄存器setup的作用,如何对应物理通道呢?
3.数据存储寄存器是否有8bit的读命令,如何读取呢?
如果有哪位前辈用过5532,求指教,下面附上程序。。。/**************************************
;WWW.STCMCU.COM
;Mobile:13922805190
;0755-82948412
AT24C04测试程序
主芯片: STC12C5A60S2 (1T)
工作频率: 12.000MHz
**************************************/
#include "cs5532.h"

mtb_1={0x03,0x22,0x00,0x00,0x00};//0x03写配置寄存器0x20选择复位,参考电压选择2.5~VA+,其余默认   复位AD,并配置功能
unsigned char xdata tep5={0};
unsigned char xdata tep4={0};
//////写一个字节数据到5532
void WriteCs5532(unsigned char da)   
{   
      unsigned char loop;
      ad_sck=0;

    delay_1us();
      for(loop=0;loop<8;loop++)
      {
                da=da<<1;
                ad_di=CY;
                ad_sck=1;

               delay_1us();
                ad_sck=0;

      delay_1us();
      }
}
/////从cs5532内部单元读出一个字节
unsigned char ReadCs5532(void)///读a/d
{
      unsigned char loop,da;
      ad_sck=0;

      delay_1us();
      for(loop=0;loop<8;loop++)
      {
                da=da<<1;
                da=da|ad_do;
                ad_sck=1;

               delay_1us();
                ad_sck=0;

               delay_1us();
      }
      return(da);
}

unsigned long ReadCs5532_ADvalue(void)///读a/d转换寄存器中的值    此段即读AD值得程序,有疑问?
{
    unsigned char i;
      unsigned long temp0=0,temp1=0,temp2=0,temp3=0,reg=0;
    for(i=0;i<8;i++)
    {
      WriteCs5532(0xff);
    }

    temp0=ReadCs5532();
         temp1=ReadCs5532();
          temp2=ReadCs5532();
         temp3=ReadCs5532();
         

         reg=temp0<<24|temp1<<16|temp2<<8|temp3;
                   return reg>>11;

}

unsigned long ReadCs5532_Reg(void)///读a/d转换寄存器中的值
{
    unsigned long temp;//返回值
      tep5=ReadCs5532();
      tep5=ReadCs5532();
      tep5=ReadCs5532();
      tep5=ReadCs5532();
      temp=((unsigned long)tep5)<<24|((unsigned long)tep5)<<16|((unsigned long)tep5)<<8|((unsigned long)tep5);
      return temp;
}
void InitCs5532(void)   ///a/d初始化
{
      unsigned char loop;//配置寄存器中的32位数据
      

      ad_do=1;
      ad_di=0;
      ad_sck=0;
    delay_10ms(2);

      for (loop=0;loop<31;loop++)//初始化,写15个字节SYNC1
    {
               WriteCs5532(0xff);
    }      
      WriteCs5532(0xfe);      //写一个字节的SYNC0

      for (loop=0;loop<5;loop++)          //写入复位命令
      {
                WriteCs5532(mtb_1);
      }
      
      WriteCs5532(0x0b); //读配置寄存器
      if(ReadCs5532_Reg()==0x10000000)//验证是否复位成功
      {
      PutString(0,18,"rest is ok!");

      }
      else
      {
      PutString(0,18,"rest is wrong!");
      }
      WriteCs5532(0x03);//写配置寄存器
      WriteCs5532(0x00);//
      WriteCs5532(0x08);
      WriteCs5532(0x00);
      WriteCs5532(0x00);


    WriteCs5532(0x05);// 写通道设置寄存器         **通道设置寄存器,有疑问?
      WriteCs5532(0x40);//物理通道2,增益1
      WriteCs5532(0x80);//通道2的偏移和增益
      WriteCs5532(0x40);
      WriteCs5532(0x80);

      WriteCs5532(0xc0); //执行转换命令 向CS5532中写入启动A/D连续转换   (8位串口命令)

      }

JACK847070222 发表于 2013-1-24 10:13:54

支持,咱俩的问题一样,初始化成功,但读回的数据溢出,等回答

JACK847070222 发表于 2013-1-29 10:41:23

兄弟,电源接的有问题吧,我的解决了

苏子木00 发表于 2013-1-29 10:46:32

请问我用cs5530和你们5532用法一样吗?或者告诉我下这两者的区别

673104326 发表于 2013-1-29 10:59:12

首先验证一下SPI接口通信是否正常,一定要保定最基本的东西是对的。内部应该有一些默认的参数,读回来看看能不能对上,如果不能对上那就是通信接口有问题。

然后再看看外围电路的接法是不是正确, 正负12V,5V,参考电压等。有一次我的供电电压没接对,也直接导致不能正常读出数据。

CS5532,价钱也不便宜,功耗也高,只是一个ADC芯片,供电电流都需要十几mA。外围电路要多累赘有多累赘,但还是有那么多人用。
页: [1]
查看完整版本: CS5532读数据不成功,寻求原因