ADE7753的驱动代码--doing
0赞
发表于 8/23/2011 5:59:38 PM
阅读(4809)
以下为ADE7753的驱动代码
//------------------------------------
//fun: 向ADE7753中写入一个字节,命令或数据
//------------------------------------
void ADE7753_WriteByte(u8 val)
{
u8 i;
//fun: 向ADE7753中写入一个字节,命令或数据
//------------------------------------
void ADE7753_WriteByte(u8 val)
{
u8 i;
for(i=0;i<8;i++)
{
SCLK=1;
DIN=0x80 & val;
SCLK=0;
val<<=1;
}
}
//------------------------------------
//fun: 从ADE7753中读取一个字节,状态或数据
//------------------------------------
u8 ADE7753_ReadByte(void)
{
u8 i,j,val;
{
SCLK=1;
DIN=0x80 & val;
SCLK=0;
val<<=1;
}
}
//------------------------------------
//fun: 从ADE7753中读取一个字节,状态或数据
//------------------------------------
u8 ADE7753_ReadByte(void)
{
u8 i,j,val;
val=0;
for(i=0;i<8;i++)
{
val<<=1;
SCLK=1;
j=DOUT;
SCLK=0;
val=val|j;
}
return val;
}
//------------------------------------
//fun: 从ADE7753中读取数据,可以是1~3个字节,由读取的寄存器决定。
//in: chipsel :指定读取ADE7753的片选
// reg_name 要读取的寄存器名称既地址
//------------------------------------
u32 ADE7753_Read(u8 chipsel,u8 reg_name) //读取1~3个字节
{
Val_Reg data value_reg;
char i;
for(i=0;i<8;i++)
{
val<<=1;
SCLK=1;
j=DOUT;
SCLK=0;
val=val|j;
}
return val;
}
//------------------------------------
//fun: 从ADE7753中读取数据,可以是1~3个字节,由读取的寄存器决定。
//in: chipsel :指定读取ADE7753的片选
// reg_name 要读取的寄存器名称既地址
//------------------------------------
u32 ADE7753_Read(u8 chipsel,u8 reg_name) //读取1~3个字节
{
Val_Reg data value_reg;
char i;
i=get_len[reg_name]; //取得需要读取的字节数
CS_ADE7753=chipsel; //片选使能
ADE7753_WriteByte(reg_name); //将地址写入通讯寄存器
switch(i){
case 3:
value_reg.rddata[1]=ADE7753_ReadByte(); //最高字节
value_reg.rddata[2]=ADE7753_ReadByte();
value_reg.rddata[3]=ADE7753_ReadByte();
break;
case 2: //低字节
value_reg.rddata[0]=ADE7753_ReadByte();
value_reg.rddata[1]=ADE7753_ReadByte();
break;
case 1:
value_reg.rddata[0]=ADE7753_ReadByte();
break;
}
CS_ADE7753=0xff; //片选失效
SCLK=1;
DIN=1; //数据线置已知状态,为下一次的写命令准备。
switch(i){
case 3:
if(value_reg.rddata[1]&0x80){ //处理符号位
value_reg.rddata[0]=0xff;
}else{
value_reg.rddata[0]=0x00;
}
return value_reg.u32_val;
case 2:
return value_reg.u16_val;
case 1:
return value_reg.char_val;
break;
}
return 0;
}
//------------------------------------
//fun: 向ADE7753中写入数据,可以是1~2个字节,由写入的寄存器决定。
//in: chipsel--指定写入的ADE7753片选
// reg_name--要写入的寄存器名称既地址
// dd--写入的数据
//------------------------------------
void ADE775_Write(u8 chipsel,u8 reg_name,u16 dd) //读取1~2个字节
{
Val_Reg data value_reg;
char i;
CS_ADE7753=chipsel; //片选使能
ADE7753_WriteByte(reg_name); //将地址写入通讯寄存器
switch(i){
case 3:
value_reg.rddata[1]=ADE7753_ReadByte(); //最高字节
value_reg.rddata[2]=ADE7753_ReadByte();
value_reg.rddata[3]=ADE7753_ReadByte();
break;
case 2: //低字节
value_reg.rddata[0]=ADE7753_ReadByte();
value_reg.rddata[1]=ADE7753_ReadByte();
break;
case 1:
value_reg.rddata[0]=ADE7753_ReadByte();
break;
}
CS_ADE7753=0xff; //片选失效
SCLK=1;
DIN=1; //数据线置已知状态,为下一次的写命令准备。
switch(i){
case 3:
if(value_reg.rddata[1]&0x80){ //处理符号位
value_reg.rddata[0]=0xff;
}else{
value_reg.rddata[0]=0x00;
}
return value_reg.u32_val;
case 2:
return value_reg.u16_val;
case 1:
return value_reg.char_val;
break;
}
return 0;
}
//------------------------------------
//fun: 向ADE7753中写入数据,可以是1~2个字节,由写入的寄存器决定。
//in: chipsel--指定写入的ADE7753片选
// reg_name--要写入的寄存器名称既地址
// dd--写入的数据
//------------------------------------
void ADE775_Write(u8 chipsel,u8 reg_name,u16 dd) //读取1~2个字节
{
Val_Reg data value_reg;
char i;
i=get_len[reg_name]; //取得需要读取字节数
value_reg.u16_val=dd;
CS_ADE7753=chipsel; //片选使能
ADE7753_WriteByte(0x80|reg_name); //将地址写寄存器
switch(i){
case 2:
ADE7753_WriteByte(value_reg.rddata[0]);
ADE7753_WriteByte(value_reg.rddata[1]);
break;
case 1:
ADE7753_WriteByte(value_reg.rddata[0]);
break;
}
CS_ADE7753=0xff; //片选失效
SCLK=1;
DIN=1; //数据线置已知状态,为下一次的写命令准备。
}
value_reg.u16_val=dd;
CS_ADE7753=chipsel; //片选使能
ADE7753_WriteByte(0x80|reg_name); //将地址写寄存器
switch(i){
case 2:
ADE7753_WriteByte(value_reg.rddata[0]);
ADE7753_WriteByte(value_reg.rddata[1]);
break;
case 1:
ADE7753_WriteByte(value_reg.rddata[0]);
break;
}
CS_ADE7753=0xff; //片选失效
SCLK=1;
DIN=1; //数据线置已知状态,为下一次的写命令准备。
}
ps:使用的是模拟SPI的方式,大部分SPI都是使用模拟的方式来实现与IC的通信。代码还在修改中
