打印

CS5532发送转换命令(0x80)后,SDO不变低

[复制链接]
3922|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Karlshen|  楼主 | 2009-11-16 22:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助:“CS5532发送转换命令(0x80)后,SDO不变低”各位大侠,请帮忙分析分析,不胜感激!


对CS5532的使用如下:
1. 硬件简单说明: V+=3V;V-=负3V;Ref+=3V;Ref-=负3V,晶振4.9152
2. 软件操作步骤说明
   1)上电后延时了50个ms(datasheet说超过20ms就可以)
   2)发送31个ff,1个fe,完成对端口复位
   3)发送命令03,bit RS=1,即数据0x20000000,复位内部逻辑
   4)等待读取配置寄存器,直到读出RV bit=1,即:数据0x10000000
   5)设置配置寄存器
   6)设置通道寄存器
   7)偏移,增益寄存器(下面的代码中没有,但是也测试过)
   8)发送数据转换指令0x80(datasheet说,不校准也可以直接转换,只是误差大而已)
   9)等待SDO=0
3. 问题描述:
   1)1-7个步骤正常,能够读出RV bit=1
   2)此外,也尝试过在第8个步骤之前,写入,读取配置,增益,偏移,通道寄存器,
      变化写入数据,发现读取数据和写入的一致,也侧面证明了CS5532工作基本正常
   3) 执行了步骤8以后,程序卡死在了步骤9
4. 以下是详细代码,请参考
sbit CS5532_SPI_DO = P1^0;
sbit CS5532_SPI_CS = P1^1;
sbit CS5532_SPI_CK = P1^2;
sbit CS5532_SPI_DI = P1^3;  

void CS5532Test(void)
{
  int i;
  unsigned char rec=0;
  unsigned char rec1,rec2,rec3,rec4;
  //reset port
  CS5532Delay(  50000  );
   
  CS5532_SPI_CK = 0;CS5532Delay(3);
  CS5532_SPI_CS = 0;CS5532Delay(3);
   
  //复位端口,datasheet上说最少15个ff和1个fe,不放心,用了31个ff
  //其中用15个ff也做过测试,效果和31个ff一样
  for( i = 0; i< 31; i++ )
    CS5532ByteSend( 0xff );
  CS5532ByteSend( 0xfe );
  //复位内部逻辑,发送指令03,数据是0x20000000
  CS5532Delay(  50000  );
  CS5532ByteSend( 0x03 );
  CS5532ByteSend( 0x20 );
  CS5532ByteSend( 0x00 );
  CS5532ByteSend( 0x00 );
  CS5532ByteSend( 0x00 );
  //等待复位(RV=1)完成,当读出值为0x10000000时候,复位完成
  while( rec != 0x10 )
  {
    CS5532ByteSend( 0x0b );
    rec = CS5532ByteRec( );
    CS5532ByteRec( );
    CS5532ByteRec( );
    CS5532ByteRec( );
  }
  //设置配置寄存器,V+,V-是正负3V,Ref电压是正负3V
  CS5532Delay(  100  );
  CS5532ByteSend( 0x03 );
  CS5532ByteSend( 0x00 );
  CS5532ByteSend( 0x00 );
  CS5532ByteSend( 0x00 );
  CS5532ByteSend( 0x00 );
  //设置通道寄存器
  CS5532Delay(  100  );
  CS5532ByteSend( 0x05 );
  CS5532ByteSend( 0x02 );
  CS5532ByteSend( 0x00 );
  CS5532ByteSend( 0x00 );
  CS5532ByteSend( 0x00 );
  //发送单词转换命令
  CS5532ByteSend( 0x80 );
  while( CS5532_SPI_DO == 1 );//等待SDO从1变成0
  CS5532ByteSend( 0x00 );     //清楚SDO flag
  rec1 = CS5532ByteRec( );    //读取32bit数据
  rec2 = CS5532ByteRec( );
  rec3 = CS5532ByteRec( );
  rec4 = CS5532ByteRec( );

}
void CS5532ByteSend( unsigned char ucData )
{
  int i;

  for( i = 0; i < 8; i++ )   
  {
    if( ucData & 0x80 )  
      CS5532_SPI_DI = 1;
    else
      CS5532_SPI_DI = 0;
    CS5532Delay(10);  
    CS5532_SPI_CK = 1;  
    CS5532Delay(10);  
    ucData = ucData << 1;  
    CS5532_SPI_CK = 0;  
    CS5532Delay(10);
  }   
  CS5532_SPI_DI = 0;
}

unsigned char CS5532ByteRec( void )
{
  int i;
  unsigned char ucData = 0;
   
  for( i = 0; i < 8; i++ )   
  {
    ucData = ucData << 1;  
    if( CS5532_SPI_DO )
      ucData = ucData | 0x01;
    else  
      ucData = ucData & 0xfe;  
    CS5532Delay(10);  
    CS5532_SPI_CK = 1;  
    CS5532Delay(10);  
    CS5532_SPI_CK = 0;  
    CS5532Delay(10);  
  }   
  return ucData;
}
void CS5532Delay( unsigned int i ) { while(i--); }
沙发
love_life| | 2009-11-17 00:02 | 只看该作者
帮顶

使用特权

评论回复
板凳
suoma| | 2009-11-17 14:01 | 只看该作者
:L,帮顶!

使用特权

评论回复
地板
li_g888| | 2009-11-18 22:45 | 只看该作者
去CSDN上下载一个cs5530的程序 ,基本上是一样的  这个不难写得

使用特权

评论回复
5
suoma| | 2009-11-26 21:59 | 只看该作者
看看

使用特权

评论回复
6
huamunv| | 2009-12-1 13:11 | 只看该作者
下载个正确的,再对照着写,出错少点

使用特权

评论回复
7
lovelyegle| | 2009-12-1 16:42 | 只看该作者
那专心就检查后面的程序

使用特权

评论回复
8
Karlshen|  楼主 | 2009-12-8 22:52 | 只看该作者
:L,还是谢谢了

使用特权

评论回复
9
guita| | 2010-6-13 22:09 | 只看该作者
加进去学习

使用特权

评论回复
10
huzhiyang| | 2013-7-23 19:34 | 只看该作者
你这个问题解决了吗?   我遇到跟你一样的问题了, 如果你的问题解决了,希望你帮帮我,非常感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

81

主题

734

帖子

1

粉丝