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.

[参考译文] TCA9535:端口配置和设置无法正常工作

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1121494/tca9535-port-configuration-and-settings-don-t-work-as-expected

器件型号:TCA9535
主题中讨论的其他器件: PCF8575

您好!

我之所以撰写本文、是因为我开发了一个板、该板具有一个 Atmega1284p 处理器、通过 I2C 与两个 TCA9535RTWR 通信。

通过100nF 电容器提供5V 的电源。

在一个端口上、扩展器 A0、A1和 A2设置为 GND、以便 I2C 地址为0x20、而在另一个端口上、设置为 A0=5V、A1和 A2设置 为 GND、以便 I2C 地址为0x21。

SCL 和 SDA 被正确上拉并被连接至 Atmega 处理器。

我正在使用 Arduino 软件对其进行编程。 硬件似乎工作正常。

实际上、如果我使用以下代码对 P17-P10进行编程、它看起来可以正常工作:

Wire.beginTransmission(byte(0x20));
Wire.write(byte(0x07));
Wire.write(byte(0x17));//P17-P10 0001 0111 (set P17-P15 and P13 as output)
Wire.endTransmission();

Wire.beginTransmission(byte(0x20));
Wire.write(byte(0x03));
Wire.write(byte(0xFF));//P17-P10 1111 1111 (set output to HIGH)
Wire.endTransmission();

Wire.beginTransmission(byte(0x20));
Wire.write(byte(0x03));
Wire.write(byte(0x00));//P17-P10 0000 0000 (set output to LOW)
Wire.endTransmission();

实际上、我可以看到 LED 正确闪烁。

当我尝试使用端口 P07-P00配置和设置输出时、会出现此问题、因为我无法将它们设置为高电平和低电平、如 P17-P10:

Wire.write(byte(0x06));//to configure the ports

Wire.write(byte(0x02));//to set the outputs

另一个问题是、如果我尝试使用以下代码读取配置寄存器(或从0x02到最后一个寄存器的任何其他寄存器)、我始终只能看到输入寄存器的内容:

Wire.beginTransmission(byte(0x20));
Wire.write(byte(0x06));
Wire.requestFrom(byte(0x20), uint8_t(2));
IBuffer[0] = Wire.read();
Serial.print("Config 20 0: ");
Serial.println(IBuffer[0], BIN);
IBuffer[0] = Wire.read();
Serial.print("Config 20 1: ");
Serial.println(IBuffer[0], BIN);
Wire.endTransmission();

读指令看起来运行良好、但"Wire.write (byte (0x06));"指令不起作用、它从开头(reg 0x00 ->输入)

我在其他端口扩展器(0x21)和其他电路板上遇到了完全相同的问题。

我曾尝试  Analog Devices Inc./Maxim Integrated 的 MAX7311ATG+、所有操作均按预期进行。

非常感谢。

此致

Luca Riva

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

    请显示故障 μ I²C 请求的示波器或逻辑分析仪跟踪。

    您的库是否具有四参数形式的 Frorequestm?

    Wire.requestFrom(0x20, 2, 0x06, 1);

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

    Wire.beginTransmission(byte(0x20));
    Wire.write (byte (0x06));
    wire.requestFrom (byte (0x20)、uint8_t (2));

    ^我没有在 Arduino 中尝试过这种交易、但您在进行 Wire.write 后是否应该结束交易? 否则、您会执行重复的启动条件、而不是在 I2C 总线上初始化停止条件。  

    我认为您的线路应该类似于:

    Wire.beginTransmission(byte(0x20));//start 调节 I2C 写入器件地址0x20
    Wire.write (byte (0x06));//设置要从中读取的设备寄存器  

    Wire.endTransmission ();//启动停止条件、这允许器件0x20h 的状态机将指针设置到寄存器0x06h

    Wire.requestFrom (byte (0x20)、uint8_t (2));//从器件地址0x20h 读取2个字节并从 I2C 读取2个字节(由于自动递增、从寄存器0x06h 和从0x07h 读取)

    Wire.endTransmission ();//启动停止条件

    -Bobby

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

    您好、Bobby、

     在打开该帖子之前、我还下载了用于 TCA 端口扩展器的 Arduino 库。

    实际上、它是按照您的建议编写的。

    Wire.beginTransmission(byte(0x20));
    Wire.write(byte(0x06));
    Wire.endTransmission();
    Wire.requestFrom(byte(0x20), uint8_t(2));
    IBuffer[0] = Wire.read();
    Serial.print("Config 20 0: ");
    Serial.println(IBuffer[0], BIN);
    IBuffer[0] = Wire.read();
    Serial.print("Config 20 1: ");
    Serial.println(IBuffer[0], BIN);
    

    但是、在进行这种写入时、我无法读取其他寄存器、只能读取输入寄存器。

    感谢你的答复。

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

    大家好、Clemens、

    我将执行一些测量、但奇怪的是、一组端口工作、另一组端口不工作。

    不幸的是、我的库 没有 四参数形式的 Frorequestm。 我首先要写入要读取的寄存器、然后通过设置字节数来执行简单的请求(如上面的第一篇文章中所示)。

    感谢你的帮助。

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

    请显示故障 μ I²C 请求的示波器或逻辑分析仪跟踪。

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

    Wire.beginTransmission(byte(0x20));
    Wire.write(byte(0x06));
    Wire.write(byte(0x00));
    Wire.endTransmission();



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

      Wire.beginTransmission(byte(0x20));
      Wire.write(byte(0x06));
      Wire.write(byte(0x00));
      Wire.endTransmission();
    
      Wire.beginTransmission(byte(0x20));
      Wire.write(byte(0x02));
      Wire.write(byte(0xFF));
      Wire.endTransmission();
    
      Wire.beginTransmission(byte(0x20));
      Wire.write(byte(0x06));
      Wire.endTransmission();
      Wire.requestFrom(byte(0x20), uint8_t(1));
    
      IBuffer[0] = Wire.read();
      Serial.print("Config 20 0: ");
      Serial.println(IBuffer[0], BIN);

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

    读取事务实际上返回值0x02。

    上升沿非常慢;使用更强的上拉电阻器或降低频率。

    是否确定您实际上拥有 TCA9535芯片? 您是否从授权经销商处获得了这些信息?

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

    我会尝试。

    分销商是 DigiKey 或 Mouser。 我们可以信任他们。

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

    我忘了说我尝试了100kHz 和400kHz。

    其他测量是在400kHz 频率下执行的。

    下面的一个频率为100kHz。

    我刚刚修改为400kHz、以查看是否发生了变化、但两种频率的问题是相同的。

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

    标记是 PW535还是 PF575 (C)?

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

    PF575

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

    这是 PCF8575、它具有准双向 I/O 且没有配置寄存器。