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.

[参考译文] PCF8575C:何时需要写入0xFFFF 才能将此部件用作输入引脚?

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1066285/pcf8575c-when-is-a-write-0xffff-necessary-to-use-this-part-as-input-pins

部件号:PCF8575C
“线程: PCF8575”中讨论的其它部件

我对这种端口扩展器和中断有一个比喻,但我想首先澄清我这边可能存在的这种误解:

只写一次,然后等待中断并继续读取端口是否足够?

我不是一位母语者,对我来说,数据表中的表述是不明确的:

从 PCF8575C 读取数据之前,所有需要作为输入的端口都应设置为逻辑1。

但是,在使用本部分时,我每次在阅读前都必须写0xFFFF,或者我读了一些无效的值。

因此,我将数据表解释为“每次从 PCF8575C 读取数据之前,所有需要作为输入的端口都应设置为逻辑1。

这是真的,我是否以这种方式正确解释数据表?

或者,我是否确实应该能够一次写入0xFFFF (清除中断引脚),然后在 interupt 上重新读取端口状态,同时通过读取清除中断引脚?

在我手中,这个伪代码有效(现在不用担心 中断引脚)

但事实却是如此 
 write_PCF8575 (0xFFFF)
 port_status_16_bits = read_PCF8575()
***用结果做些什么

当此代码在首次读取后失败:

write_PCF8575 (0xFFFF) 
但事实却是如此
  port_status_16_bits = read_PCF8575()
***用结果做点事,但不要用任何东西重写 PCF8575

谢谢您给我带来了启发。

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

    0引脚驱动器严重不足。 1针弱驱动器偏高。 因此,为了能够读取针脚处的外部电压,它必须处于1状态。

    这意味着您只需执行一次写入操作。 (或根本不是,因为1是加电后的默认状态。)

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

    谢谢你,Cemens。

    我已经理解了这一部分。 不幸的是,看到我的伪代码,我在阅读之前已经将 PIN 写得很高,在阅读第一个后无法再读后续的单词。

    我一直在深入研究数据表,就我对逻辑方案的有限了解而言,一个引脚(概述一个 P 端口的二进制逻辑电路的数据表第12页)可以再次降低的唯一方法是写入0。

    在我的情况下,某种程度上,针脚“本身”会变低。 因此,我们可以认为这是一种异常情况,事实上,只写一遍就 足以进行多次读取了?!?

    在这种情况下,我应该尝试使用逻辑分析器。

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

    对拼写错误的克莱门斯表示歉意,无法编辑回复。

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

    您所描述的内容不应该发生。 请显示 write/read_PCF 函数。

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

    这是一个更大的代码的一部分,我在这里引用整个程序,在第30行中标记了基本行。 目标是在相应的雷达传感器检测到运动时激活继电器。 运动 通过光耦合器(817C)将 PCF8575C 拉至地电位。 下面的代码在 Raspberry Pi Zero W 上运行,就像一种魅力

    当我将基本代码 行移至 While 循环之前(即仅写入一次)时,所有继电器都不会立即激活,就像0x20 PCF8575C 在位上丢失了较高的电平一样。 仅连接了两个雷达探测器,其它 P 端口则断开连接。 当我换用 PCF8575C 换用另一个时,即我认为该芯片没有损坏。

    #!/usr/bin/env python3. 

    从 smbus 导入 SMBus
    将 RPI.GPIO 导入为 GPIO
    导入时间

    Interrup_GPIO = 17

    i2cbus = SMBus (1)
    i2摇摆= 0x20
    i2crelay = 0x21

    hibyte = 0xFF
    lobyte = 0xFF

    i2cbus.write_word_data (i2cronar,lobyte,hibyte)
    OldState = i2cbus.read_word_data (i2cronar,0x20)

    正确:
    i2cbus.write_word_data (i2cronar,lobyte,hibyte)#Essential
    端口状态= i2cbus.read_word_data (i2cronar,0x20)
    如果 portState != oldState:
    位数='{0:16b}'。格式(portState)
    打印 bits.zfill (16),",time.localtime ().tm_sec
    OldState =端口状态
    反射=(端口状态>>>8)和0xFF
    LoRReflect =(端口状态和0xFF)
    i2cbus.write_word_data (i2crelay,loReflect,hiReflect)
    时间睡眠(0.1)
    其他:
    时间睡眠(0.01)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SMBus 类假定设备具有寄存器,所有访问都以寄存器编号的写入开始。 PCF 的情况并非如此。

    要写入 PCF,请使用 i2cbus.write_byte_data (addr,lobyte,hibyte)
    要从 PCF 读取数据,请使用 i2cbus.read_word_data (addr,lobyte)

    (write_byte_data 调用预先显示第一个数据字节是寄存器编号。 read_word_data 调用写入 PCF 忽略的字节,因为它只在写入两个字节后才起作用。)

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

    克莱门斯,你好,我接受你的话,但你建议的代码 无法解决这个问题。

    只要“基本”行不在 while 循环内,我就会看到读取端口上的位数在一秒内(一秒一秒一),而不管字词或字节读/写如何。

    一般来说,下降的顺序是从低到高的位(用16位字表示),但不完全是这样,而且不是每次都是一样的。

    我换了主板,试图降低 Vcc (Vcc Min 显然不起作用,因为 Vcc Min 是4.5V)。

    然后,我在 Vcc 和端口引脚之间添加了5 MΩ 电阻器(用于连接到雷达模块的2个引脚)。

    然后,该代码(写0xFFFF 一次)适用于带有电阻器的两个引脚,但其他引脚仍会掉落。

    因此,我怀疑是由于电容负载(尽管印刷电路板轨道只有5厘米长,并在针座中末端),针脚无法保持“1”状态,并且只有在写了一封信后才会短暂保持“1”状态(向上摆动,然后衰减低?)。 换言 之:内部上拉电阻器似乎无法提供足够的功率来保持针脚处于“上”状态。 测量未连接输入 引脚的电压水平可确认这一点。  当   Vcc 为5V 时,用“1”编写的引脚读数为145 mV (只要万用表读数稳定并减速到零),而用“1”编写的引脚读数为1.9V)。 连接电压表(Voltcraft VC170)足以将针脚拉低(不幸的是我没有示波器或逻辑分析仪)。

    这似乎也符合数据表(第15页)的图13,在示例针脚 P5上的电压上升时间,iOHT 高于 IOH (根据表中的数字为-10mA 与-4mA)。

    只需用裸手触摸曾经写入“1”状态但自那以后跌落的针脚,就足以间歇性读取“1”。

    因此,我还不知道问题的确切原因,但我可以通过为每个输入引脚向 PCB 添加拉电阻器来设计问题的解决方案。 除非,当然,鉴于上述观察,你可以给我一个更好的解决方案。

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

    IOHT 仅在 ACK 期间激活。 如果您的外部设备没有主动驱动高电平,您确实需要一个上拉电阻器。

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

    直到现在,我才意识到这一点。 谢谢,这解释了一切。

    另一个问题是全面 了解 PCF8575和 PCF8575C 之间的区别: 在 PFC8575 (无 C)的方框图中,输出引脚   通过 p 通道 MOSFET 连接到100 mA 电流源。 使用 PCF8575代替 PCF8575C 是否能解决我的问题?  当向翻转器写入高电平时,逆变器将其转换为低电平,并将低电平馈送到 p 通道 MOSFET 的栅极,该栅极将打开100mA 电流源并将其连接至输出引脚。

    还是同一活动仅限于此处的 ACK 时间?

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

    您好,

    [引用 userid="509326" url="~ë/support/interface-group/interface/f/interface-forum/1066285/pcf8575c-when-a-write-0xffff-必需使用的此部件输入针脚/3949025#3949025]\n 尽管如此,我的怀疑是由于电容式导轨的长度较低,只能在电容式电容式导轨上保持5厘米(5厘米),但只能在电容式电容式导轨长度上。 换言 之:内部上拉电阻器似乎无法提供足够的功率来保持针脚处于“上”状态。 测量未连接输入 引脚的电压水平可确认这一点。  当   Vcc 为5V 时,用“1”编写的引脚读数为145 mV (只要万用表读数稳定并减速到零),而用“1”编写的引脚读数为1.9V)。 连接电压表(Voltcraft VC170)足以将针脚拉低(不幸的是我没有示波器或逻辑分析仪)。[/quot]

    您的怀疑是正确的。 由于 PCB 迹线和其他寄生虫,除非出现 ACK (如克莱门斯所述),否则 P 端口将偏离低状态超时。 存在 ACK 时,存在典型 IOHT =~Ω-1mA。 根据第12页图8.2.2中的电流方向,电流从 P 端口到 VCC。 一旦确认信号消失,寄生虫将接管,P 端口将漂浮回到低电势通常为 GND,除非存在外部上拉。 通过快速研究,Raspberry Pi 的内部上拉电阻器看起来像50k - 60k Ω 电阻器,在 I2C 方面非常弱。 这就是为什么当使用更强的外部抽拉时,问题就会消失。

    [引用 userid="509326" url="~ë/support/interface-group/interface/f/interface-forum/1066285/pcf8575c-when-a-write-0xffff- necess-to-to-use-this-party-input-pins/85739495c#3949179]*另一个问题是     如何通过 F85100引脚(FPC75)与 PFP85 的输出电流表的源线路完全了解 F85的电流差。 使用 PCF8575代替 PCF8575C 是否能解决我的问题?  当向翻转器写入高电平时,逆变器会将低电平转换为低电平,并将低电平馈送到 p 通道 MOSFET 的栅极,该栅极将打开100mA 电流源并将其连接至输出引脚。[/quot]

    我认为这是数据表中的一个错误,它显示为“100mA”。 我认为这应该是一个100uA 的当前来源。 不管出现什么错误,这个想法都是一样的。 这将解决您的问题,因为从100uA 电流源上拉至 VCC,P 端口将保持高位,而不管寄生虫如何。 要克服偏差,应将 p 端口驱动到较低位置。  

    这是 PCF8575和 PCF8575C 之间的唯一区别是内部100uA 电流源。

    此致,

    泰勒