找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3096|回复: 2
打印 上一主题 下一主题
收起左侧

ADE7758 SPI读写问题

[复制链接]
跳转到指定楼层
楼主
ID:266943 发表于 2018-4-4 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想做一个ADE7758的SPI通信驱动程序,用的STVD软件库函数,模拟SPi读写ADE7758寄存器,程序如下:
void SPI_Write(unsigned char type,unsigned long int wdata,unsigned char databit)   
{   
    unsigned char loop = 0;   

    type = type & 0x7F;   
    type = type | 0x80;  
                GPIO_WriteLow(SCLK); //时钟
                GPIO_WriteLow(NCS); //片选信号
    for(loop = 0; loop < 8; loop++)   
    {   
                  GPIO_WriteHigh(SCLK);  
                        nop();   
                        if(type&0x80)
                    GPIO_WriteHigh(DIN);
      else        
                    GPIO_WriteLow(DIN);         
                  nop();   
                        GPIO_WriteLow(SCLK);   
                        nop();   
                        type = (type << 1);
                         nop();
    }//end of for()   
    delayus(10);
    for(loop = 0; loop < databit; loop++)   
    {   
      GPIO_WriteHigh(SCLK);   
                        nop();   
                        if(wdata&0x800000)//24位
                          GPIO_WriteHigh(DIN);
                  else        
                    GPIO_WriteLow(DIN);         
                        nop();   
                        GPIO_WriteLow(SCLK);   
                        nop();   
                        wdata = (wdata << 1);
                         nop();
                        
    }//end of for()   
     GPIO_WriteHigh(NCS);  
}//end of write7758()   

unsigned long SPI_Read(unsigned char type,unsigned char databit)   
{   
    unsigned char loop;   
    unsigned long  rtdata = 0;   
    type = type & 0x7F;   
    type = type | 0x00;  
                 GPIO_WriteLow(SCLK);
                  GPIO_WriteLow(NCS);
    for(loop = 0;loop < 8;loop ++)   
    {   
                  GPIO_WriteHigh(SCLK);   
      nop();   
      if(type&0x80)
                  GPIO_WriteHigh(DIN);
      else        
                  GPIO_WriteLow(DIN);        
      nop();   
      GPIO_WriteLow(SCLK);   
      nop();   
      type = (type << 1);
                         nop();
    }   
                delayus(10);   
    for(loop = 0;loop < databit;loop ++)   
    {                   rtdata = (rtdata << 1);
                        GPIO_WriteHigh(SCLK);   
      nop();   
         
      if(GPIO_ReadInputPin(DOUT))
                          rtdata |=0x01;   
      nop();   
      GPIO_WriteLow(SCLK);   
      nop();  
               
    }   
         GPIO_WriteHigh(NCS);
    return(rtdata);  
               
}//end of read7758()

同时读写3个电压增益寄存器,寄存器为有符号12位
    SPI_Write(0x24,0x055500,16);   //写相位A的电压增益寄存器   
    SPI_Write(0x25,0x055500,16);   //写相位B的电压增益寄存器   
    SPI_Write(0x26,0x055500,16);   //写相位C的电压增益寄存器   

    DATA[0]= SPI_Read(0x24,16);
    DATA[1]= SPI_Read(0x25,16);
    DATA[2]= SPI_Read(0x26,16);

仿真了一下得的结果不一样
DATA[0]=1365
DATA[1]=1195
DATA[2]=1365
A、C相数是对的,B相不对,读电流增益寄存器正好相反B相是对的,AC错了,是时序有问题还是其他原因,求帮助。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:287575 发表于 2018-4-4 18:09 | 只看该作者
SPI_Write(0x24,0x055500,16);   //写相位A的电压增益寄存器
if(wdata&0x800000)//24位
你到底是16位还是24位,ADE7758我没用,但类似的芯片都是24位,三个字节
应该是SPI_Write(0x24,0x055500,24);既然读写都是三字节,就没必要带形参了,直接SPI_Write(ADDR, DATA)
回复

使用道具 举报

板凳
ID:266943 发表于 2018-4-7 08:50 | 只看该作者
寄存器有8位、12位,16位,24位四种电压增益寄存器是12位,按照16位写,高位开始写,SPI_Write(0x24,0x055500,16)是向12位寄存器写入数值0x555,我对三个同类型寄存器进行写入读取操作,读出来结果不一样,就是想问问可能是什么原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表