天天

ADE7753的驱动代码--doing

0
阅读(4809)

以下为ADE7753的驱动代码

//------------------------------------
//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;
    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; 
    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; 
    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;          //数据线置已知状态,为下一次的写命令准备。  
}  
ps:使用的是模拟SPI的方式,大部分SPI都是使用模拟的方式来实现与IC的通信。代码还在修改中