打印

求助:“CS5532发送转换命令(0x80)后,SDO不变低”的问题

[复制链接]
2164|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hmilyxia|  楼主 | 2009-11-13 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hmilyxia 于 2009-11-13 11:34 编辑

各位大侠,请帮忙分析分析,不胜感激!
对CS5532的使用如下:
1. 硬件简单说明: V+=3V;V-=负3V;Ref+=3V;Ref-=负3V,晶振4.9152
2. 软件操作步骤说明
   1)上电后延时了50个ms(datasheet说超过20ms就可以)
   2)发送31个ff,1个fe,完成对端口复位
   3)延时50ms后,发送命令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--); }

相关帖子

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

本版积分规则

1

主题

1

帖子

1

粉丝