ADI 技术
直播中

张虎豹

8年用户 1669经验值
私信 关注
[问答]

用dsPIC33F以SPI读取AD7606数据都为0

来自网友的提问:

小的是寫MIcrochip的dsPIC33FJ64GS606,並打算以SPI讀取AD7606-4的轉換值
但讀取到的值一直為0
也弄不清是接線問題還是程式問題
程式的話是照ADI網站上的程式碼範例改寫的
電路則是看datasheet上的serial mode條件所接的
線路圖和程式碼範例已上傳至附件
下面則是我所寫的程式碼
#include   "p33FJ64GS606.h"
#include   
#include  
#include
_FOSCSEL(FNOSC_FRC)  // Internal FRC with non PLL
_FOSC(FCKSM_CSECMD & OSCIOFNC_ON)   // Sw Enabled, Mon Disabled and OSCO pin has digital I/O function
_FWDT(FWDTEN_OFF)  // Watchdog Timer disabled
_FPOR(FPWRT_PWR128)   // POR Timer Value 128mSec
_FGS(GWRP_OFF)  // General Segment may be written
_FICD(ICS_PGD1 & JTAGEN_OFF);     // Use PGC1/EMUC1 and PGD1/EMUD1

unsigned char j, k;
unsigned int TempA, TempB, DoutA[3], DoutB[3];
unsigned char Busy;

int main(){


SPI2CON1 = 0x073B;
SPI2STAT = 0xA000;

// I/O Port設定,TRIS為設定資料流向(1:輸入 , 0:輸出)。Port為設定高、低電位(1:logic high , 0:logic low)
TRISGbits.TRISG9=0;
PORTGbits.RG9=1;//CS
TRISBbits.TRISB2=0;
PORTBbits.RB2=1;//CNVST
TRISBbits.TRISB3=0;
PORTBbits.RB3=0;//RESET
TRISGbits.TRISG6=0;
PORTGbits.RG6=1;//sck
TRISBbits.TRISB4=1;
PORTBbits.RB4=0;//doutA
TRISBbits.TRISB5=1;
PORTBbits.RB5=0;//doutB
TRISBbits.TRISB1=1;
PORTBbits.RB1=0;//busy
TRISBbits.TRISB8=0;
PORTBbits.RB8=1;//PAR/SER/BYTE SEL
TRISBbits.TRISB9=0;
PORTBbits.RB9=1;//STBY
TRISBbits.TRISB10=0;
PORTBbits.RB10=0;//RANGE
TRISBbits.TRISB11=0;
PORTBbits.RB11=1;//REF SELECT


while(1)
{
       PORTBbits.RB2=0;
Delay_1mS_Cnt;                                                                                                                                                      
        PORTBbits.RB2=1;
Delay_1mS_Cnt;

        Busy=PORTBbits.RB1;  
   while(Busy==1){
        Delay_1mS_Cnt;
        Busy=PORTBbits.RB1;
}
      PORTGbits.RG9=0;
       for(j=0; j<4; j++)
{
       TempA=0;
       TempB=0;

       for(k=0; k<16; k++){
         PORTGbits.RG6=0;
TempA=(TempA<<1) + LATBbits.LATB4;
TempB=(TempB<<1) + LATBbits.LATB5;
         LATGbits.LATG6=1;  
}
        DoutA[j]=TempA;
DoutB[j]=TempB;
}
       PORTGbits.RG9=1;
}
}

附件

回帖(3)

张博

2018-12-6 09:30:03
您好。
AD7606上电后需要一次复位操作。
硬件上,CONVST B也需要控制信号,和CONVST A 的时间需要满足t5的时间要求
举报

向可嘉

2018-12-6 09:46:54
引用: st94wo 发表于 2018-12-6 09:40
您好。
AD7606上电后需要一次复位操作。
硬件上,CONVST B也需要控制信号,和CONVST A 的时间需要满足t5的时间要求

adi_rock:
              您好,我给您发信件问的是关于ADE7878的问题,不知道是不是系统弄错了,我把问题重新给您发一遍:
 
       我现在正在进行电流有效值相关程序的测试,我配置了单片机的外部中断,当出现电流过零事件时,会触发单片机中断,在中断程序中,先清除中断标志,关闭全局中断,然后读取status1寄存器,写回status1,根据读出的数据判断是发生了哪一相电流的过零时间,然后再将相应的电流有效值读出,在中断程序最后,回复全局中断。
        在程序的运行过程中,我用示波器捕捉IRQ1上的输出信号,发现系统工作后,IRQ1上只输出了八十多个脉冲后就没有信号输出了,切IRQ1为低电平,好像ADE7878工作了一下之后又不工作了,调试程序也能发现相应的电流有效值读取程序只执行了八十多次,和IRQ1上捕捉的脉冲数一致。请问这种情况是如何产生的呢?
        初始化ADE7878的时候,对以下的寄存器进行了初始化:CONFIG、CFxDEN、CFMODE、COMPMODE、MMODE、PEAKCYC、ACMODE、LCYCMODE、MASK0、MASK1、GAIN、RUN,按照datasheet上的说法在向RUN寄存器写入0001之前,需要向初始化寄存器列表的最后一个寄存器连续写入三遍,是否是指对GAIN连续写入三遍,然后再写入RUN寄存器来启动DSP?
         希望得到您的帮助,谢谢。
 
 
 
 
frenkwang2002@163.com
 
发件人: adi_rock
发送时间: 2013-12-23 10:01
收件人: 东东 王
主题:  Re: 用dsPIC33F以SPI讀取AD7606數據都為0 -
中文技术支持
Re: 用dsPIC33F以SPI讀取AD7606數據都為0
created by adi_rock in 数据转换器专区 - 查看全部讨论
 
 
您好。
AD7606上电后需要一次复位操作。
硬件上,CONVST B也需要控制信号,和CONVST A 的时间需要满足t5的时间要求
通过回复电子邮件回复该消息 -或- 转到以下位置上的消息
 
如您想暂停对某个讨论的关注,请您点击该讨论帖并在右手菜单处点击“停止跟踪”。请您务必在登陆状态下进行设置。
在 数据转换器专区 内开始新讨论,通过 电子邮件 或在以下位置上:中文技术支持
举报

张博

2018-12-6 10:06:49
引用: 60user121 发表于 2018-12-6 09:57
adi_rock:
              您好,我给您发信件问的是关于ADE7878的问题,不知道是不是系统弄错了,我把问题重新给您发一遍:
 

您好。非常抱歉,系统把另一个回复转给了您。已经和您电话沟通过
举报

更多回帖

×
20
完善资料,
赚取积分