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.

[参考译文] TCA9554A:当 P0被拉至 COM 时读取输入

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1328723/tca9554a-read-input-when-p0-pulled-to-com

器件型号:TCA9554A
主题中讨论的其他器件: TCA9544A

大家好!  

我们将在设计中使用 TCA9554A、并需要将 P0配置为输入、以便在将其拉至低电平时、INT 将发生变化。 我已经成功使用 I2C 接口和 Raspberry PI Pico W 对 TCA9554APWR 进行编程、以重复打开和关闭 P0-P7作为输出、 当我将与输入相同的引脚配置并将它们下拉时、发现引脚上没有变化、这真的是一个惊喜。  

为了使对话和调试这个主题,我试图使我的程序简单,它看起来像这样:  

#包含

 int i2cDeviceAddress = 0x3F;// TCA9554A I2C 器件地址

void setup(){

 Wire.begin();

 //将引脚5 (P1)配置为输出

 Wire.beginTransmission(i2cDeviceAddress);

 Wire.write (0x03);//配置寄存器

 Wire.write (0b11111111);

 Wire.endTransmission ();

void loop(){

 延迟(500);

 

 //读取输入状态

 // Wire.beginTransmission(i2cDeviceAddress);

 wire.requestFrom (i2cDeviceAddress、1);//请求输入端口状态

 if (Wire.available()){

  byte inputState = Wire.read ();//读取输入端口状态

  serial.print ("输入状态:");

  for (int i = 0;i < 8;i++){

   serial.print ((inputState >> I)和0x01);//打印每个输入状态

  }

  serial.println ("L");  

 //Wire.endTransmission ();





无论我做什么、串行控制台中的输出对于所有引脚位置都报告为高电平。 由于它是我的 PCA 上最容易接触的、因此我的主要测试是将连接到 P1的引脚拉至 COM、此时我期望左侧第二个位置有一个零。  



更奇怪的是、TCA9554APWR 认为其引脚全部为高电平、我通过观察 I2C 的范围输出确认了这一点。 通道1 (黄色)是时钟、通道3 (蓝色)是数据。



相关迹线的原理图附在后续图像中。  

很高兴获得一些帮助、这将允许该芯片读取输入、并将改变该产品的功能和多功能性。 通过读取 P0 (ex0)何时变为低电平、我可以通过检测接地故障来告诉我们的微控制器何时执行和执行操作。 这对我们的项目非常重要。  

谢谢、我期待与您交谈。  

亲切友好  

丹尼尔·科达

硬件工程师
Megger
德克萨斯州达拉斯4545 West Davis Street 达拉斯75211

5163121767

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

    R44和 R51的实际值是多少?

    您要直接在 P0引脚上测量什么电压?

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

    今天早上、我使用仪表进行检查:R44为零欧姆、R51为零欧姆。 R50未组装、因此它处于开路状态。 我还检查了 R12、即10k。

    在我将其拉至 COM 之前、我直接在 P0处测量的电压为3.054伏。 当引脚下拉时、Fluke 87V 上的读数为0V。

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

    Daniel、您好!

    只需确保我了解您针对 TCA9554A 的预期设置。  

     Wire.write (0x03);//配置寄存器

     Wire.write (0b11111111);

    [/报价]

    您说您正在将 P1配置为"输出"。 此命令 wire.write (0x03)、wire.write (0xFF)告诉我您要将 P1配置为默认状态作为输入? 代码使 P1成为输入、但您的内联注释建议您尝试使 P1成为输出。  

    我们需要考虑三个检查点。 实际引脚 P0上的电压、示波器上输入寄存器读取的状态以及打印到串行监视器的值。  

    我刚刚看到您在拉至 COM 之前测量了 P0的注释。 3.054V、然后在下拉时读数为0V。 我们已确认第一个处于实际引脚电压的检查点。  

    void loop(){

     延迟(500);

     

     //读取输入状态

     // Wire.beginTransmission(i2cDeviceAddress);

     wire.requestFrom (i2cDeviceAddress、1);//请求输入端口状态

     if (Wire.available()){

      byte inputState = Wire.read ();//读取输入端口状态

      serial.print ("输入状态:");

      for (int i = 0;i < 8;i++){

       serial.print ((inputState >> I)和0x01);//打印每个输入状态

      }

      serial.println ("L");  

     //Wire.endTransmission ();

    [/报价]

    在 void setup()中,向配置寄存器写入一个全为1的值。 TCA9544A 内部的指针寄存器设置为配置寄存器。 在 void loop()中,指针寄存器字节的设置是为了读取输入端口寄存器中的内容? 如果您正在读取配置寄存器的内容、我希望您读取全1、因为这是您在 setup 函数中写入的值。  

    请参阅数据表中的图24。

    此致、

    泰勒

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

    您好、Tyler:

    首先、很抱歉在这里留下了这个旧的输出注释。 我已经将其删除。 之所以出现这种情况、是因为以前该程序是我第一次测试时用于控制输出引脚。  

    您对内部指针(命令字节)的描述是正确的。

    通过更改我的程序以在读取到0x00之前调用命令字节、我能够使程序正确响应。  

    以下是生成适当行为的代码。 如果它可以帮助某人在未来,我肯定会很高兴,如果它被发送给他们:

    #包含
     int i2cDeviceAddress = 0x3F// TCA9554A I2C 器件地址
    void setup(){
     Wire.begin();

     Wire.beginTransmission(i2cDeviceAddress);
     // Wire.write (0x03);//配置寄存器
     //Wire.write (0b11111111);
     Wire.write (0x00)
     Wire.endTransmission ();
    void loop(){
     延迟(500);
     //读取输入状态
     // Wire.beginTransmission(i2cDeviceAddress);
     wire.requestFrom (i2cDeviceAddress、1)//请求输入端口状态
     if (Wire.available()){
      byte inputState = Wire.read ()//读取输入端口状态
      serial.print ("输入状态:")
      for (int i = 0;i < 8;i++)
       serial.print ((inputState >> I)和0x01)//打印每个输入状态
      
      serial.println ("L")
     
     //Wire.endTransmission ();