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.

[参考译文] PCM1792A:I2C 通信问题

Guru**** 2629085 points

Other Parts Discussed in Thread: PCM1792, PCM1794A, PCM1792A, PCM1795

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1585383/pcm1792a-i2c-communication-issue

主题中讨论的其他器件:PCM1794APCM1792APCM1795、PCM1792

您好专家、

我正在构建一个音频 DAC 供我自己使用。

我测试了 PCM1794A–听起来很不错、但它不允许我同时设置要使用的选项:

-差分电路 — 两个 DACs 在“双单声道“模式
-具有“慢速滚降“特性的模拟滤波器。

PCM1792A 提供此功能、它与 PCM1794A 相同(如您在 TI 源中所读)。

SPDIF 接收器将是 WM8805、它要求读取和写入内部寄存器的值以充分利用其功能、因此需要一个处理器来控制 WM8805。

因此、我也可以使用此处理器来控制 PCM1792A。

我计划使用 Arduino Uno 模块进行控制、通过 I2C 总线进行通信。 我将编写该程序(我仍然有很多要学习的)-现在,我使用的程序可用的在线或由一个朋友编写的测试。

Arduino 将以下器件连接到 I2C 总线:

a) 5V I2C:

-液晶显示屏

- OLED 显示器(我还不知道我最终会使用哪一个)

b) 3V3 I2C–(我使用了双向电平转换器,Ebay 提供的廉价转换器、1kΩ 上拉电阻器、我更改为<xmt-block1> 10kΩ</xmt-block>): 10kΩ:

- WM8805

- PCM1794A–1 或 2 芯片

我还有一个 PCM1795、连接一个用于测试。

用于写入 Arduino 的系统是公司的软件 (Arduino.cc/en/software#IDE)。

上述芯片组装在通用板上、可以单独连接到 3V3 I2C 总线(最多可同时连接 3 个芯片)。 也可以连接和断开 LCD 和 OLED 5V 芯片。

在开始编写软件之前、我想确认所有内容都已连接并正确配置。 我从互联网下载了多个程序、“扫描“ I2C 总线、并列出接收到自己地址后发送 ACK 信号的设备。

5V 总线芯片在以下地址正确报告:

- LCD–27(十六进制)== 00100111(二进制)

- OLED–3C == 00111100

在 3V3 总线上、只有 WM8805 芯片在地址 3A ==00111010 处报告。

PCM1792A 和 PCM1795 芯片的引脚 3 设置为“H"(“(+3V3)、用于选择 I2C 总线。

PCM1792A 和 PCM1795 芯片不响应扫描程序。 地址设置如下:

- PCM1792A P 通道–4F =01001111

- PCM1792A L channel–4E = 01001110

- PCM1795 P 通道–4D = 01001101

我的朋友编写了一些简短的程序来读取特定的寄存器–3V3 总线上的电路产生了以下结果:

WM8805–正确读取寄存器(版本,修订版)

PCM1792A 和 PCM1795 未能读取任何寄存器–“FF"读取“读取结果与尝试读取未连接的电路时相同。

一切看起来都正确;已检查过几次连接以及电压。

带有原始 1kΩ 上拉电阻器的双向电平转换器“也没有给出任何结果。

是否有人遇到过类似的问题、可以告诉我该怎么做? 如有任何建议、我将不胜感激。

此致、
Andrzej

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

    您好、Archie、

    首先,你必须做的是将设备设置为 I2C 模式(使用引脚 3 的 MSEL ),我 已经通过将它连接到高电平. 接下来、您必须正确设置器件的地址。

    PCM1792A 具有 7 位作为其自己的从器件地址。 从器件地址的前五位 (MSB) 出厂预设为 10011 (0x9x)。 地址字节的接下来两位是器件选择位、可由 ADR1 和 ADR0 端子用户定义。  

    一次最多可以在同一总线上连接四个器件。 这将 为地址提供 0x98、0x9A、0x9C 或 0x9E 。   PCM1792A  收到自己的从器件地址时会进行响应。

    在 IC 本身上,MS 引脚 设置 ADR0,MDI  设置 ADR1(参见以上的数据表快照)   ,因此您可以通过配置 ADR0 和 ADR1( Hi 或 Lo) 来设置地址,然后在该给定地址与设备进行通信。

    您还可以查看以下 E2E、因为我认为用户在芯片地址方面遇到了问题、但最终解决了问题。

    https://e2e.ti.com/support/audio-group/audio/f/audio-forum/110213/pcm1792a-i2c-comms-addresses-and-nil-output/390088?tisearch=e2e-sitesearch&keymatch=PCM1792%25252520address#

    此致、

    Arash

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

    地址设置为 9A 时、脚本尝试从地址 9A 中读取寄存器 22 和 23、然后读取 98、9C 和 9E、每次尝试返回“FF"。“。 我连接了 PCM1795(有一个)、地址设置为 9C、尝试从 9C 读取、然后尝试从 98、9A 和 9E 读取 — 结果完全相同:始终为“FF"。“。

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

    您好:  

    请监控 SDA 和 SDL、确保信号正确到达、并收到 ACK。  

    如果它没有读取任何寄存器(当您将硬件设置为地址 98 并且您写入该地址时未成功、则需要验证 I2C 信号)  

    (例如:

    W 98 14 00     #Use internal filter  将值 x00 写入该地址的寄存器 14)

    R 98 14 01.     # 这将只读寄存器 14、在读取操作中应产生 00)  

    您能给我发送脚本(如上面的示例所示)与您正在使用的写入和读取命令。  

    此致、

    Arash

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

    “请监控 SDA 和 SDL、确保信号正确到达、并收到 ACK。“
    我只有万用表和示波器、没有 I2C 监控器。 I2C 信号是正确的、我认为另一个芯片 (WM8805) 可以正确报告(发送 ACK)并且可以读取其寄存器(芯片版本,修订版本)。

    下面是我用于 readng 的脚本(它是由我的朋友写的,我写了 PC 程序“很久以前“,而不是在这种语言,我仍然需要学习它),因此它给了“FF"两“两个寄存器。
    i2c 扫描脚本(来自互联网)显示“No I2C devices found“。

    已正确检测 WM8805(使用另一个脚本)。

    #include
    const int PCM1792 = 0x9A;//lub 98 lub 9C lub 9E
    void setup ()

    字节 c;

    Wire.begin();

    Serial.begin(9600);
    while(!Serial);

    serial.print(“Rejestr 22:“);
    C = ReadRegister (PCM1,792,150);
    serial.println (c、hex);

    serial.print(“Rejestr 23:“);
    C = ReadRegister (PCM1,792,151);
    serial.println (c、hex);

    }

    void loop()

    }

    字节 ReadRegister (int devaddr、int regaddr)

    Wire.beginTransmission(devaddr);
    wire.write (regaddr);
    wire.endTransmission (false);//不发送停止条件、使连接保持活动状态。
    wire.requestFrom (devaddr、1);//仅一个字节
    字节数据= Wire.read ();
    wire.endTransmission (true);
    返回数据;
    }

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

    大家好。

    对于混淆,我深表歉意 — Arduino 似乎无法通过 I2C 总线与任何 DAC 芯片配合使用。

    我在“软件“模式下测试了 WM8742 芯片 、地址 1A — 扫描程序也未检测到该芯片,并尝试读取任何寄存器返回“FF"。“。

    我放弃了尝试使用 Arduino 来控制 DAC。

    再次,我为所花的时间道歉。

    请删除或关闭此主题。

    此致、
    Andrzej Stelmach

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

    感谢您的更新。 我会从我的角度关闭它、

    此致、

    Arash