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 的状态
}

}

注意事项

  1. 地址配置:PCA9698 的 I²C 地址由 A0~A2 引脚决定(默认 0x20)。
  2. 电平驱动能力有限:PCA9698 适用于低电流应用,如驱动 LED、读取按键等。
  3. 中断支持:本驱动未实现中断(可选扩展)。
  4. 兼容性:确认你的 STM32 HAL 已初始化好 I2C 外设。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注