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.

[参考译文] CDCE421A:CAN't 通过 SDATA 与 CDCE421A 通信

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

https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/1277633/cdce421a-can-t-communicate-with-cdce421a-via-sdata

器件型号:CDCE421A
主题中讨论的其他器件: LMK61E2

我无法让 CDCE421A 对通过 SDATA 执行的任何命令做出反应。

我正在使用 RP2040微控制器上的自定义 PIO 编程来处理脉冲和计时、这根据在输出上看到的结果效果很好。

PIO 编码如下:

.program cdce421a
.side_set 1 opt

.define public T1 2
.define public T2 6
.define public T3 2

pull_data:
    pull block
    out y, 4
bitloop:
    jmp !y    pull_data  side 0 [T3 - 2]; Side-set still takes place when instruction stalls
    out x, 1             
    jmp !x    do_zero    side 1 [T1 - 1]; Branch on the bit we shifted out. Positive pulse
do_one:
    jmp y--   bitloop    side 1 [T2 - 1] ; Continue driving high, for a long pulse
do_zero:
    jmp y--   bitloop    side 0 [T2 - 1] ; Or drive low, for a short pulse

% c-sdk {
#include "hardware/clocks.h"

static inline void cdce421a_program_init(PIO pio, uint sm, uint offset, uint pin, float freq) {

    pio_gpio_init(pio, pin);
    pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);

    pio_sm_config c = cdce421a_program_get_default_config(offset);
    sm_config_set_sideset_pins(&c, pin);
    sm_config_set_out_shift(&c, false, false, 32);
    //sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);

    int cycles_per_bit = cdce421a_T1 + cdce421a_T2 + cdce421a_T3;
    float div = clock_get_hz(clk_sys) / (freq * cycles_per_bit);
    sm_config_set_clkdiv(&c, div);

    pio_sm_init(pio, sm, offset, &c);
    pio_sm_set_enabled(pio, sm, true);
}

根据数据表、在主 c 文件中、它的初始化频率为70kHz:

cdce421a_program_init(pio, sm, offset, CDCE421A_PIN, 70000);

发送的数据以位为单位、以用作 PIO ASM 中的计数器并在 OSR 中左移。

static void cdce421a_write(uint32_t data, uint32_t bits) {
    pio_sm_put_blocking(pio, sm, (data << (32 - bits - 4)) | (bits << 28));
}

我已经相应地定义了数据:

#define ENTER_PROG_MODE         cdce421a_write(0b001100,6)
#define READBACK_MODE           cdce421a_write(0b111011,6)
#define WRITE_WORD_0            cdce421a_write(VCO_SEL_VCO1 | PRESCALER_DIV_BY_5 | OUTPUT_DIV_BY_8 | DRIVER_SEL_LVDS | TITEST1 ,11)
#define WRITE_WORD_1_DEFAULT    cdce421a_write(0x4FA,11)
#define WRITE_WORD_2_DEFAULT    cdce421a_write(0x2C0,11)
#define WRITE_WORD_3_DEFAULT    cdce421a_write(0x61E,11)
#define WRITE_WORD_4_DEFAULT    cdce421a_write(0x101,11)
#define WRITE_WORD_5_DEFAULT    cdce421a_write(0x500,11)
#define EXIT_PROG_MODE          cdce421a_write(0x7FF,11)
#define PROG_EEPROM             cdce421a_write(0x7F0,11)
#define EXIT_PROG_EEPROM        cdce421a_write(0x700,11)

读回模式波形如下所示:

I DELAY 1ms 然后发送0个脉冲以读取 EEPROM 内容、但输出振荡从不停止。 我可以辨别出、因为时钟驱动的是我正在运行 LED 二进制计数器应用程序的 RISC-V 内核、并且它会正常继续。 如果我禁用 CDCE421A、它将暂停应用。 我希望在回读模式下具有相同的行为。

我已经用尽了我能想到的所有选项,以使这项工作,包括阅读关于它的几篇文章在这里多次. 还有其他可以尝试的东西吗?

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

    Christopher、

    是否具有为开始回读过程而向器件提供的输入波形?

    谢谢。

    卡德姆

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

    尊敬的 Kadeem:

    这是我使用的读回波形。 我将发送所有零。 我厌倦了一个,但它没有什么不同。

    高电平脉冲1 / 70000 * 0.2 = 2.85us

     1 / 70000 * 0.8 = 11.4us 的低脉冲

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

    Christopher、

    是否在发送前六个脉冲后发送初始脉冲以触发 EEPROM 回读?

    是否只需要单个可编程时钟? LMK61E2可能更易于在基于微控制器的实现(通过具有更严格时序要求的专有接口的 I2C)中使用。

    谢谢。

    卡德姆

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

    是的、我将发送所有需要的脉冲。

    LMK61E2会是更好的选择。 遗憾的是、我们使用的板上已经配备了该芯片。

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

    Christopher、

    需要说明的是:  

    1. 使用这种编程方法时、您会看到输出发生了变化、对吗? 我假设这是基于你之前的陈述的情况:"根据结果看到的结果,它效果很好的输出。"
    2. 如果情况并非如此、对于回读访问脉冲、您是否满足低电平时间0.2t 的时序要求?

    谢谢。

    卡德姆

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

    Kadeem,

    我看不到 CDCE421A 的输出发生变化。 我要讨论的输出是微控制器到 CDCE421A 上 SDATA 引脚的输出。 我在这里捕获了上面显示的波形。 我将时间设置为0.2t、其中 t = 1/70000。 可能它太接近较长"1"脉冲之间的阈值。 我可以尝试延迟一些时间。

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

    Christopher、

    感谢您的澄清。 我已经订购了评估模块、这样我就可以捕获"理想"波形、并将其作为如何显示通信结果的指南。 这将在下周晚些时候到达。

    我将在收到带捕获的评估模块时提供更新。

    谢谢。

    卡德姆

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

    Kadeem,

    我很高兴听到这个消息。 我也考虑过这样做、非常感谢您主动采取行动。 我曾尝试在位之间添加延迟、同时保持高脉冲宽度相同、但没有效果。

    我已三次检查 CDCE421A 电路板 布局布线以及从 CDCE421A 的 SDATA 引脚 到微控制器引脚 的连续性、但未发现任何问题。

    期待您的参与。

    克里斯

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

    Christopher、

    库存团队通知我、库存中没有此器件的评估模块。

    上升 CE 与第一个脉冲之间的延迟时间至少为3T? 脉冲上升时间为多长时间、是接近2ns 还是明显更快?

    我知道此电路板是经过设计和制造的、但我们强烈建议改用 LMK61E2来替换 CDCE421A。

    谢谢。

    卡德姆