在线时间2239 小时
UID3253523
注册时间2016-3-21
NXP金币4438
该用户从未签到
超级版主
 
- 积分
- 26030
- 最后登录
- 2025-10-24
|
1. 概述
在 NXP 的 LPC 系列 MCU 中,除了常见的 UART ISP 外,还支持通过 I2C 接口进入 ISP 模式,实现固件下载和调试。本文将基于 LPC51U68 的 I2C ISP 功能,利用 libusbsio 库编写上位机程序,通过 板载 LPC-Link2 调试器 作为 USB-I2C 桥,完成主机与目标 MCU 的通信实验。
硬件环境
• 目标 MCU:LPC51U68(板载 LPC-Link2)
• USB 桥接器:板载 LPC-Link2,作为 USB → I2C Bridge
• 上位机:Windows/Linux,编译并运行 libusbsio 应用
软件环境
• libusbsio 库
• C 语言编写的测试程序
• 编译环境:GCC/MinGW(Windows)或 gcc(Linux)
2. 背景知识
2.1 libusbsio 简介
libusbsio(USB Serial I/O Library)是 NXP 提供的一套上位机库,支持 PC 程序通过 USB 调用 I2C、SPI、GPIO 接口与目标 MCU 通信。其工作原理是:
• 上位机 API → USB 消息
• USB 消息 → LPC-Link2 / MCU-Link
• LPC-Link2 / MCU-Link → 目标 MCU 的 I2C / SPI / GPIO
因此,我们只需要编写 PC 应用,就能方便地通过 USB 与目标 MCU 交互。
2.2 LPC51U68 I2C ISP 特性
LPC51U68 内置 ROM Bootloader,支持多种 ISP 通信方式(UART、I2C、SPI、USB)。
其中 I2C ISP 特点:
• 作为 I2C 从机 工作
• 地址默认为 0x18(可在 ROM 手册中确认)
• 通过标准 IAP/ISP 命令完成固件烧写、擦除、读取等操作
2.3 如何进入 I2C ISP 模式
根据 LPC51U68 的原理图和 Boot ROM 设计,进入 I2C ISP 模式的关键在于上电时的引脚状态配置。具体步骤如下:
• 按键配置:
o 同时按住 ISP0 和 ISP1,使其保持低电平
• 上电顺序建议:
1. 按住 SW0 和 SW1
2. 插入 USB,给板子上电
3. 保持约 100ms 后释放按键
4. MCU 进入 ISP 模式,等待主机通过 I2C 通信
3. 上位机程序实现
3.1 初始化关键代码
- /* 查找并打开设备 */
- ret = LPCUSBSIO_GetNumPorts(LPCUSBSIO_VID, LPCUSBSIO_PID);
- if (ret == 0) {
- ret = LPCUSBSIO_GetNumPorts(LPCUSBSIO_VID, MCULINKSIO_PID);
- if (ret == 0) return -1;
- }
- dev_handle = LPCUSBSIO_Open(0);
- if (dev_handle == NULL) return -2;
- fprintf(stdout, "%s\n", LPCUSBSIO_GetVersion(dev_handle));
- /* 配置 I2C */
- I2C_PORTCONFIG_T i2c_cfg = {
- .ClockRate = I2C_CLOCK_FAST_MODE,
- .Options = 0U,
- };
- i2c_handle = I2C_Open(dev_handle, &i2c_cfg, 0);
- /* 初始化 ISP 结构体 */
- s_isp.pdev = i2c_handle;
- s_isp.xfer = app_isp_issue_command;
- lpc_isp_init(&s_isp);
- lpc_isp_probe(&s_isp);
复制代码 3.2 Get Version 函数实现
- int lpc_isp_get_version(lpc_isp_t *isp, uint8_t *ver) {
- uint8_t tx_buf[8];
- uint8_t rx_buf[8];
- tx_buf[0] = 0xA1;
- lpc_isp_i2c_xfer_t xfer = {
- .address = LPC_ISP_I2C_ADDR,
- .tx_data = tx_buf,
- .tx_size = 1,
- .rx_data = rx_buf,
- .rx_size = 6,
- };
- if (isp->xfer(isp->pdev, &xfer) < 0) return -1;
- if (rx_buf[0] != 0x55 || rx_buf[1] != 0xA1) return -2;
- ver[0] = rx_buf[4]; // Major version
- ver[1] = rx_buf[5]; // Minor version
- return 0;
- }
复制代码
4. 实验结果:
4.1 RM 手册 Get Version 命令说明
可以看出command get version 的命令为0xA1,并且一个字节。
response 回应为6个字节。
4.2 实际逻辑分析仪波形
通过逻辑分析仪截图可以看出 I2C 总线上发送 0xA1 命令和接收响应包
对比 RM 手册字段:确认 SOP、命令码、长度、版本号是一致的。
5. 结论
本文展示了如何使用 libusbsio 与 LPC51U68 I2C ISP 通信。通过编写 PC 上位机程序,可以方便地完成芯片固件版本查询等操作。这种方法的优势是:
• 无需额外编程器,直接利用板载 LPC-Link2
• I2C 接口灵活,适合嵌入式系统调试和量产编程
• 上位机程序可扩展,便于集成进自动化工具链
|
|