串口模拟I2C读写MCP4728 DAC器件
引言
本文主要介绍MCP4728 DAC的地址读取及通道电量值的设置。
1、MCP4728 DAC介绍
MCP4728 是一款 12 位四通道电压输出数模转换器(DAC),具有 非易失性存储器(EEPROM)。其片上精密输出放大器使其能够实现 轨对轨模拟输出摆幅。
- I2C 串行接口:用户可以通过 I2C 串行接口命令将 DAC 输入代码、器件配置位和 I2C 地址位烧写到 非易失性存储器(EEPROM) 中。
- 非易失性存储器功能:DAC 在断电期间能保持输入代码,设备上电后根据保存的设置立即产生输出。
- 内部电压基准:具有高精密的内部电压基准 (VREF = 2.048V),并且用户可以为每个通道独立选择使用 内部电压基准 或 外部电压基准(VDD)。
2、MCP4728引脚图
MCP4728引脚分布及功能如下图所示
注:P = 电源, OI = 开漏输入, OO = 开漏输出, ST = 施密特触发输入缓冲, AO = 模拟输出
1: 此引脚与 VDD 线间需要连接外部上拉电阻。若不使用,则将此引脚悬空。
2: 此引脚可由单片机驱动。
3、MCP4728寄存器介绍
下面为MCP4728的寄存器介绍,具体指令和功能请参考芯片手册: MCP4728中文手册
注 1: 当 LDAC 引脚为 (或改变成)“低电平”时,更新模拟输出。此命令未使用 UDAC 位。
2: 当 LDAC 引脚或 UDAC 位为 “低电平”时,更新 DAC 输出。
3: 器件在最后通道的应答时钟脉冲时开始写 EEPROM。器件不执行任何命令直到 RDY/BSY 位重新变成 “高电平”。
4: 输入和输出寄存器在最后字节的应答时钟脉冲时进行更新。其更新并不需要 LDAC 引脚或 UDAC 位条件。EEPROM 不受
影响。
3、读取MCP4728地址
MCP4728默认器件地址位为 1100A2A1A0(0/1 读/写)
下面介绍广播查找地址,并附带实现代码。
按照顺序操作 :I2C开始–>I2C发送广播地址–>设备应答–>发送器件地址–>设备应答–>I2C重新开始–>发送0xC1 -->设备应答–>获取A0-A2中地址的数据–>设备应答–>I2C停止。
注:在发送器件地址后需要将LDAC引脚拉低,具体操作可参考代码处理。
下面为实现代码
//读取MCP4728地址
uint8_t I2cDacReadAddr(void)
{
uint8_t ADDR_Read = 0;
uint8_t Ack;
I2C_LDAC_HIGH(); // LDAC 引脚设置为高电平,准备工作
I2C_Start(); // 启动 I2C 通信
I2C_WriteByte(0x00); // 发送器件地址(设备地址 + 写操作位)
Ack = IIC_Wait_Ack(10); // 等待应答(10 ms内)
if (!Ack)
{
return IICERR_NACK; // 如果没有收到应答,返回错误码
}
I2C_WriteByte(0x0C); // 发送命令字节
I2C_LDAC_LOW(); // LDAC 引脚设置为低电平
Ack = IIC_Wait_Ack(10); // 等待应答
if (!Ack)
{
return IICERR_NACK; // 如果没有收到应答,返回错误码
}
I2C_Start(); // 再次启动 I2C 通信
I2C_WriteByte(0xC1); // 发送另一个命令字节
Ack = IIC_Wait_Ack(10); // 等待应答
if (!Ack