ADI工程师:
您好!最近购买了你们数模芯片AD5383和其他别的芯片(共计几千元,用于新项目的研发中),在使用AD5383中,数据无法更新,发现LOAD引脚上电就是高电平,那我还怎么把它置低写入数据呢,我使用的是SPI通信,目前卡在这个地方了,数据无法加载到输出引脚,很是苦恼,还希望你们能够提供技术支持 ,谢谢了!
可以读芯片寄存器中的数据(已实现)!
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);
}
}
谁能帮帮我,谢谢了!
#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
STM32使用以上5个pin和AD5383进行通信,LDAC负责所有数据写完,拉低是数据加载到芯片输出引脚,是怪的是拉低此引脚时,低电平为0.93V,不能完全拉低啊???
ADI的大神们,帮帮忙啊!
在芯片上电后,LADA引脚为高电平,3.3V左右;STM32控制LADA的引脚不接芯片上,可以置低,为0V;接在芯片上后,低电平就是0.93V了;不能把LADA引脚拉置低电平;直接把LADA引脚接地,发现供电电源电流明显变大(增大10mA),感觉LADA引脚的高电平像是电源啊!
还有这段代码对吗,写完8个通道的数据后,用下面的程序来加载数据,对吗?还是要写一个端口数据,加载一次?
SPI_LDAC=0;
delay_us(1);
//delay(2);
SPI_LDAC=1;
delay_us(1);
//delay(2);
发一下电路吧, 仅仅只是凭叙述无法判断是什么问题
因为 数字的输入电流只需要1uA足够了, 所以问题不应该出在驱动能力上
是否有其他电路与此引脚连接,,导致电压无法下降
此外LDAC的MCU控制引脚, 是否可以拉到地。。
Hi,all!
十一加班调试板子,还好板子已调通了,不过这次我换成了IIC通信,就好了;不知道为什么SPI通信不可以,估计还是时序有问题吧!哪位大侠以后把SPI通信的程序调通了,还麻烦分享下,谢谢了!
另外一点想提的就是为什么ADI的工程师那么不给力呢,出现的问题都没提供技术支持,如果产品研发成功了,最终受益的还是ADI公司啊,奇怪!!!