|
发表于 2011-8-1 13:19:36
|
显示全部楼层
求助-我的CS5460A读出寄存器的数据一直是0????
![](http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_663129JY5T4O.jpg)
(原文件名:5460硬件图.jpg)
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char read[3];//功率暂存器
uchar code table[]= "I=";
//lcd管脚定义
#define LCDIO P0 //P0口LCD数据线
sbit rs=P2^7;
sbit rd=P2^6;
sbit lcden=P2^5;
//以下是cs5460的管脚定义:
sbit INT=P3^2;
sbit Cs5460_cs=P1^7;
sbit Cs5460_RET=P1^3;
sbit Cs5460_sdo=P1^2;
sbit Cs5460_clk=P1^1;
sbit Cs5460_sdi=P1^0;
//以下是cs5460的函数声明
void Write_Cs5460_Byte(unsigned char temp);
void Write_Cs5460(unsigned char *write,unsigned char n);
unsigned char Read_Cs5460_Byte();
void Read_Cs5460(unsigned char address,unsigned char *read1);
/******************************
原型:void delay(uint n)
行参:uint n
返回值:无
功能:延时n ms
*****************************/
void _delay(uint n)
{
uint x,y;
for(x=n;x>0;x--)
for(y=115;y>0;y--);//12Mhz时延时1MS//
}
void delay1(uint n)
{
uint x,y;
for(x=n;x>0;x--)
for(y=2;y>0;y--);//12Mhz时延时1uS//
}
//LCD函数声明
void write_com(uchar com) //lcd写命令函数
{
rs=0;
rd=0;
lcden=0;
P0=com;
_delay(2);
lcden=1;
_delay(2);
lcden=0;
}
void write_date(uchar date) //lcd写命数据函数
{
rs=1;
rd=0;
lcden=0;
P0=date;
_delay(2);
lcden=1;
_delay(2);
lcden=0;
}
void initLCD() //lcd初始化函数
{
uint num;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
_delay(5);
write_com(0x80); //lcd在第一行第一个位置开始显示
for(num=0;num<2;num++)
{
write_date(table[num]); //显示‘I=’
_delay(1);
}
}
void display(uchar *x_date) //参数显示
{
uchar t=0x82,a,i;
uchar temp1,temp2;
for(i=0;i<3;i++)
{
a=x_date;
temp1=a; //temp1为待显示的十六进制数 @@@@这里buff[0]只是高两位的电流值@@@@//
temp1 = (temp1 >>4) & 0x0F;//先显示高4位
if(temp1 < 0x0A) //0-9时
{
temp1 = temp1 + 0x30;
}
else temp1 = temp1 + 0x37;//a-f时
write_com(t);
write_date(temp1);
_delay(50);
temp2=a; //temp1为待显示的十六进制数
temp2 = temp2 & 0x0F;//显示低4位
if(temp2 < 0x0A) //0-9时
{
temp2 = temp2 + 0x30;
}
else temp2 = temp2 + 0x37;//a-f时
write_com(t+1);
write_date(temp2);
_delay(500);
t=t+3;
}
}
////////////CS5460声明//////////////////////
void Write_Cs5460_Byte(unsigned char temp) //写入一个字节
{
unsigned char i;
Cs5460_clk=0;
for(i=0;i<8;i++) //循环8次 写入数据
{
Cs5460_clk=0;
Cs5460_sdi=(bit)(temp&0x80); //每次传输高字节
Cs5460_clk=1;
temp<<=1;
}
Cs5460_clk=0;
}
//******可选择写入一个命令字或者读寄存器名后加三个字节的内容****//
void Write_Cs5460(unsigned char *write,unsigned char n)
{
unsigned char i;
Cs5460_cs=1;
delay1(2);
Cs5460_clk=0;
delay1(2);
Cs5460_cs=0;
for(i=0;i<n;i++)
{
Write_Cs5460_Byte(*(write+i));
}
Cs5460_clk=0;
delay1(2);
Cs5460_cs=1;
}
//**********读出一个字节***********//@@@@@@@@@有问题@@@@@@@@@@@//
unsigned char Read_Cs5460_Byte()
{
unsigned char i,tmp,read_data;
bit c_temp,a;
tmp = 0xfe;
Cs5460_clk=0;
for(i=0;i<8;i++) //循环8次 写入数据
{
Cs5460_clk=0;
Cs5460_sdi=(bit)(tmp&0x80);
a=Cs5460_sdi;
c_temp = Cs5460_sdo;
read_data = read_data|c_temp;
tmp = tmp<<1;
if(i!=7)
{
read_data = read_data<<1;
}
Cs5460_clk=1;
}
Cs5460_clk=0;
return(read_data);
}
//上一段改为
//**************************************************************//
/*unsigned char Read_Cs5460_Byte()
{
unsigned int i,tmp=0;
for(i=0;i<7;i++) //循环8次 写入数据
{
Cs5460_clk=0;
_delay(2);
Cs5460_sdi=1; //发送SYS0同步命令0xFE高7位
Cs5460_clk=1;
if(Cs5460_sdo) tmp|=0x80>>i;
}
i=7;
Cs5460_clk=0;
_delay(2);
Cs5460_sdi=0; //发送SYS0同步命令0xFE最低位
Cs5460_clk=1;
if(Cs5460_sdo) tmp|=0x80>>i;
return(tmp);
}
*/
//************************************************************//
void Read_Cs5460(unsigned char address,unsigned char *read1)
{
unsigned char i;
Cs5460_cs=1;
delay1(2);
Cs5460_clk=0;
delay1(2);
Cs5460_cs=0;
//static unsigned char tmp[4],k=0;
Write_Cs5460_Byte(address);
for(i=0;i<3;i++)
{
*(read1+i)=Read_Cs5460_Byte();
}
Cs5460_clk=0;
delay1(2);
Cs5460_cs=1;
}
//*************CS5460初始化函数*********//
void Init_Cs5460()
{
unsigned char buff1[4];
Cs5460_cs=0;
delay1(2);
Cs5460_RET=0;
_delay(30); //复位30ms
Cs5460_RET=1;
_delay(50);
buff1[0]=0xff;//SYNC1
buff1[1]=0xff;//SYNC1
buff1[2]=0xff;//SYNC1
buff1[3]=0xff;//SYNC0
Write_Cs5460(buff1,4);//写串口初始化//
buff1[0]=0xff;//SYNC1
buff1[1]=0xff;//SYNC1
buff1[2]=0xff;//SYNC1
buff1[3]=0xfe;//SYNC0
Write_Cs5460(buff1,4);//写串口初始化//
buff1[0]=0x40;//写配置寄存器
buff1[1]=0x00;//GI=0 电流通道增益=10
buff1[2]=0x18;//中断形式:00-高电平 08-低电平 10-下降沿 18-上升沿
buff1[3]=0xe1;//DLCK=MCLK/1
Write_Cs5460(buff1,4);
buff1[0]=0x5e;
buff1[1]=0xff;
buff1[2]=0xff;
buff1[3]=0xff;
Write_Cs5460(buff1,4);//清状态寄存器
buff1[0]=0x74;
buff1[1]=0x00;
buff1[2]=0x00;
buff1[3]=0x00;
Write_Cs5460(buff1,4);//写屏蔽中断寄存器
buff1[0]=0x78;
buff1[1]=0x00;
buff1[2]=0x00;
buff1[3]=0x00;
Write_Cs5460(buff1,4);//写控制寄存器
/*
buff1[0]=0x4c;
buff1[1]=0x00;
buff1[2]=0x34;
buff1[3]=0x9c;
Write_Cs5460(buff1,4);//写EOUT脉冲输出寄存器
_delay(50);
*/
buff1[0]=0x4A;
buff1[1]=0x00;
buff1[2]=0x0F;
buff1[3]=0xA0; //每秒计算1次,N=4000
Write_Cs5460(buff1,4);//写CYCLE COUNT寄存器
buff1[0]=0x44;
buff1[1]=0x40;//增益1
buff1[2]=0x00;
buff1[3]=0x00;
Write_Cs5460(buff1,4);//写电流增益寄存器
buff1[0]=0x48;
buff1[1]=0x40;//增益1
buff1[2]=0x00;
buff1[3]=0x00;
Write_Cs5460(buff1,4);//写电压增益寄存器
Read_Cs5460(0x1e,read);//读状态寄存器
//_delay(50);
buff1[3]=read[2];
buff1[2]=read[1];
buff1[1]=read[0];
buff1[0]=0x5e;
Write_Cs5460(buff1,4);//写状态寄存器
buff1[0]=0xe8;
Write_Cs5460(buff1,1);//启动Cs5460,执行连续周期计算
}
void main()
{
//long I;//U,P;
//unsigned char ret6,ret5,ret4,ret3,ret2,ret1;//定义位的值
initLCD();
_delay(70);
Init_Cs5460();
//Read_Cs5460(0x12,buff);//读取上次功率值
//Read_Cs5460(0x14,buff);//读取上次能量值
//Read_Cs5460(0x16,buff);//读取上次电流有效值
//Read_Cs5460(0x18,buff);//读取上次电压有效值
/******************************************************此处老师看一下转化有没有问题
I=0; //后面的乘10取整还没有写
I=buff[0];
I=I<<8;
I=I+buff[1];
I=I<<8;
I=I+buff[2];//六位十六进制数
ret6=I/0x100000; //取出十万位的值,注意0x100000是个十六进制数
I=I<<4; //I变量左移四位
ret5=I/0x100000; //取出位的值
I=I<<4; //I变量左移四位
ret4=I/0x100000; //取出位的值
I=I<<4; //I变量左移四位
ret3=I/0x100000;
I=I<<4; //I变量左移四位
ret2=I/0x100000; //取出位的值
I=I<<4; //I变量左移四位
ret1=I/0x100000; //取出位的值
I=ret6*pow(16,-1)+ret5*pow(16,-2)+ret4*pow(16,-3)+ret3*pow(16,-4)+ret2*pow(16,-5)+ret1*pow(16,-6);
//各位的值乘以位权,完成十六转十进制
**********************************************************************************/
while(1)
{
Read_Cs5460(0x0E,read);//读取上次电流值
_delay(50);
display(read);
}
/*
Read_Cs5460(0x10,buff);//读取上次电压值
*/
} |
|