资源描述
AD5272/5274数字电位器调试笔记
最近一项目需要做一个DC/DC boost升压,设想通过调节反馈电阻的参数来做到数字调压功能,在第一次使用数字电位器的时候,尽然碰到了好几个问题,现记录如下:
1./Reset PIN忘记拉出来
2.cap_exp电容一定要加,估计芯片内部有个可以写50次的OTP,电容作为升压用的
3.ADDR脚接GND,地址A1A0=00,特别注意,如果时序对了没有应答,可能是寻址不对,这个问题也折腾了我一整天。因为ADDR pin虚焊,导致悬空,地址不是00,用万用表检测的时候量到的电压可能是100多mv,不是0V,导致IIC没有ACK信号。
4.在写时序的时候开始总是不能更新RADC的值,应答信号也有。后来查找到问题所在:第一步要先写入0X1C03,允许操作寄存器,开始看文档以为只要给一个复位命令就好,尝试很多次都不对。增加这个命令就oK
参考代码如下:
void AD5272_Write(u16 w_data)
{
u8 w_data_l;
u8 w_data_h;
w_data_l=(u8)((w_data)&0x00ff);
w_data_h=(u8)((w_data>>8)&0x00ff);
IIC_Start();
IIC_Send_Byte(0x5E); //·¢ËÍADDR
IIC_Wait_Ack();
IIC_Send_Byte(0x10); //·¢ËÍREST
IIC_Wait_Ack();
IIC_Send_Byte(0x02); //·¢ËÍ0010 cmd
IIC_Wait_Ack();
IIC_Stop(); //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
Delay_us(5000);
IIC_Start();
IIC_Send_Byte(0x5E); //·¢ËÍADDR
IIC_Wait_Ack();
IIC_Send_Byte(0x1c); //·¢ËÍ00 0001 01 Öмä4bit 0001 CMD(д) ÓÒ±ßÁ½Î»ÊÇÊý¾Ý
IIC_Wait_Ack();
IIC_Send_Byte(0x03); //·¢Ë͵Í8λ
IIC_Wait_Ack();
IIC_Stop(); //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
IIC_Start();
IIC_Send_Byte(0x5E); //·¢ËÍADDR
IIC_Wait_Ack();
IIC_Send_Byte(w_data_h); //·¢ËÍ00 0001 01 Öмä4bit 0001 CMD(д) ÓÒ±ßÁ½Î»ÊÇÊý¾Ý
IIC_Wait_Ack();
IIC_Send_Byte(w_data_l); //·¢Ë͵Í8λ
IIC_Wait_Ack();
IIC_Stop(); //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
}
void AD5272_Read(u8 *pBuffer)
{
IIC_Start();
IIC_Send_Byte(0x5E); //·¢ËÍADDR
IIC_Wait_Ack();
IIC_Send_Byte(0x08); //·¢ËÍ00 0010 00 Öмä4bit 0010 CMD(read)
IIC_Wait_Ack();
IIC_Send_Byte(0x00); //·¢Ë͵Í8λ
IIC_Wait_Ack();
IIC_Stop(); //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
IIC_Start();
IIC_Send_Byte(0x5F); //·¢ËÍADDR
IIC_Wait_Ack();
*pBuffer++=IIC_Read_Byte(0x01); //ACK
*pBuffer++=IIC_Read_Byte(0x01); //ACK
IIC_Stop(); //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
}
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_0); //PB10,PB11 Êä³ö¸ß
}
//²úÉúIICÆðʼÐźÅ
void IIC_Start(void)
{
SDA_OUT(); //sdaÏßÊä³ö
IIC_SDA_SET;
IIC_SCL_SET;
Delay_us(4);
IIC_SDA_CLR;//START:when CLK is high,DATA change form high to low
Delay_us(4);
IIC_SCL_CLR;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
}
//²úÉúIICÍ£Ö¹ÐźÅ
void IIC_Stop(void)
{
SDA_OUT();//sdaÏßÊä³ö
IIC_SCL_CLR;
IIC_SDA_CLR;//STOP:when CLK is high DATA change form low to high
Delay_us(4);
IIC_SCL_SET;
IIC_SDA_SET;//·¢ËÍI2C×ÜÏß½áÊøÐźÅ
Delay_us(4);
}
//µÈ´ýÓ¦´ðÐźŵ½À´
//·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü
// 0£¬½ÓÊÕÓ¦´ð³É¹¦
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDAÉèÖÃΪÊäÈë
IIC_SDA_SET;Delay_us(10);
IIC_SCL_SET;Delay_us(10);
while(READ_SDA)
{
Delay_us(10);
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL_CLR;//ʱÖÓÊä³ö0
return 0;
}
//²úÉúACKÓ¦´ð
void IIC_Ack(void)
{
IIC_SCL_CLR;
SDA_OUT();
IIC_SDA_CLR;
Delay_us(2);
IIC_SCL_SET;
Delay_us(2);
IIC_SCL_CLR;
}
//²»²úÉúACKÓ¦´ð
void IIC_NAck(void)
{
IIC_SCL_CLR;
SDA_OUT();
IIC_SDA_SET;
Delay_us(2);
IIC_SCL_SET;
Delay_us(2);
IIC_SCL_CLR;
}
//IIC·¢ËÍÒ»¸ö×Ö½Ú
//·µ»Ø´Ó»úÓÐÎÞÓ¦´ð
//1£¬ÓÐÓ¦´ð
//0£¬ÎÞÓ¦´ð
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL_CLR;//ÀµÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä
for(t=0;t<8;t++)
{
//IIC_SDA=(txd&0x80)>>7;
if((txd&0x80)>>7)
IIC_SDA_SET;
else
IIC_SDA_CLR;
txd<<=1;
Delay_us(2); //¶ÔTEA5767ÕâÈý¸öÑÓʱ¶¼ÊDZØÐëµÄ
IIC_SCL_SET;
Delay_us(2);
IIC_SCL_CLR;
Delay_us(2);
}
}
//¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDAÉèÖÃΪÊäÈë
for(i=0;i<8;i++ )
{
IIC_SCL_CLR;
Delay_us(2);
IIC_SCL_SET;
receive<<=1;
if(READ_SDA)receive++;
Delay_us(1);
}
if (!ack)
IIC_NAck();//·¢ËÍnACK
else
IIC_Ack(); //·¢ËÍACK
return receive;
}
展开阅读全文