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.

[参考译文] DAC70501:SPI 通信问题- DAC 输出寄存器

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1487845/dac70501-spi-communication-problem---dac-output-register

器件型号:DAC70501
主题中讨论的其他器件: DAC80501、DAC60501

工具与软件:

您好!

我正在使用 DAC70501MDGSR、我尝试通过 SPI 协议(1 MHz 时钟)进行写入来设置寄存器。

我正在使用 内部基准(VREFIO = 2.5V)。  SPI2C 引脚连接到 GND。 使用此代码、我要使 DAC 输出= 1.25V。 但是、没有发生任何情况- DAC 输出保持在2.5V! 此外、当我尝试不同的值时。 DAC 输出电压没有改变!

//SPI: PC0 - CS, PC1 - SDIN/SDA, PC2 - SCLK

//SYNC
PC0::clear();
USART<0>::TXDATA<>() = 0b0000'0010;
USART<0>::TXDATA<>() = 0b0000'0000;
USART<0>::TXDATA<>() = 0b0000'0000;
PC0::set();

//CONFIG
PC0::clear();
USART<0>::TXDATA<>() = 0b0000'0011;
USART<0>::TXDATA<>() = 0b0000'0000;
USART<0>::TXDATA<>() = 0b0000'0000;
PC0::set();

//GAIN
PC0::clear();
USART<0>::TXDATA<>() = 0b0000'0100;
USART<0>::TXDATA<>() = 0b0000'0000;
USART<0>::TXDATA<>() = 0b0000'0000;
PC0::set();

//TRIGGER
PC0::clear();
USART<0>::TXDATA<>() = 0b0000'0101;
USART<0>::TXDATA<>() = 0b0000'0000;
USART<0>::TXDATA<>() = 0b0000'0000;
PC0::set();

//DAC DATA
PC0::clear();
USART<0>::TXDATA<>() = 0b0000'1000;
USART<0>::TXDATA<>() = 0b0010'0000;
USART<0>::TXDATA<>() = 0b0000'0000;
PC0::set();

下面是我的示波器:

我检查了表 7.6时序要求:"SPI 模式"表 和  图7-1. SPI 模式时序 (来自 DACx0501数据表)、但我觉得一切都好!

您能帮我确定一下我可能忽略了什么或者我可能犯了什么错误吗?

此致、
Marko Aksentijević ć

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

    只是为了检查–DAC70501的 DAC 寄存器仅考虑最后13位、对吧?

    我发现数据表中的这一描述有点令人困惑。 我的意思是、我不是100%清楚、这是意味着它仅考虑最后13位还是它考虑[15:2]位而最后两位为零?

    此致、
    Marko

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

    尊敬的 Marko:  

    DAC70501是14位器件、因此字段宽度为[13:0]或14位。 寄存器中的最后两位被忽略。 因此、该系列中的所有器件都将使用相同的代码。 您可以像处理16位数据一样处理数据(器件忽略低两位)、也可以像处理14位数据一样处理数据、并在写入寄存器之前将其向左移两位。  

    对于1.25V、您应该将0x4000写入数据寄存器。  

    您的 VDD 是什么? SPI 的逻辑电平是多少?

    确保使用的 SPI 模式会在 SCLK 的上升沿移出数据、因为 DAC 在下降沿捕获数据。 看起来就像您一样、但在屏幕截图中难以说明。  

    此致!

    Katlynne Jones

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

    尊敬的 Katlynne:

    首先、感谢您的快速响应!

    如果我很好地理解 DAC 寄存器中的最后两个位被忽略、那么对于我来说、如果数据表中的以下两个位是合理的:

    DAC80501:DATA[15:0]
    DAC70501:DATA[15:2]、0、0
    DAC60501:DATA[15:4]、0、0、0、0

    而不是:

    DAC80501:DATA[15:0]
    DAC70501:DATA[13:0]、0、0
    DAC60501:DATA[11:0]、0、0、0、0

    就目前的情况而言、我认为这可能有点让人困惑。

    那么、如果我使用内部基准(VREFIO = 2.5V)、为什么对于1.25V、我应该将0x4000写入数据寄存器? 我的意思是、0x8000 (0b1000'0000'0000'0000)不应该是1.25V 输出的正确值? 例如、如果我需要尽可能大的值、那么应该是0xFFFC (0b1111'1111'1100)、因为最后两个位会被忽略?

    我的 VDD 为5V、SPI 信号的逻辑高电平为3V。

    是的、我使用的 SPI 模式会在上升沿移出数据(CS -绿色、SDIN -橙色、SCLK -黄色):

    如果我错了某个地方、请更正我的错误...

    此致、
    Marko

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

    尊敬的 Marko:  

    我应该已经注意到、您在代码中将增益位设置为0。  我假设您使用2倍增益模式来获得0至5V 的输出、因此1.25将是0x4000。 如果您使用的是0至2.5V 的范围(VREF = 2.5V 的1x 增益模式)、则是的、则数据将为0x8000。 是的、0xFFFC 将为满量程(0V 至2.5V 范围内为2.5V)。  

    鉴于输出仍然处于2.5V 的复位值(0V 至5V 默认范围内的中标度)、我希望您的命令都不会执行。 3V SPI 应该没问题、因为我们的输入逻辑电平不依赖于 VDD。 您能否在 SCLK 上的 DAC 附近添加一个电容器来尝试在上升沿和下降沿过滤这些尖峰?  

    此致!

    Katlynne Jones  

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

    尊敬的 Katlynne:

    我错误配置了引脚排列、这是 SPI 通信无法正常工作的主要原因...

    不过、您的建议非常有用–100pF 电容器可以完美地滤除 SCLK 信号尖峰!

    再次感谢您花时间和愿意帮助解决我的问题。

    此致、
    Marko

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

    尊敬的 Marko:  

    很高兴听到这种消息。 如果您遇到任何其他问题、请告诉我。  

    此致!

    Katlynne Jones