前面测试的PCF8574T模块中有一个INT引出端,在测试的时候,虽然加入了输入输出的测试,但没有看到这个引出端有任何电平变化。为此专门查看了数据手册。根据手册中电路框图构成:

以及功能描述框图:

可以看到INT引出端子的信号变化和读写脉冲以及data to shift register三个信号有关。在读取模式下,

在输入模式下,当PCF8574的并行端口的某个输入信号端(任意哪个端口)有电平变化时,才会触发INT端。注意,这里说的是外部导致的电平信号变化,如果时候通过内部指令改变输入信号的,是无效的。因此我之前的测试程序是不可能触发产生INT信号。另外INT这个输出端子,在内部结构上是开漏结构,使用时需要加上上拉电阻才行。
上面说了,要在输入模式下,某个引脚发生电平变化时回触发INT变化,但PCF8574没有专用方向寄存器,其I/O的输入输出模式由写入操作隐式决定。当某个端口被写入“1”的时候,那么这个端口就算是进入输入模式。这些端口内部有弱上拉(100K电阻),因此写入“1”,端口呈现为高电平。而如果端口被写入为“0”,那么外部即施加高电平,也不会改变输入数据变成“1”。端口的驱动能力比较弱,

所以利用灌电流是可以直接驱动小型LED的(φ3或者φ5)。INT端的信号,必须在INT触发后进行一次读写操作,才能完成清除动作。
为了测试INT,需要修改程序,输出FF到端口,使所有端口呈现为输入模式,此时使用按钮在或者直接使用导线短路端子到地,如果正常的话,此时INT端输出“0”,外接上拉LED的话,就应该亮。
#include "Wire.h"
#define ADDR 0x20
void setup() {
Serial.begin(115200);
Wire.begin();
Serial.printf("Write data=255 \n" );
Wire.beginTransmission(ADDR);
Wire.write(0xff);
Wire.endTransmission();
}
void loop() {
Serial.printf("Read data:%x \n" , Read_PCF8574()); //Read IO
delay(5000);
}
uint8_t Read_PCF8574(void) {
uint8_t data = 0;
Wire.requestFrom(ADDR, 1);
while (Wire.available()) {
data = Wire.read();
}
return data;
}测试时,等程序稳定后。使用导线短接某个端子到地,确实可以看到INT端子所在的上拉电阻连接的LED亮了。保持接地不变,等待5秒后,INT端的电平会由于读PCF8574T的读操作而被置位为“1”,INT连接的LED灭。此时之前端子保持接地的那个导线,断开与地的连接,,INT连接的LED再亮,证明了端口电平的变化,无论是从“0”变成“1”,还是从“1”变成“0”,都会触发INT输出端输出为“0”。
我要赚赏金
