Post Go back to editing

数模芯片AD5383使用中遇到的问题

ADI工程师:

    您好!最近购买了你们数模芯片AD5383和其他别的芯片(共计几千元,用于新项目的研发中),在使用AD5383中,数据无法更新,发现LOAD引脚上电就是高电平,那我还怎么把它置低写入数据呢,我使用的是SPI通信,目前卡在这个地方了,数据无法加载到输出引脚,很是苦恼,还希望你们能够提供技术支持 ,谢谢了!

    可以读芯片寄存器中的数据(已实现)!

//IO操作函数 

#define SPI_SYNC    PEout(0) //SYNC

#define SPI_SCLK  PEout(1) //SCLK

#define SPI_DIN  PEout(2) //DIN

#define SPI_SDA   PEin(3)  //输入SDA

#define SPI_LDAC   PFout(0)  //LDAC

AD5383程序如下:

/********************************************************************************
Function that writes to the AD5380 via the SPI port.
********************************************************************************/


void WriteToAD5380ViaSpi(int32_t RegisterData)
{

long int ValueToWrite = RegisterData;
int i;

// SPI start

SPI_SYNC=1;
delay_us(1);
SPI_SYNC=0;  //bring SYNC low
delay_us(1);

//Write out the ControlWord

for(i=0; i<24; i++)
{
  SPI_SCLK=1;
  delay_us(1);
  if(0x800000 == (ValueToWrite & 0x800000))
  {
   SPI_DIN=1;   //Send one to DIN pin
  }
  else
  {
   SPI_DIN=0;   //Send zero to DIN pin
  }
  delay_us(1);
  SPI_SCLK=0;
  delay_us(1);
  ValueToWrite <<= 1; //Rotate data
  delay_us(1);

}
 

    // SPI ends


SPI_SYNC=1;
   delay_us(5);

}


/********************************************************************************
Function that read from the AD5380 via the SPI port.
********************************************************************************/


void ReadFromAD5380ViaSpi(int32_t *RegisterData)
{


unsigned int     i = 0;
unsigned int   iTemp = 0;
unsigned long   RotateData = 0;

unsigned long   Noop = NOP;

// SPI start

SPI_SYNC=1;
delay_us(1);
SPI_SYNC=0;  //bring SYNC low
delay_us(1);

for(i=0; i<24; i++)
{
  SPI_SCLK=1;
  delay_us(1);
//////////////////////////////////////////////////
if(0x800000 == (Noop & 0x800000))
  {
   SPI_DIN=1;   //Send one to SDI pin
  }
  else
  {
   SPI_DIN=0;   //Send zero to SDI pin
  }
//////////////////////////////////////////////////

  SPI_SCLK=0;
  delay_us(1);
   
  iTemp = SPI_SDA;   //Read DIN of AD5383, PE3
  RotateData <<= 1;
 
  if(iTemp==0X01 )
  {

   RotateData |= 1;
  
  }
 
  Noop <<= 1;
      delay_us(5);
}

 
      
    // SPI ends

SPI_SYNC=1;

    delay_us(2);
*RegisterData=RotateData;

}


void ComPortsToPC(int32_t buf)
{
unsigned char tx[3] = {0,0,0};
  u8 t;
    tx[2] = ((buf)&0xFF0000)>>16;
    tx[1] = ((buf)&0x00FF00)>>8;
    tx[0] = (buf)&0x000000FF;
   for(t=0;t<3;t++)
   {
    USART_SendData(USART1, tx[t]);         //向串口1发送数据
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
   }
  
 
}

主程序如下:

main()

{

AD5383_Init();

SPI_LDAC=1;

delay_us(1);

//-------------------------------------------------------------------------------------

//Enable monitor and internal REF to 1.25v and select power down mode that is 100k_GND

//-------------------------------------------------------------------------------------

cstr = Write | Special_Function_Register | Control_Register  |Internal_REF_Enabled | Internal_REF_1_25 | PowerDown_100K_toGND| toggle_0_7;

WriteToAD5380ViaSpi(cstr);

delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout0   |0x000FFF;  //Vout3 IS 0.6V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout1   | 0x000FFF;  //Vout3 IS 0.6V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout2   | 0x000FFF;  //Vout3 IS 0.6V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

  cstr = Write | Input_Data_Register | Channel_Vout3   | 0x000FFF;  //Vout3 IS 0.6V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout4   | 0x002000;  //Vout3 IS 1.2V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout5   | 0x000FFF;  //Vout3 IS 1.2V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout6   | 0x003FFF;  //Vout3 IS 2.4V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout7   | 0x000FFF;  //Vout3 IS 2.4V
WriteToAD5380ViaSpi(cstr);
delay_us(1);


SPI_LDAC=0;
  delay_us(1);
//delay(2);
SPI_LDAC=1;
delay_us(1);
//delay(2);

while(1)

{

  LED0=!LED0;   //闪烁LED,提示系统正在运行.

  LED1=!LED1;   //闪烁LED,提示系统正在运行.

  delay_ms(500);

cstr = Read | Special_Function_Register | Control_Register; // readback control register data

   WriteToAD5380ViaSpi(cstr);                    

   ReadFromAD5380ViaSpi(&buf);   //Read select register, using two instruction cycles

  ComPortsToPC(buf);

}

}

Reply on Sep 29, 2015 5:00 AM

//IO操作函数 

#define SPI_SYNC    PEout(0) //SYNC

#define SPI_SCLK  PEout(1) //SCLK

#define SPI_DIN  PEout(2) //DIN

#define SPI_SDA   PEin(3)  //输入SDA

#define SPI_LDAC   PFout(0)  //LDAC

AD5383程序如下:

/********************************************************************************
Function that writes to the AD5380 via the SPI port.
********************************************************************************/


void WriteToAD5380ViaSpi(int32_t RegisterData)
{

long int ValueToWrite = RegisterData;
int i;

// SPI start

SPI_SYNC=1;
delay_us(1);
SPI_SYNC=0;  //bring SYNC low
delay_us(1);

//Write out the ControlWord

for(i=0; i<24; i++)
{
  SPI_SCLK=1;
  delay_us(1);
  if(0x800000 == (ValueToWrite & 0x800000))
  {
   SPI_DIN=1;   //Send one to DIN pin
  }
  else
  {
   SPI_DIN=0;   //Send zero to DIN pin
  }
  delay_us(1);
  SPI_SCLK=0;
  delay_us(1);
  ValueToWrite <<= 1; //Rotate data
  delay_us(1);

}
 

    // SPI ends


SPI_SYNC=1;
   delay_us(5);

}


/********************************************************************************
Function that read from the AD5380 via the SPI port.
********************************************************************************/


void ReadFromAD5380ViaSpi(int32_t *RegisterData)
{


unsigned int     i = 0;
unsigned int   iTemp = 0;
unsigned long   RotateData = 0;

unsigned long   Noop = NOP;

// SPI start

SPI_SYNC=1;
delay_us(1);
SPI_SYNC=0;  //bring SYNC low
delay_us(1);

for(i=0; i<24; i++)
{
  SPI_SCLK=1;
  delay_us(1);
//////////////////////////////////////////////////
if(0x800000 == (Noop & 0x800000))
  {
   SPI_DIN=1;   //Send one to SDI pin
  }
  else
  {
   SPI_DIN=0;   //Send zero to SDI pin
  }
//////////////////////////////////////////////////

  SPI_SCLK=0;
  delay_us(1);
   
  iTemp = SPI_SDA;   //Read DIN of AD5383, PE3
  RotateData <<= 1;
 
  if(iTemp==0X01 )
  {

   RotateData |= 1;
  
  }
 
  Noop <<= 1;
      delay_us(5);
}

 
      
    // SPI ends

SPI_SYNC=1;

    delay_us(2);
*RegisterData=RotateData;

}


void ComPortsToPC(int32_t buf)
{
unsigned char tx[3] = {0,0,0};
  u8 t;
    tx[2] = ((buf)&0xFF0000)>>16;
    tx[1] = ((buf)&0x00FF00)>>8;
    tx[0] = (buf)&0x000000FF;
   for(t=0;t<3;t++)
   {
    USART_SendData(USART1, tx[t]);         //向串口1发送数据
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
   }
  
 
}

主程序如下:

main()

{

AD5383_Init();

SPI_LDAC=1;

delay_us(1);

//-------------------------------------------------------------------------------------

//Enable monitor and internal REF to 1.25v and select power down mode that is 100k_GND

//-------------------------------------------------------------------------------------

cstr = Write | Special_Function_Register | Control_Register  |Internal_REF_Enabled | Internal_REF_1_25 | PowerDown_100K_toGND| toggle_0_7;

WriteToAD5380ViaSpi(cstr);

delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout0   |0x000FFF;  //Vout3 IS 0.6V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout1   | 0x000FFF;  //Vout3 IS 0.6V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout2   | 0x000FFF;  //Vout3 IS 0.6V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

  cstr = Write | Input_Data_Register | Channel_Vout3   | 0x000FFF;  //Vout3 IS 0.6V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout4   | 0x002000;  //Vout3 IS 1.2V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout5   | 0x000FFF;  //Vout3 IS 1.2V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout6   | 0x003FFF;  //Vout3 IS 2.4V
WriteToAD5380ViaSpi(cstr);
delay_us(1);

cstr = Write | Input_Data_Register | Channel_Vout7   | 0x000FFF;  //Vout3 IS 2.4V
WriteToAD5380ViaSpi(cstr);
delay_us(1);


SPI_LDAC=0;
  delay_us(1);
//delay(2);
SPI_LDAC=1;
delay_us(1);
//delay(2);

while(1)

{

  LED0=!LED0;   //闪烁LED,提示系统正在运行.

  LED1=!LED1;   //闪烁LED,提示系统正在运行.

  delay_ms(500);

cstr = Read | Special_Function_Register | Control_Register; // readback control register data

   WriteToAD5380ViaSpi(cstr);                    

   ReadFromAD5380ViaSpi(&buf);   //Read select register, using two instruction cycles

  ComPortsToPC(buf);

}

}

Children
No Data