您好!
我已将 TCA9555端口0配置为输入、端口1配置为输入的前4个引脚和配置为输出的其余引脚。 TCA9555与 TM4C292NCPDT 搭配使用以实现输入操作。 只要我们在其中一个端口中提供输入、使所有引脚变为高电平或低电平、器件就会持续生成中断。 但是、如果我们在一分钟内提供两个端口组合的输入、则在主机读取端口状态 或端口输入状态改变后、它无法生成中断。 中断引脚始终取消置位。
有人能不能建议这种行为的原因是什么?
此致
巴拉
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.
您好!
我已将 TCA9555端口0配置为输入、端口1配置为输入的前4个引脚和配置为输出的其余引脚。 TCA9555与 TM4C292NCPDT 搭配使用以实现输入操作。 只要我们在其中一个端口中提供输入、使所有引脚变为高电平或低电平、器件就会持续生成中断。 但是、如果我们在一分钟内提供两个端口组合的输入、则在主机读取端口状态 或端口输入状态改变后、它无法生成中断。 中断引脚始终取消置位。
有人能不能建议这种行为的原因是什么?
此致
巴拉
您好、Bobby、
[引用用户="Bobby Nguyen ]我的初始想法:
发生这种情况的最简单方法是写入器件而不是读取器件、并通过配置寄存器将器件设置为输出。 当该器件的 GPIO 设置为输出时、INT 引脚将停止标记、但我认为 INT 引脚应保持高电平、如果是这样... [/报价]
我们在系统初始化时定义端口 I/O 配置–这不会改变运行时间。
[引用用户="Bobby Nguyen "]另一个想法是在发生这种情况之前查看 o 范围上的 Vcc 和复位引脚、以查看是否发生任何异常情况。
此器件没有复位引脚。
[引用 user="Bobby Nguyen ]您是否能够在此处为我们提供原理图? 如果没有、我们可以通过电子邮件尝试执行此操作。
请分享您的电子邮件、以便我可以分享原理图。
[引用 USER="Bobby Nguyen ]此外,您如何在端口上翻转逻辑? 示例:您是将一根导线从端口引脚 x 连接到 GND 和 Vcc、是将其连接到 MCU 并将其输出切换为高电平还是低电平、还是将其连接到某个传感器?[/quot]
所有端口 A 均配置为输入。 端口 B 的一部分是输入。 这是静态配置,不会更改。 输出驱动 MOSFET 的栅极。 输入处于逻辑电平、由示波器测量确认。
此致
巴拉
您好、Bobby、
[引用 user="Bobby Nguyen "-我想确保您在阅读时不会意外地编写内容、因为我看到客户有时会编写导致写入的编码错误。 我认为这也不是问题、但我想再次检查。 [/引述]此处是用于更好地理解的范围捕获。 这次使用 SCL 和 SDA。
这是最后一个中断的缩放版本。
最后一个中断后的最后一个 I2C 事务的缩放图像。
I2C 传输前的最后一个
[引用用户="Bobby Nguyen ]您的示波器画面显示端口随着时间的推移从高电平变为低电平、因此我想知道您在端口上执行的操作。 (在另一侧有上拉电阻的情况下、按下连接到 GND 的按钮?) 不过、我假设我能够看到它们与您的原理图连接的内容。这是外部输入、我们不知道确切的输入是什么。 为了进行仿真、我们生成了通用脉冲。
我将通过邮件分享原理图。
我从示波器中观察到、最后一次 I2C 读取的数据应全部为低电平。 但只有端口0变为低电平、端口1保持最后的状态、即高电平。 这是不生成中断的常见情况。 即、任何一个端口都不会更改为新状态或使用端口本身某些引脚会更改为新状态、而某些引脚会保持旧状态。
此致
巴拉
这种情况似乎与前面的解释略有不同。
首先、INT (bar)为低电平有效、而不是高电平有效。 所以问题不在于中断没有被发出、而是保持被发出。
其次、在不对数据传输进行详细的位分析的情况下、I2C 端口传输数据的数据传输似乎几乎正常(但见下文第五部分)、以响应导致当前中断的输入端口转换。
但是、第三、在每个有问题的情况下、在 I2C 数据转换期间都会发生输入端口转换、因此中断逻辑正确保持中断有效。
第四、问题不是 TCA9555、而是 ISR 不响应新中断。
此外、第五、数据表规定了100kHz 的最大时钟频率。 对于大约350kHz 的时钟频率、示波器迹线显示在20uS 内大约7个周期。 这可以解释图像 Jun 01 21:50:06中的 runt daa 脉冲。
您好、Matthew、
"首先、INT (bar)为低电平有效、而不是高电平有效。 所以问题不在于中断没有被置为有效、而是保持被置为有效。"
该器件的 INT 引脚是一种开漏架构、因此它意味着线路锁存为低电平、然后 INT 引脚的 NFET 将拉低(如您建议的那样)、或者 INT 总线上有另一个器件将其拉低。
"第二、在不对数据传输进行详细的位分析的情况下、I2C 端口传输数据的数据传输似乎几乎正常(但见下文第五部分)、以响应导致当前中断的输入端口转换。"
我查看了这些位、没有发现任何东西表明主器件在事务处理中做了任何错误。
"但是、第三、在每个有问题的情况下、在 I2C 数据转换期间都会发生输入端口转换、因此中断逻辑正确地将中断保持置为有效。"
嗯。 第一张图片显示、当端口在事务发生前发生变化时、INT 引脚会拉低。
"因此、第四个问题不是 TCA9555的问题、而是 ISR 不响应新中断的问题。"
ISR?
"此外、第五、数据表规定最大时钟频率为100kHz。 对于大约350kHz 的时钟频率、示波器迹线显示在20uS 内大约7个周期。 这可以解释图像 Jun 01 21:50:06中的 runt daa 脉冲。"
该器件能够在400kHz 下工作:
我相信您所讨论的 runt 脉冲(在 SDA 上?) 是当从器件和主器件交换 SDA 线的控制时(在一个 ACK 之前和一个 ACK 之后)。
谢谢、
-Bobby
您好、Bala、Francis、
现在 TCA9555工作正常似乎很明显、问题出在 ISR 中。 你同意吗?
第二次读取数据将会回答的问题是、确认在观察到的输入端口在数据传输期间发生变化的情况下、读取数据端口确实会清除 INT。 由于数据输入在第二次数据传输期间再次发生变化、范围观察结果不能回答此问题。 要回答这个问题、数据输入必须在第二个事务中保持恒定(高电平)。
此外、就术语而言、INT 为低电平、不会被"断言"、也不会被否定、而是会被断言。 INT 低电平信号中断。
Matthew、您好!
[引用用户="Matthew Reich"] 现在 TCA9555 工作正常、问题似乎出在 ISR 中。 您是否同意?[/引述]否 查看另一个示波器捕获。 处理器未能读取第二个中断、但根据 数据表建议、无论 I2C 读取如何、当端口状态发生变化时、INT 引脚将进入高电平状态。
当端口在 I2C 总线上进行数据传输时改变状态时、会出现问题。
此致
巴拉
您好、Bala、
我认为、在如何切换 INT 方面会产生一些困惑。 我已附上控制 INT 引脚的简化版原理图。 请注意、INT 引脚由 XOR 控制、这意味着如果它们是 Q 和 IO 引脚之间的差值、它将打开 FET 的栅极以将 nINT 引脚拉低。 如果两者均为高电平 或两者均为低电平、则 INT 不置为有效(低电平)。
这意味着、如果 IO 在读取前改变状态、则中断被置为有效(将 INT 引脚拉为低电平)。 这还意味着、如果 IO 引脚返回到其原始状态、则假设未发生读取 (INT 被释放并通过上拉电阻器被拉高)、INT 将被取消置位。 您显示的波形显示部件工作正常。
-弗朗西斯·胡德
您好、Bala、
示波器图片显示了正确的 TCA9555操作。
以下是事件的顺序:
INT H、端口 L、无传输:初始状态。 Int 取反
int L、port H、no transaction:端口状态变化导致内部数据(即 L)与输入数据不相等,导致 INT 置位。
INT H、端口 H、事务:之前 INT 置位触发 ISR、调度数据事务。 事务对端口数据进行采样、将内部数据更改为 H、匹配端口数据、导致 INT 否定。
int L、port L、no transaction:端口状态变化导致内部数据 H 与输入数据不相等、导致 INT 置位。
int H、port H、no transaction:端口状态变化导致内部数据(H)等于输入数据、导致 INT 否定。
INT H、端口 H、事务: 之前 INT 置位触发 ISR、调度数据事务。 事务对端口数据进行采样、从而将内部数据保持在 H、与端口数据匹配、从而导致 INT 保持否定状态。
此序列中没有问题。