本帖最后由 bmfw 于 2016-3-26 19:50 编辑
近日小弟用STC89C58RD+(系统时钟是11.0592MHz)单片机读写CS5460A,读出来的数据一直不对,不知道驱动程序哪里出了问题。麻烦各位大虾帮忙看看。
static void Delay2us()
{
nop();nop();
}
static void WriteCS5460Byte(unsigned char temp)
{
unsigned char i;
CS5460A_SCLK=0;
for (i=0;i<8;i++)//循环8次写入数据
{
CS5460A_SCLK=0;
if(temp&0x80){CS5460A_SDI=1;}
else{CS5460A_SDI=0;}
temp<<=1;//左移一位
//CS5460A_SDI=(temp&0x80)>>7;
CS5460A_SCLK=1;nop();
}
CS5460A_SCLK=0;
}
void WriteCS5460A(unsigned char *buff,unsigned char n)
{
unsigned char i;
CS5460A_SCLK=0;
CS5460A_CS_N=1;
Delay2us();
CS5460A_SCLK=1;
CS5460A_CS_N=0;
Delay2us();
CS5460A_SCLK=0;
Delay2us();
for(i=0;i<n;i++)
{
WriteCS5460Byte(*(buff+i));
}
nop();nop();
CS5460A_CS_N=1;
}
static unsigned char ReadCS5460Byte()
{
uchar i=0x00;
uchar j=0xfe;
uchar Byte=0x00;
bit bTemp;
for(i=0;i<8;i++)//循环8次写入数据
{
CS5460A_SDI=(bit)(j&0x80);
CS5460A_SCLK=1;Delay2us();
CS5460A_SCLK=0;Delay2us();
bTemp=CS5460A_SDO;
Byte=Byte|bTemp;
if(j!=7){Byte=Byte<<1;j=j<<1;};
}
return(Byte);
}
void CS5460A_Read(unsigned char address,unsigned char *buff)
{
unsigned char i;
CS5460A_SCLK=0;
CS5460A_CS_N=1;Delay1us(10);
CS5460A_CS_N=0;
WriteCS5460Byte(address);
for(i=0;i<3;i++)
{
*(buff+i)=ReadCS5460Byte();
}
CS5460A_CS_N=1;
CS5460A_SCLK=1;Delay2us();CS5460A_SCLK=0;
}
void test()
{
CS5460A_RST_N=0;//复位
Delay1ms(15);;//15ms至少10ms
CS5460A_RST_N=1;
buff[0]=0xff;//SYNC1
buff[1]=0xff;//SYNC1
buff[2]=0xff;//SYNC1
buff[3]=0xfe;//SYNC0
WriteCS5460A(buff,4);//写三个同步1和一个同步0
buff[0]=0x48;//电压增益寄存器写0x123456
buff[1]=0x12;
buff[2]=0x34;
buff[3]=0x56;
WriteCS5460A(buff,4);//电压通道增益寄存器
CS5460A_Read(0x08,buff);//读取电压增益寄存器的值,读出的数据一直不对
}
|