求关于CS5460电机测量的解决办法
#include "reg52.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Cs5460_clk =P2^3;
sbit Cs5460_cs =P2^1;
sbit Cs5460_sdi =P2^4;
sbit Cs5460_RET =P2^0;
sbit Cs5460_sdo =P2^2;
uchar buff[4],buff2[4],Irms,Vrms;//功率暂存器
void delay(uchar us)
{
for(;us>0;us--)
_nop_();
}
void InitZD( void )
{
TMOD=0x21;
TH1=0xfd;
TL1=0Xfd;
TR1=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
//向串口发送一个字符
void send_char(unsigned char ch)
{
SBUF=ch;
while (TI==0);
TI=0;
}
void Write_Cs5460_Byte(uchar temp)
{
uchar i;
Cs5460_clk=0;
for(i=0;i<8;i++)//循环8次,写入数据
{
Cs5460_clk=0;
Cs5460_sdi=(temp&0x80)>>7; //每次传输高字节
temp<<=1;
Cs5460_clk=1;
}
Cs5460_clk=0;
}
void Write_Cs5460(uchar *buff,uchar n)
{
uchar i;
Cs5460_cs=1;
delay(10);
Cs5460_clk=0;
delay(10);
Cs5460_cs=0;
delay(10);
for(i=0;i<n;i++)
{
Write_Cs5460_Byte(*(buff+i));
}
Cs5460_clk=0;
Cs5460_sdi=0;
Cs5460_cs=1;
}
uchar Read_Cs5460_Byte()
{
uchar i,tmp=0;
for(i=0;i<8;i++)
{
Cs5460_clk=0;
delay(2);
Cs5460_clk=1;
if(Cs5460_sdo) tmp|=0x01;tmp<<=1;
}
return tmp;
}
void Read_Cs5460(uchar address,uchar *buff)
{
uchar i;
Cs5460_cs=1;
delay(10);
Cs5460_clk=0;
delay(10);
Cs5460_cs=0;
delay(10);
Write_Cs5460_Byte(address);
Cs5460_sdi=1;
for(i=0;i<3;i++)
{
*(buff+i)=Read_Cs5460_Byte();
}
Cs5460_clk=0;
Cs5460_sdi=0;
Cs5460_cs=1;
}
void Init_Cs5460()
{
uchar buff[4];
Cs5460_RET=0;
delay(30000);//30ms
Cs5460_RET=1;
buff[0]=0xff;//SYNC1
buff[1]=0xff;//SYNC1
buff[2]=0xff;//SYNC1
buff[3]=0xfe;//SYNC0
Write_Cs5460(buff,4);//写同步
buff[0]=0x40;//写配置寄存器
buff[1]=0x01;//GI=1,电流通道增益=10
buff[2]=0x18;//中断形式:00高电平,08低电平,10下降沿,18上升沿
buff[3]=0x01;//DCLK=MCLK/1
Write_Cs5460(buff,4);
buff[0]=0x5e;//SYNC1
buff[1]=0xff;//SYNC1
buff[2]=0xff;//SYNC1
buff[3]=0xff;//SYNC0
Write_Cs5460(buff,4);//清状态寄存器
buff[0]=0x74;
buff[1]=0xff;
buff[2]=0xff;
buff[3]=0xff;
Write_Cs5460(buff,4);//写屏蔽中断寄存器
buff[0]=0x78;
buff[1]=0x00;
buff[2]=0x00;
buff[3]=0x00;
Write_Cs5460(buff,4);//写控制寄存器
buff[0]=0x4c;
buff[1]=0x00;
buff[2]=0x34;
buff[3]=0x9c;
Write_Cs5460(buff,4);//写EOUT脉冲输出寄存器
buff[0]=0x4a;
buff[1]=0x00;
buff[2]=0x01;
buff[3]=0x90;
Write_Cs5460(buff,4);//写CYCLE COUNT寄存器
buff[0]=0x44;//SYNC1
buff[1]=0x40;//SYNC1
buff[2]=0x00;//SYNC1
buff[3]=0x00;//SYNC0
Write_Cs5460(buff,4);//写电流增益寄存器
buff[0]=0x48;
buff[1]=0x40;//增益1
buff[2]=0x00;
buff[3]=0x00;
Write_Cs5460(buff,4);//写电压增益寄存器
Read_Cs5460(0x1e,buff2); //读状态寄存器
buff[3]=buff[2];
buff[2]=buff[1];
buff[1]=buff[0];
buff[0]=0x5e;
Write_Cs5460(buff,4);//写状态寄存器
buff[0]=0xe8;
Write_Cs5460(buff,1);//启动Cs5460,执行连续周期计算
}
void main()
{
Init_Cs5460();
InitZD();
while(1)
{
buff[0]=0x40;
buff[1]=0x01;
buff[2]=0x01;
buff[3]=0x01;
Write_Cs5460(buff,4);
Read_Cs5460(0x00,buff);
Vrms=buff[0];
send_char(Vrms);
}
}
void timer() interrupt 1
{
TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
读取数据都是0,有人说是时序问题,可是至今没找到解决办法,还望大虾指教
[解决办法]