您的位置:首页 > 其它

关于TI DAC芯片 DAC101C081 地址选择

2016-11-21 15:01 295 查看
这个芯片资料非常简单,单纯看pdf文档很难选择出正确的地址。

在官方技术讨论区正好看到有这个地址的询问,特此记录下。

Question for connecting DAC101C081 with MSP430F5172

I recently met a problem. I tried to connect the DAC101C081 (6 pins, I2C) as slave mode with MSP430 (master mode). 

I connected ADR0 of DAC to GND and Va to 5V. However, when I tried to transmit the data from MSP to DAC,

 even if I set the slave address as 0x0Dh as datasheet, I could not receive the ACK from DAC. Could anyone provide the suggestion?

Hello,

The address when communicating with the DAC101C081 the address byte consists of 7 bits for the address and 1 bit for read or write. 

With ADR0 grounded the address is 000 1101.

To write to the part you need to add a 0 to the end and so you send 0001 1010 (0x1A) for the address byte.  See Figure 26 in the datasheet.

To read from the part you need to add a 1 to the end and so you send 0001 1011 (0x1B) for the address byte.  See Figure 27 in the datasheet.

i2c驱动我也分享下,参考24c04类似代码

//#define ADDR_IIC        0x0d
#define ADDR_IIC        0x0c
/*
enum ENUM_TWI_REPLY
{
TWI_NACK=0
,TWI_ACK=1
};
*/
enum ENUM_TWI_BUS_STATE
{
TWI_READY=0
,TWI_BUS_BUSY=1
,TWI_BUS_ERROR=2
};

static void delay_nop(uint8_t time)
{
uint8_t  i;

for(i=0; i<time; i++)
{
__nop(); __nop();
}
}

static void  TWI_delay(void)
{
uint8_t i=5; //i=10延时1.5us//这里可以优化速度 ,经测试最低到5还能写入
while(i--);
}

void DAC081_Set(void)
{

}

uint8_t TWI_Start(void)
{
SDAH;
SCLH;
TWI_delay();
if(!SDAread)return TWI_BUS_BUSY; //SDA线为低电平则总线忙,退出
SDAL;
TWI_delay();
if(SDAread) return TWI_BUS_ERROR; //SDA线为高电平则总线出错,退出
SCLL;
TWI_delay();

return TWI_READY;
}

void TWI_Stop(void)
{
SDAL;
SCLL;
TWI_delay();
SCLH;
TWI_delay();
SDAH;
TWI_delay();
}

void TWI_Ack(void)
{
SCLL;
TWI_delay();
SDAL;
TWI_delay();
SCLH;
TWI_delay();
SCLL;
TWI_delay();
}

void TWI_NoAck(void)
{
SCLL;
TWI_delay();
SDAH;
TWI_delay();
SCLH;
TWI_delay();
SCLL;
TWI_delay();
}

uint8_t TWI_WaitAck(void)   //返回为:=1有ACK,=0无ACK
{
SCLL;
TWI_delay();
//SDAH;
GPIO_PinModeSet(gpioPortE, 13, gpioModeInput, 0);
//TWI_delay();
SCLH;
TWI_delay();
if(SDAread)
{
SCLL;
return 0;
}
SCLL;

GPIO_PinModeSet(gpioPortE, 13, gpioModePushPull, 1);

return 1;
}

void TWI_SendByte(uint8_t SendByte) //数据从高位到低位//
{
uint8_t  i;
for(i=0; i<8; i++)
{
SCLL;
TWI_delay();

if(SendByte&0x80)
SDAH;
else
SDAL;

SendByte<<=1;

//TWI_delay();
SCLH;
TWI_delay();
}
SCLL;
}

uint8_t DAC081_WriteByte(uint8_t upper)
{

uint8_t i;
TWI_Start();

TWI_SendByte( (ADDR_IIC<<1) & 0xFE);//写器件地址  写入:地址最低位是0,读取:地址最低位是1
//TWI_SendByte( 0x1A);

if(!TWI_WaitAck())
{
TWI_Stop();
return 0;
}

TWI_SendByte((upper>>4)&0x0F);

TWI_WaitAck();

TWI_SendByte(upper<<4);

TWI_WaitAck();

TWI_Stop();

return 0;
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: