Arduino与Proteus仿真实例-PCA9555IO扩展器驱动仿真

PCA9555IO扩展器驱动仿真

1、PCA9555介绍

PCA9555 是一款 24 引脚 CMOS 器件,可为 I²C 总线/SMBus 应用提供 16 位通用并行输入/输出 (GPIO) 扩展,旨在增强恩智浦半导体的 I2C 总线 I/O 扩展器系列。这些改进包括更高的驱动能力、5 V I/O 容差、更低的电源电流、独立的 I/O 配置和更小的封装。当 ACPI 电源开关、传感器、按钮、LED、风扇等需要额外的 I/O 时,I/O 扩展器提供了一个简单的解决方案。

PCA9555 由两个 8 位配置(输入或输出选择)组成;输入、输出和极性反转(高电平有效或低电平有效操作)寄存器。系统控制器可以通过写入 I/O 配置位来启用 I/O 作为输入或输出。每个输入或输出的数据保存在相应的输入或输出寄存器中。读寄存器的极性可以用极性反转寄存器反转。所有寄存器都可以由系统控制器读取。

当任何输入状态与其对应的输入端口寄存器状态不同时,PCA9555 开漏中断输出被激活,并用于向系统控制器指示输入状态已改变。上电复位将寄存器设置为其默认值并初始化设备状态机。

三个硬件引脚(A0、A1、A2)改变固定的 I²C 总线地址,并允许多达八个设备共享相同的 I2C 总线/SMBus。 PCA9555 的固定 I²C 总线地址与 PCA9554 相同,允许多达八个这些设备以任意组合共享相同的 I2C 总线/SMBus。

在这里插入图片描述

PCA9555的引脚功能如下:

在这里插入图片描述

PCA9555有如下特性:

  • 工作电源电压范围为 2.3 V 至 5.5 V
  • 5 V 耐压 I/O
  • 极性反转寄存器
  • 低电平有效中断输出
  • 低待机电流
  • SCL/SDA 输入上的噪声滤波器
  • 上电无故障
  • 内部上电复位
  • 16 个 I/O 引脚,默认为 16 个输入
  • 0 Hz 至 400 kHz 时钟频率
  • ESD 保护超过 JESD22-A114 的 2000 V HBM、JESD22-A115 的 200 V MM 和 JESD22-C101 的 1000 V CDM
  • 对超过 100 mA 的 JEDEC 标准 JESD78 进行闩锁测试
  • 提供五种封装:SO24、SSOP24、TSSOP24、HVQFN24 和 HWQFN24

2、仿真电路原理图

在这里插入图片描述

3、仿真代码实现

本次实例使用到如下开源库:

演示代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#define \_DEBUG

#ifdef \_DEBUG
#define \_CONSOLE
#define BAUDRATE 9600
#else
#undef \_CONSOLE
#endif

#include "Arduino.h"
#include "PCA9555.h"

#define PCA9555\_INTERRUPT\_PIN 2 // PCA9555 interrupt on pin ~D11 (INT0)
#define PCA9555\_ADDRESS 0x20 // device address of PCA9555

PCA9555 pca9555 = PCA9555(2); // instance of PCA9555 without interrupt

void setup() {
// pin initialization
pinMode(PCA9555_INTERRUPT_PIN, INPUT_PULLUP); // pin initialization for PCA9555 interrupt input with internal pull-up resistor enabled
attachInterrupt(digitalPinToInterrupt(PCA9555_INTERRUPT_PIN), PCA9555_interruptHandler, FALLING); // enable interrupt handler for PCA9555 interrupt with falling edge trigger

// initialize serial communication
#ifdef \_CONSOLE
Serial.begin(BAUDRATE); // open serial communications with defined baudrate
// loop not required for debug console only
while (!Serial) {
; // wait until port is open (only necessary for native USB port)
}
delay(500);
#endif

// initialize the PCA9555
pca9555.begin(PCA9555_ADDRESS, &Wire); // initialization of the PCA9555
for (uint8\_t i = 0; i < 16; i++){
pca9555.pinMode(i, OUTPUT); // configure all pins as output
pca9555.digitalWrite(i,LOW);
}

#ifdef \_CONSOLE
Serial.println("\nStarting application...");
Serial.println("Application successfully started, all tasks are running");
#endif
}
int pin = 0;
void loop() {
for(uint8\_t i = 0;i < 16;i++){
pca9555.digitalWrite(i,HIGH);
delay(100);
}
for(uint8\_t i = 0;i < 16;i++){
pca9555.digitalWrite(i,LOW);
delay(100);
}
}

void PCA9555\_interruptHandler() {
#ifdef \_DEBUG
Serial.println("PCA9555 interrupt has occured");
#endif
}


4、仿真结果

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/121720530