求助:“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--); } |