This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DAC53701:更改 I2C 地址时遇到的问题

Guru**** 2374090 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1505540/dac53701-issues-changing-i2c-address

器件型号:DAC53701

工具/软件:

大家好:

我正在尝试按照 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();//停止传输  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jon、  

    您对这个拼写错误很了解。 0b111至 GPI_CONFG 在寄存器中为0x3800。  

    您是否使用广播寄存器读回?  如果是、您将尝试同时从两个不同的器件读回。 由于 I2C 是开漏、因此位0将始终优先。 您是否在完成整个序列并保存 NVM 后确认可以(或无法)使用 I2C 地址0x49与 DAC2通信?  

    此致、

    Katlynne  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Katlynne:

    我设法解决了这个问题。 我已验证可以更改 DAC 地址、但在修改后发送命令时:

    //将 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();//停止传输  

    DAC 地址将复位、恢复到其默认值。 为了解决该问题、我不会将 GPIO_CONFIG 广播到0b000、而是将其发送到 I2C_ADDR_DAC1。 我知道、如果两个 DAC 的 GPIO 都设置为低电平、则不应更改 DAC 地址、但仍允许更改。

    另一方面、我在 NVM 写入操作方面遇到问题、因此决定不发送 NVM 命令。

    此致、  

    Jon