ESP32-P4硬件IIC驱动XL9555实现IO扩展
1. 项目概述在嵌入式系统开发中IO扩展是一个常见需求。ESP32-P4作为一款功能强大的微控制器其内置的硬件IIC接口可以方便地连接各种外设。本章实验将重点介绍如何使用ESP32-P4的硬件IIC接口驱动XL9555 IO扩展芯片实现IO口扩展功能。2. 硬件设计2.1 硬件资源实验使用以下硬件资源ESP32-P4开发板XL9555 IO扩展芯片LED指示灯蜂鸣器三个按键2.2 原理图分析XL9555通过IIC总线与ESP32-P4连接SDA连接GPIO33SCL连接GPIO32INT中断引脚连接GPIO36扩展IO分配如下EXIO_0蜂鸣器控制EXIO_8~EXIO_10三个按键输入EXIO_13LED1控制3. IIC协议基础3.1 IIC总线特点IIC(Inter-Integrated Circuit)是一种两线式串行总线具有以下特点仅需SDA(数据线)和SCL(时钟线)两根线支持多主多从架构每个设备有唯一地址标准模式速率100kbps快速模式400kbps3.2 IIC通信时序关键时序信号包括起始条件SCL高电平时SDA由高变低停止条件SCL高电平时SDA由低变高数据有效性SCL高电平期间SDA必须保持稳定应答信号每字节传输后接收方需发送ACK4. XL9555芯片详解4.1 芯片特性XL9555是一款16位GPIO扩展器主要特性工作电压2.3V-5.5V支持400kHz IIC通信可配置输入/输出模式内置上电复位电路中断输出功能4.2 寄存器说明XL9555包含8个寄存器输入端口寄存器(0x00-0x01)读取IO输入状态输出端口寄存器(0x02-0x03)设置IO输出电平极性反转寄存器(0x04-0x05)配置输入极性配置寄存器(0x06-0x07)设置IO方向5. 程序设计5.1 IIC驱动实现使用ESP-IDF提供的IIC驱动API#include driver/i2c_master.h // IIC初始化 i2c_master_bus_config_t bus_config { .i2c_port I2C_NUM_0, .sda_io_num GPIO_NUM_33, .scl_io_num GPIO_NUM_32, .clk_source I2C_CLK_SRC_DEFAULT, .glitch_ignore_cnt 7, .flags.enable_internal_pullup true }; i2c_new_master_bus(bus_config, bus_handle); // 添加设备 i2c_device_config_t dev_config { .dev_addr_length I2C_ADDR_BIT_LEN_7, .device_address 0x24, .scl_speed_hz 400000 }; i2c_master_bus_add_device(bus_handle, dev_config, xl9555_handle);5.2 XL9555驱动函数关键函数实现// 写入寄存器 esp_err_t xl9555_write_byte(uint8_t reg, uint8_t *data, size_t len) { uint8_t *buf malloc(1 len); buf[0] reg; memcpy(buf 1, data, len); esp_err_t ret i2c_master_transmit(xl9555_handle, buf, len 1, -1); free(buf); return ret; } // 读取寄存器 esp_err_t xl9555_read_byte(uint8_t *data, size_t len) { uint8_t reg_addr XL9555_INPUT_PORT0_REG; return i2c_master_transmit_receive(xl9555_handle, reg_addr, 1, data, len, -1); }5.3 按键扫描实现uint8_t xl9555_key_scan(uint8_t mode) { static uint8_t key_up 1; uint8_t keyval 0; if (mode) key_up 1; if (key_up (KEY0 0 || KEY1 0 || KEY2 0)) { esp_rom_delay_us(10000); key_up 0; if (KEY0 0) keyval KEY0_PRES; if (KEY1 0) keyval KEY1_PRES; if (KEY2 0) keyval KEY2_PRES; } else if (KEY0 1 KEY1 1 KEY2 1) { key_up 1; } return keyval; }6. 应用实现6.1 主程序逻辑void app_main(void) { // 初始化NVS、IIC和XL9555 nvs_flash_init(); myiic_init(); xl9555_init(); while(1) { uint8_t key xl9555_key_scan(0); switch(key) { case KEY0_PRES: // 打开LED和蜂鸣器 xl9555_pin_write(LED_1_IO, 0); xl9555_pin_write(BEEP_IO, 0); break; case KEY1_PRES: // 关闭LED xl9555_pin_write(LED_1_IO, 1); break; case KEY2_PRES: // 关闭蜂鸣器 xl9555_pin_write(BEEP_IO, 1); break; } vTaskDelay(pdMS_TO_TICKS(10)); } }6.2 功能验证下载程序后可以通过按键测试功能按下KEY0LED1亮蜂鸣器响按下KEY1LED1灭按下KEY2蜂鸣器停止7. 注意事项与调试技巧7.1 常见问题IIC通信失败检查硬件连接是否正确确认上拉电阻已接(通常4.7kΩ)用逻辑分析仪抓取波形分析时序XL9555无响应确认设备地址正确(默认0x24)检查电源电压是否在2.3V-5.5V范围内测量INT引脚状态判断芯片是否工作7.2 优化建议中断方式优化配置XL9555中断引脚使用GPIO中断替代轮询扫描减少CPU占用率电源管理不使用时进入低功耗模式动态调整IIC时钟速度错误处理增加通信失败重试机制添加超时判断完善错误日志记录8. 扩展应用8.1 多设备扩展XL9555支持通过A0-A2地址引脚扩展最多8个设备为每个XL9555分配不同地址使用IIC多设备通信可实现最多128个GPIO扩展8.2 与其他外设配合连接矩阵键盘驱动多位数码管扩展SPI或UART接口构建复杂的输入输出系统8.3 高级功能开发实现热插拔检测开发状态监控系统构建自动化测试平台集成到物联网节点中

相关新闻

基于YOLO系列算法的车型识别系统开发与实践

基于YOLO系列算法的车型识别系统开发与实践

1. 项目概述常见车型识别系统是基于YOLO系列目标检测算法开发的智能视觉应用,能够自动识别图像或视频中的各类车辆型号。这个系统整合了YOLOv5到YOLOv8多个版本的算法实现,采用PySide6构建用户界面,并提供了完整的训练代码,形成了…

2026/10/29 1:06:14 阅读更多 →
Cocos Creator移动端地形LOD实战:Chunked LOD方案与性能优化

Cocos Creator移动端地形LOD实战:Chunked LOD方案与性能优化

1. 项目概述:为什么远距离地形LOD是移动端开发的“必修课”做开放世界或者大场景游戏的朋友,肯定都遇到过这个头疼的问题:地图做得越大、越精细,远处的山和树还没看清,手机就开始发烫,帧率直线下降。这背后…

2026/10/28 12:08:36 阅读更多 →
鸿蒙 ArkTS 实战:Device Battery Wall 从效率工具到状态管理完整解析

鸿蒙 ArkTS 实战:Device Battery Wall 从效率工具到状态管理完整解析

鸿蒙 ArkTS 实战:Device Battery Wall 从效率工具到状态管理完整解析 前言 Device Battery Wall 是一个面向 设备电量墙 的鸿蒙 ArkTS 单页工具。项目通过条目列表、统计卡片、辅助开关和状态切换,把一个高频效率场景整理为可操作页面。 它服务于 集中…

2026/10/29 1:06:24 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/30 0:01:36 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/29 8:45:01 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/29 9:52:56 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/30 0:01:37 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/29 9:51:34 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/29 8:44:28 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 17:01:10 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 9:42:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 0:01:33 阅读更多 →