工具/软件:
大家好:
我正在尝试按照 Katlynne 在此 论坛上的响应中提供的伪代码更改 I2C 器件的地址。 在审核我的实现后、给出的说明中似乎存在错误。
响应提到、要配置 CONFIG2寄存器并将 GPI_CONFIG 设置为111b、我应发送0x3100。 但是、在查看数据表后、我相信要发送的正确值是0x3800。
我已经读回寄存器以验证数据是否正确写入。 当我将 GPIO_CONFIG 配置为0b111并将 GPIO_EN 配置为0b1时、我可以正确读回这些值。
- GPIO_CONFIG 至0b111将0x3100写入 CONFIG2寄存器(0xD2)
- GPIO_EN 至0b1、将0x0400写入触发器寄存器(0xD3)
但是、当我将 SLAVE_ADDRESS 写入 CONFIG2寄存器(0xD2)时、读取寄存器会显示其保持为0。
我不确定在尝试更改地址时是否遗漏了任何步骤或执行了错误操作。
下面是我当前使用的伪代码(它基本上与 Katlynne 的相同、但我已将写入 CONFIG2寄存器):
#define I2C_ADDR_DAC1 0x48
#define I2C_ADDR_DAC2 0x49
#define I2C_ADDR_BROADCAST 0x47
//为 DAC1和 DAC2设置 I2C 地址
// 对于两个器件、将 GPI 引脚设置为0
//将 CONFIG2寄存器中的 GPI_CONFIG 设置为111b
Wire.beginTransmission(I2C_ADDR_BROADCAST);
wire.write (byte (0xD2));// CONFIG2寄存器
WIRE.WRITE (BYTE (0x38));// 将 GPIO_CONFIG 设置为0b111
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
//将触发器寄存器中的 GPI_EN 设置为1b
Wire.beginTransmission(I2C_ADDR_BROADCAST);
wire.write (byte (0xD3));// TRIGGER 寄存器
WIRE.WRITE (BYTE (0x04));// 将 GPIO_EN 设置为0b1
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
// 对于需要配置的器件(DAC2)、将 GPI 引脚设置为逻辑高电平
//将数据写入 CONFIG2寄存器中的 SLAVE_ADDRESS 位字段。 只有 GPI 引脚为逻辑高电平的器件才会更新命令中传递的 SLAVE_ADDRESS 设置。 确保同一 I2C 总线上的其余器件在此过程中将其各自的 GPI 引脚设置为逻辑低电平。
Wire.beginTransmission(I2C_ADDR_BROADCAST);
wire.write (byte (0xD2));// CONFIG2寄存器
wire.write (byte (0x40));// 将 SLAVE_ADDRESS 设置 为0b01
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
// 将器件的 GPI 引脚切换至逻辑低电平
//将 GPI_EN 设置为0b
Wire.beginTransmission(I2C_ADDR_BROADCAST);
wire.write (byte (0xD3));// TRIGGER 寄存器
wire.write (byte (0x00));// 将 GPIO_EN 设置 为0b0
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
//将 GPI_CONFIG 更改为000b
Wire.beginTransmission(I2C_ADDR_BROADCAST);
wire.write (byte (0xD2));// CONFIG2寄存器
wire.write (byte (0x00));// 将 GPIO_CONFIG 设置为0b000
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
//触发 NVM 写入操作。
Wire.beginTransmission(I2C_ADDR_BROADCAST);
wire.write (byte (0xD3));// TRIGGER 寄存器
wire.write (byte (0x00));//
WIRE.WRITE (BYTE (0x10));// 将 NVM_PROG 设置为0b1
wire.endTransmission();//停止传输
//上电 DAC1、启用 VDD 基准、SLEW_RATE:1.6384ms (方波频率:610Hz)
Wire.beginTransmission(I2C_ADDR_DAC1);
WIRE.WRITE (BYTE (0xD1));// GENERAL_CONFIG 寄存器
wire.write (byte (0xC1));//
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
//在 DAC1上设置 MARGIN_HIGH
Wire.beginTransmission(I2C_ADDR_DAC1);
WIRE.WRITE (BYTE (0x25));// DAC_MARGIN_HIGH 寄存器
WIRE.WRITE (BYTE (0x0F));//
wire.write (byte (0xFC));//
wire.endTransmission();//停止传输
//在 DAC1上设置 MARGIN_LOW
Wire.beginTransmission(I2C_ADDR_DAC1);
WIRE.WRITE (BYTE (0x26));// DAC_MARGIN_LOW 寄存器
wire.write (byte (0x00));//
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
//将 DAC1 GPIO 设置为触发方波
Wire.beginTransmission(I2C_ADDR_DAC1);
wire.write (byte (0xD2));// CONFIG2寄存器
wire.write (byte (0x18));// 将 GPIO_CONFIG 设置为0b011
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
//为 DAC2上电、启用 VDD 基准
//code_step:8 LSB、SLEW_RATE:204.8 µs x 1.75 = 358.4 µs (满量程的包络上升/下降时间:~26ms)
Wire.beginTransmission(I2C_ADDR_DAC2);
WIRE.WRITE (BYTE (0xD1));// GENERAL_CONFIG 寄存器
wire.write (byte (0x0A));//
wire.write (byte (0x80));//
wire.endTransmission();//停止传输
//option-3:配置 DAC2 GPIO 以 使用最短时间设置和触发器触发高优先级警报
Wire.beginTransmission(I2C_ADDR_DAC2);
wire.write (byte (0xD2));// CONFIG2寄存器
WIRE.WRITE (BYTE (0x20));// 将 GPIO_CONFIG 设置为0b100
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
//在 DAC2上设置 MARGIN_HIGH
Wire.beginTransmission(I2C_ADDR_DAC2);
WIRE.WRITE (BYTE (0x25));// DAC_MARGIN_HIGH 寄存器
WIRE.WRITE (BYTE (0x0F));//
wire.write (byte (0xFC));//
wire.endTransmission();//停止传输
//在 DAC2上设置 MARGIN_LOW
Wire.beginTransmission(I2C_ADDR_DAC2);
WIRE.WRITE (BYTE (0x26));// DAC_MARGIN_LOW 寄存器
wire.write (byte (0x00));//
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
//将触发器寄存器中的 GPI_EN 设置为1b
Wire.beginTransmission(I2C_ADDR_BROADCAST);
wire.write (byte (0xD3));// TRIGGER 寄存器
WIRE.WRITE (BYTE (0x04));// 将 GPIO_EN 设置为0b1
wire.write (byte (0x00));//
wire.endTransmission();//停止传输
//触发 NVM 写入操作。
Wire.beginTransmission(I2C_ADDR_BROADCAST);
wire.write (byte (0xD3));// TRIGGER 寄存器
wire.write (byte (0x00));//
WIRE.WRITE (BYTE (0x10));// 将 NVM_PROG 设置为0b1
wire.endTransmission();//停止传输