PCA9698 特点:
- 支持 40 个 GPIO(5 个 8 位端口:P0~P4)
- 每个端口可以配置为输入或输出
- 支持 I²C 通信
驱动结构设计
我们会包含以下几个函数:
// 初始化 PCA9698
void PCA9698_Init(I2C_HandleTypeDef *hi2c, uint8_t dev_addr);
// 设置端口方向(0=输出,1=输入)
HAL_StatusTypeDef PCA9698_SetDirection(uint8_t port, uint8_t direction_mask);
// 写端口输出
HAL_StatusTypeDef PCA9698_WritePort(uint8_t port, uint8_t value);
// 读端口输入
HAL_StatusTypeDef PCA9698_ReadPort(uint8_t port, uint8_t *value);
驱动代码(pca9698.c/h
)
ifndef PCA9698_H
define PCA9698_H
include “stm32f1xx_hal.h” // 修改为你所使用的系列
define PCA9698_NUM_PORTS 5
void PCA9698_Init(I2C_HandleTypeDef *hi2c, uint8_t dev_addr);
HAL_StatusTypeDef PCA9698_SetDirection(uint8_t port, uint8_t direction_mask);
HAL_StatusTypeDef PCA9698_WritePort(uint8_t port, uint8_t value);
HAL_StatusTypeDef PCA9698_ReadPort(uint8_t port, uint8_t *value);
endif
pca9698.c
include “pca9698.h”
static I2C_HandleTypeDef *pca9698_i2c;
static uint8_t pca9698_addr;
// PCA9698 寄存器地址
define PCA9698_REG_INPUT(n) (0x00 + (n))
define PCA9698_REG_OUTPUT(n) (0x08 + (n))
define PCA9698_REG_CONFIG(n) (0x18 + (n)) // 1=input, 0=output
void PCA9698_Init(I2C_HandleTypeDef *hi2c, uint8_t dev_addr) {
pca9698_i2c = hi2c;
pca9698_addr = dev_addr << 1; // HAL 要求左移1位
}
HAL_StatusTypeDef PCA9698_SetDirection(uint8_t port, uint8_t direction_mask) {
if (port >= PCA9698_NUM_PORTS) return HAL_ERROR;
uint8_t reg = PCA9698_REG_CONFIG(port);
return HAL_I2C_Mem_Write(pca9698_i2c, pca9698_addr, reg, I2C_MEMADD_SIZE_8BIT, &direction_mask, 1, HAL_MAX_DELAY);
}
HAL_StatusTypeDef PCA9698_WritePort(uint8_t port, uint8_t value) {
if (port >= PCA9698_NUM_PORTS) return HAL_ERROR;
uint8_t reg = PCA9698_REG_OUTPUT(port);
return HAL_I2C_Mem_Write(pca9698_i2c, pca9698_addr, reg, I2C_MEMADD_SIZE_8BIT, &value, 1, HAL_MAX_DELAY);
}
HAL_StatusTypeDef PCA9698_ReadPort(uint8_t port, uint8_t *value) {
if (port >= PCA9698_NUM_PORTS || value == NULL) return HAL_ERROR;
uint8_t reg = PCA9698_REG_INPUT(port);
return HAL_I2C_Mem_Read(pca9698_i2c, pca9698_addr, reg, I2C_MEMADD_SIZE_8BIT, value, 1, HAL_MAX_DELAY);
}
测试程序
include “pca9698.h”
// 假设使用 hi2c1
extern I2C_HandleTypeDef hi2c1;
void PCA9698_Test() {
PCA9698_Init(&hi2c1, 0x20); // 设备地址根据 A0~A2 配置
// 设置 P0 为输出
PCA9698_SetDirection(0, 0x00); // 全部输出
// 点亮所有 P0 引脚
PCA9698_WritePort(0, 0xFF);
HAL_Delay(1000);
// 熄灭所有 P0 引脚
PCA9698_WritePort(0, 0x00);
HAL_Delay(1000);
// 设置 P1 为输入
PCA9698_SetDirection(1, 0xFF);
uint8_t input;
if (PCA9698_ReadPort(1, &input) == HAL_OK) {
// 读取成功,input 保存了 P1 的状态
}
}
注意事项
- 地址配置:PCA9698 的 I²C 地址由 A0~A2 引脚决定(默认 0x20)。
- 电平驱动能力有限:PCA9698 适用于低电流应用,如驱动 LED、读取按键等。
- 中断支持:本驱动未实现中断(可选扩展)。
- 兼容性:确认你的 STM32 HAL 已初始化好 I2C 外设。