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.

[参考译文] DAC7678:LDAC 看起来不起作用

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1387590/dac7678-ldac-does-not-seem-to-function

器件型号:DAC7678

工具与软件:

我的设计在 两条单独的 I2C 总线上具有5个 DAC7678SPW DAC。  在此应用中、我要写入40个 DAC 通道中除5个通道之外的所有通道、然后将 LDAC 引脚切换为低电平然后切换为高电平、以便同时将数据传输到 DAC。  但是、这似乎不起作用。  

下面的一些示例代码不起作用:

HAL_StatusTypeDef dacsUpdate35(uint16_t daca[35])
{
	static const uint8_t udacadr[] = {DAC0ADR, DAC1ADR, DAC2ADR, DAC3ADR, DAC4ADR};
	HAL_StatusTypeDef ret;
	uint8_t dacch;
	uint8_t i2cadr;

	// write the wavelength data for all wavelengths (update the outputs later)
	for (dacch=0; dacch<QTY_WAVELEN; dacch++)
	{
		// determine the the DAC I2C address
		i2cadr = udacadr[dacch>>3];

		// build the data to send to the DAC
		uint8_t dat[3] =
		{
			// 0x30|(dacch&7),	/* command to write the DAC channel and update its output */
			(dacch&7),			/* command to write the DAC channel but don't update the output yet */
			daca[dacch]>>4,		/* top 8 bits of the dac setting, left justified */
			daca[dacch]<<4		/* bottom 4 bits of the dac setting, left justified */
		};

		// write the dac
		if ( dacch < 24 )
			ret = HAL_I2C_Master_Transmit(&hi2c4, i2cadr, dat, 3, HAL_MAX_DELAY);
		else
			ret = HAL_I2C_Master_Transmit(&hi2c3, i2cadr, dat, 3, HAL_MAX_DELAY);

		if (ret != HAL_OK)
			goto ERRXIT;
	}

	// all wavelength DAC data has now been written to the DAC registers but the
	// outputs have not been updated yet.

ERRXIT:

	// toggle the DAC_LDAC line to transfer all DAC registers to their outputs
	LL_GPIO_ResetOutputPin(nDAC_LDAC_GPIO_Port, nDAC_LDAC_Pin);
	delay_us(50);
	LL_GPIO_SetOutputPin(nDAC_LDAC_GPIO_Port, nDAC_LDAC_Pin);

	return ret;
}

如果我只更改了一行代码、将用于写入 DAC 输入电阻器的命令从(0x00|dacch)更改为(0x30|dacch)以在每次写入后更新 DAC 通道(不等待 LDAC)、则所有 DAC 通道都将正确更新。

我已经通过示波器检查 LDAC 引脚变为低电平50us、但 DAC 未更新。

非常感谢您提供任何帮助或示例代码。

谢谢!

David

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

    尊敬的 David:

    遗憾的是、我们没有任何您可以使用的示例代码。

    我想这就是您在做的操作、但请确保发送0x600000以设置 DAC 以响应 LDAC 引脚。 完成 SCLK 后、您的 LDAC 会触发多长时间? 需要在 SCL 下降沿之后至少20us。

    谢谢!
    Erin

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

    Erin

     我通过发送到广播地址向所有 DAC 发送0x600000 (可能我没有正确使用广播地址)。

    如果我将0x600000发送到0x8e 的广播地址、这是否可以正确配置该 I2C 总线上的所有 DAC7678?

    我已经试验了几个延迟。  我使用的 MCU 速度非常快(ARM Cortex-M4F)。  我使 I2C 总线在快速模式(400kHz)下运行、并添加了以下延迟:

    1.在允许另一个启动条件之前,每个停止条件后延迟5us。

    2.在对所有 DAC 的所有输入寄存器进行编程后 、我现在将延迟50us、然后再将 LDAC 线路切换至低电平50us。  当我将 LDAC 线路切换为低电平时、I2C 总线处于空闲状态、SCL 和 SDA 线路都为高电平。

    我已经在这里做了很多尝试、添加延迟、但尚未解决问题。

    请注意、如果我对所有 DAC 的每个 DAC 通道执行"写入和更新"(C3:C2:C1:C0 = 3)、我用于更新所有 DAC 通道的代码会正常工作。  但是、对所有 DAC 的每个 DAC 通道进行"写入输入寄存器"(C3:C2:C1:C0 = 0)、然后延迟50us 并将 LDAC 引脚切换为低电平50us 不起作用。

    我已经验证 LDAC 引脚是否按预期输出低脉冲。

    您对我应该尝试的其他内容有什么建议吗?

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

    Erin

    随着更多的实验、我一定不能理解输入寄存器是如何被传输到 DAC 输出寄存器的。  我已经编写了一个测试函数、向单个 DAC 通道输入寄存器写入一个值、然后尝试各种方法更新 DAC 输出、同时在每次尝试后读取寄存器。

    切换 LDAC 线路不起作用、也不会设置"select to update DAC register"命令。

    我似乎能够使 DAC 输出更新的唯一方法是、我使用"写入输入寄存器、然后更新 DAC"命令(C3:C2:C1:C0 = 3)写入所需的 DAC 值

    阅读数据表时、看起来很简单。  您能想到我无法将输入寄存器传输到与其关联的 DAC 输出的另一个原因吗?

    谢谢!

    David

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

    尊敬的 David:

    没有任何内容表明广播模式不适合您尝试的操作。  

    在测试独立软件 LDAC 时、您在 LDAC 寄存器中存储了什么代码? 要使用  C3:C2:C1:C0 = 1寄存器、我认为 DAC 必须通过 LDAC 寄存器忽略 LDAC 引脚。

    我将看看是否能找到用于测试这一点的 EVM。 通过回顾之前的 e2e 问题、与数据表中的内容相比、更新 DAC 似乎存在一些差异、但没有人明确提及使用 LDAC。

    谢谢!
    Erin

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

    您好、Erin、

    我发现了问题。  关于 LDAC 寄存器、数据表不正确。  结果表明、相应的 DAC 通道必须为1才能响应 LDAC 输入引脚。

    这还意味着、在复位之后使用 LDAC 输入引脚之前、必须更改 LDAC 寄存器、使所有 DAC 通道都具有1、以响应 LDAC 输入引脚、而不是默认的0。

    关于通过发出 C3:C2:C1:C0 = 1命令手动更新 DAC 输出、可能还需要介绍更多内容、但现在已经到了午夜、只要我使用 LDAC 引脚、我就有解决方案、因此我不再做这个了。

    谢谢!

    David

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

    尊敬的 David:

    这是一个很大的数据表错误、感谢您找到它。 我提出要求修复数据表。

    谢谢!
    Erin

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

    Erin

    我预计 C3:C2:C1:C0 = 1命令可能也无法正常工作(如文档所述)。  当 LDAC 寄存器全部为零时、我无法做到这一点、但我没有进行太多的实验、因为这不是适合我的应用的理想解决方案。

    此致、

    David