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

2020-02-01 16:15发布

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

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

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

  18.     delay_1us();
  19.         for(loop=0;loop<8;loop++)
  20.         {
  21.                 da=da<<1;
  22.                 ad_di=CY;
  23.                 ad_sck=1;

  24.                  delay_1us();
  25.                 ad_sck=0;

  26.         delay_1us();
  27.         }
  28. }
  29. /////从cs5532内部单元读出一个字节
  30. unsigned char ReadCs5532(void)  ///读a/d
  31. {
  32.         unsigned char loop,da;
  33.         ad_sck=0;

  34.         delay_1us();
  35.         for(loop=0;loop<8;loop++)
  36.         {
  37.                 da=da<<1;
  38.                 da=da|ad_do;
  39.                 ad_sck=1;

  40.                  delay_1us();
  41.                 ad_sck=0;

  42.                  delay_1us();
  43.         }
  44.         return(da);
  45. }

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

  54.     temp0=ReadCs5532();
  55.          temp1=ReadCs5532();
  56.           temp2=ReadCs5532();
  57.            temp3=ReadCs5532();
  58.          

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

  61. }

  62. unsigned long ReadCs5532_Reg(void)  ///读a/d转换寄存器中的值
  63. {
  64.     unsigned long temp;//返回值
  65.         tep5[0]=ReadCs5532();
  66.         tep5[1]=ReadCs5532();
  67.         tep5[2]=ReadCs5532();
  68.         tep5[3]=ReadCs5532();
  69.         temp=((unsigned long)tep5[0])<<24|((unsigned long)tep5[1])<<16|((unsigned long)tep5[2])<<8|((unsigned long)tep5[3]);
  70.         return temp;
  71. }
  72. void InitCs5532(void)     ///a/d初始化
  73. {
  74.         unsigned char loop;//配置寄存器中的32位数据
  75.         

  76.         ad_do=1;
  77.         ad_di=0;
  78.         ad_sck=0;
  79.     delay_10ms(2);

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

  85.         for (loop=0;loop<5;loop++)          //写入复位命令
  86.         {
  87.                 WriteCs5532(mtb_1[loop]);
  88.         }
  89.         
  90.         WriteCs5532(0x0b); //读配置寄存器
  91.         if(ReadCs5532_Reg()==0x10000000)//验证是否复位成功
  92.         {
  93.         PutString(0,18,"rest is ok!");

  94.         }
  95.         else
  96.         {
  97.         PutString(0,18,"rest is wrong!");
  98.         }
  99.         WriteCs5532(0x03);//写配置寄存器
  100.         WriteCs5532(0x00);//
  101.         WriteCs5532(0x08);
  102.         WriteCs5532(0x00);
  103.         WriteCs5532(0x00);


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

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

  110.         }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
JACK847070222
1楼-- · 2020-02-01 17:49
支持,咱俩的问题一样,初始化成功,但读回的数据溢出,等回答
JACK847070222
2楼-- · 2020-02-01 18:06
兄弟,电源接的有问题吧,我的解决了
苏子木00
3楼-- · 2020-02-01 23:53
请问我用cs5530和你们5532用法一样吗?或者告诉我下这两者的区别
673104326
4楼-- · 2020-02-02 02:54
首先验证一下SPI接口通信是否正常,一定要保定最基本的东西是对的。内部应该有一些默认的参数,读回来看看能不能对上,如果不能对上那就是通信接口有问题。

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

CS5532,价钱也不便宜,功耗也高,只是一个ADC芯片,供电电流都需要十几mA。外围电路要多累赘有多累赘,但还是有那么多人用。

一周热门 更多>