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.

DAC61416: Failed to write DAC61416's data registers.

Part Number: DAC61416

 

Hi.After the DAC is powered on, it resets normally. The communication can read the device number normally. Writing 0xEEEE to Register 0AH(DACRANGEn Register) sets the output range of the DAC to -2.5V to + 2.5V. Open channels 0 through 4. At this point, 0x0FFF is written to Register 0AH(DACRANGEn Register) to set the output to 2.5V. Using a multimeter to test the output, channel 0 is 2.0V, the remaining channels are not set and are also 2.0V open. The closed channel is 0V.

当上电之后,DAC正常复位。通信能够正常读取到设备号。向寄存器0AH(DACRANGEn Register )写入0xEEEE将DAC的输出范围设置为-2.5 V to +2.5 V。打开通道0到4。此时向寄存器0AH(DACRANGEn Register )写入 0x0FFF将输出设置为2.5V。用万用表测试输出,通道0为2.0V,其余没有设置值并且打开的通道也为2.0V。关闭的通道为0V.

Here are my code.

HAL_GPIO_WritePin (DAC_RESET_GPIO_Port, DAC_RESET_Pin, GPIO_PIN_RESET);//低电平有效复位输入。此引脚上的逻辑低电平导致器件发出上电复位事件。
HAL_Delay(50);

HAL_GPIO_WritePin (DAC_RESET_GPIO_Port, DAC_RESET_Pin, GPIO_PIN_SET);//低电平有效复位输入。此引脚上的逻辑低电平导致器件发出上电复位事件。
HAL_Delay(100);
HAL_GPIO_WritePin (DAC_CLR_GPIO_Port, DAC_CLR_Pin, GPIO_PIN_RESET);//低电平有效清晰输入。该引脚上的逻辑低电平将所有DAC输出清除至其清晰代码。如果未使用,请连接到 VIO。
HAL_Delay(100);
HAL_GPIO_WritePin (DAC_CLR_GPIO_Port, DAC_CLR_Pin, GPIO_PIN_SET);//低电平有效清晰输入。该引脚上的逻辑低电平将所有DAC输出清除至其清晰代码。如果未使用,请连接到 VIO。
HAL_GPIO_WritePin (DAC_LDAC_GPIO_Port, DAC_LDAC_Pin, GPIO_PIN_SET);//低电平有效同步信号。当LDAC引脚为低电平时,配置为同步模式的通道的DAC输出将同时更新。如果未使用,请连接到 VIO。
HAL_Delay(50);
//HAL_GPIO_WritePin (DAC_ALMOUT_GPIO_Port, DAC_ALMOUT_Pin, GPIO_PIN_SET);// ALMOUT 是一个漏极开路报警输出。需要一个外部10 kΩ上拉电阻,其电压不高于VIO。

// 0x03 0x0A84 禁用软件切换(TOGGLE),关闭CRC校验,打开SD0,可以配置寄存器
DA61416_Write_SR(SPICONFIG_REG, Close_SW_DISABLE);
HAL_Delay(50);
DA61416_ReadSR(SPICONFIG_REG);
HAL_Delay(10);
//0x04 0x0000 激活内部基准电压为2.5V,并配置所有通道为单端输出 
DA61416_Write_SR(GENCONFIG_REG, OutMode_Indepen);
HAL_Delay(50);
DA61416_ReadSR(GENCONFIG_REG);
HAL_Delay(10);

// 0x0a-0x0d 所有通道的输出范围配置为-2.5V-2.5V
DA61416_Write_SR(DACRANGE0_REG, Range_25to25mV);
HAL_Delay(50);
DA61416_Write_SR(DACRANGE1_REG, Range_25to25mV);
HAL_Delay(50);
DA61416_Write_SR(DACRANGE2_REG, Range_25to25mV);
HAL_Delay(50);
DA61416_Write_SR(DACRANGE3_REG, Range_25to25mV);
HAL_Delay(50);

//0x09 0xFFE0 打开所有通道0-4 
DA61416_Write_SR(DACPWDWN_REG, 0xFFFE);
HAL_Delay(50);
DA61416_ReadSR(DACPWDWN_REG);
HAL_Delay(10);
//0x06 0xffff 异步更新 
DA61416_Write_SR(SYNCCONFIG_REG, SYNC_ASYN);
HAL_Delay(50);
DA61416_ReadSR(SYNCCONFIG_REG);
HAL_Delay(10);

//0x07 0x0000 关闭TOGG切换 
DA61416_Write_SR(TOGGCONFIG0_REG, Toggle_Disable);
HAL_Delay(5);
DA61416_ReadSR(TOGGCONFIG0_REG);
HAL_Delay(10);
//关闭TOGG切换 0x08 0x0000
DA61416_Write_SR(TOGGCONFIG1_REG, Toggle_Disable);
HAL_Delay(5);
DA61416_ReadSR(TOGGCONFIG1_REG);
HAL_Delay(10);

DA61416_Write_SR(DAC0_REG,0x0fff); //2.5V电压
// 0x07 0x0000 关闭TOGG切换
DA61416_Write_SR(TOGGCONFIG0_REG, Toggle_Disable);
HAL_Delay(5);
DA61416_ReadSR(TOGGCONFIG0_REG);
HAL_Delay(10);
//0x08 0x0000 关闭TOGG切换 
DA61416_Write_SR(TOGGCONFIG1_REG, Toggle_Disable);
HAL_Delay(5);
DA61416_ReadSR(TOGGCONFIG1_REG);
HAL_Delay(10);

  • 向寄存器0AH(DACRANGEn Register )写入0xEEEE将DAC的输出范围设置为-2.5 V to +2.5 V。打开通道0到4。此时向寄存器0AH(DACRANGEn Register )写入 0x0FFF将输出设置为2.5V。用万用表测试输出,通道0为2.0V,其余没有设置值并且打开的通道也为2.0V。关闭的通道为0V.

    您好,按照您这里的描述,先配置输出范围为-2.5V~2.5V,然后打开通道0~4. 为什么再去配置0AH 为输出范围2.5V呢? 

    另外,配置输出范围要先于配置差分输出。 我看寄存器0x04您配置的是单端输出,所以我不知和这里的配置顺序是不是有关系。 您可以先配置输出范围,然后再配置输入模式,颠倒下配置顺序,看是否能正常写入?

  • 您好,颠倒顺序之后,也不能正常写入。设置通道0~4的输出电压范围为-2.5V~2.5V,配置输出模式为单端输出,打开通道0~4,设置通道0~3的值为0x0FFF,将他们的输出设置为2.5V,通道4不写入任何值。配置结束后,用万用表测得通道0~3的输出电压为0.418V,通道4的输出电压也为0.418V,其余未打开的通道测得输出的电压为0.01V。

  • 您好,向寄存器0x0A是可以配置它的满量程输出范围,但是不能配置它具体的输出电压。 输出电压是根据公式1来计算的:

    所以您配置完输出电压范围之后,打开通道,就不需要再通过寄存器去配置输出电压的具体值。所以您根据这个公式计算下,看得到的值和您实测的是不是一致?

  • 您好,我通过DA61416_Write_SR(DAC0_REG,0x0fff); 这一句程序配置寄存器10h(DAC0),输出电压的具体值为最大的输出电压值。当配置寄存器ODh(DACRANGE3)设置通道0~3的输出电压范围为-2.5V~2.5V的时候,按照所给公式,通道0此时输出的电压值应为2.5V,但是测得输出的电压为0.418V。倘若不向寄存器10h(DAC0)写入任何值的时候,该寄存器默认的值为0x0000,根据公式此时对应的输出电压应该为Vmin(-2.5V),可是测得的输出电压却为0.418V。而没有打开的通道测得的电压为0.01V。

  • 您好,寄存器0x06配置的是0xFFFF,这应该是同步模式。在同步模式下、向 DAC 数据寄存器写入数据 不会自动更新 DAC 输出。 而是仅在触发事件后才进行更新。DAC 触发 信号通过 LDAC 位或 LDAC 引脚产生,多个DAC输出的时候建议使用同步模式。 但是您配置的好像是同步模式。

  • 您好,看了我的代码,SYNC_ASYN为0x0000,寄存器0x06配置的是0x0000,不是0xffff。我的注释有点问题,此时还是异步模式,数值会立即写入寄存器,不需要由LDAC产生触发信号将数据写入寄存器。当配置输出电压范围为-2.5V~2.5V时,寄存器里面没有值的话应该输出-2.5V电压,可是我测得的输出电压却为0.418V。

  • 您好,硬件有检查吗?输出为0.418V的时候,此时VSS和VCC电压都正常吗? 可以将您的电路附上我这边看下。 

  • 您好,这是我的电路图,给DAC的VCC为12V

  • 您好,pin33的REF引脚输出电压是否正常?有没有读取其他配置的寄存器,是否能正确写入?

  • 您好,使用的是内部参考电压,33号引脚REF连接的是150nF的电容,上电之后测得33号引脚REF输出电压为2.49V,如代码所示,在某些能够读取数据的寄存器后面,写入值之后调用DA61416_ReadSR()函数去读取寄存器里面的值,读到的值与写入的值相同,说明其他寄存器是能正常写入的。

  • 您好,参考电压没问题,并且其他寄存器都可以正常写入,只是输出这里不正常。

    我又重新看了下您的寄存器,就是0x04这个寄存器。使用内部参考应该是配置0x3F00.bit[13:8]应该配置为111111.

    所以0x04这里,内部参考,单通道输出。您将这几位都配置为0了。 不知是否这里的原因,请再验证。

  • 您好,寄存器0x04h的bit[13:8]为只读位,不能写入。当配置的该寄存器之前先读取该寄存器的值,读到的值为0x7F00,但是向该寄存器写入0x3F00激活内部基准电压为2.5V,并配置所有通道为单端输出。此时再去读取该寄存器的值,却为0x0000(应该为0x3F00),电压输出还是不对

    DA61416_ReadSR(GENCONFIG_REG);
    HAL_Delay(10);
    //0x04 0x3F00激活内部基准电压为2.5V,并配置所有通道为单端输出
    DA61416_Write_SR(GENCONFIG_REG, OutMode_Indepen);
    HAL_Delay(50);
    DA61416_ReadSR(GENCONFIG_REG);
    HAL_Delay(10);

  • 您好,不好意思没注意看这几位是只读位。我找了一个关于DAC61416产生输出的代码,您这边参考一下看是否能解决您的问题。

    <ADDR>, <DATA>

    0x03, 0x0A84 // SPI CONFIG,  Power up device, SDO enabled 

    0x0A, 0x0000 // Select DAC range for (DAC Ch0- 3), 5V

    0x09, 0x0000 //  Power up DAC ch0-3

    0x04, 0x3F00 // Internal reference enabled (Select reference option internal / external) , all DAC are single ended mode

    0x0E, 0x0000 // Disable Synchronous load 

    0x10, 0xYYYX // DAC ch0 data  DAC61416: { DATA[11:0], x, x, x, x}, DAC code