查看: 57|回复: 0

[分享] 用 libusbsio 测试 LPC51U68 的 I2C ISP 通信

[复制链接]

该用户从未签到

734

主题

6393

帖子

0

超级版主

Rank: 8Rank: 8

积分
26030
最后登录
2025-10-24
发表于 3 天前 | 显示全部楼层 |阅读模式
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 模式的关键在于上电时的引脚状态配置。具体步骤如下:
Snipaste_2025-10-24_12-09-56.png
•        按键配置:
o        同时按住 ISP0 和 ISP1,使其保持低电平
•        上电顺序建议
1.        按住 SW0 和 SW1
2.        插入 USB,给板子上电
3.        保持约 100ms 后释放按键
4.        MCU 进入 ISP 模式,等待主机通过 I2C 通信


3. 上位机程序实现
3.1 初始化关键代码

  1. /* 查找并打开设备 */
  2. ret = LPCUSBSIO_GetNumPorts(LPCUSBSIO_VID, LPCUSBSIO_PID);
  3. if (ret == 0) {
  4.     ret = LPCUSBSIO_GetNumPorts(LPCUSBSIO_VID, MCULINKSIO_PID);
  5.     if (ret == 0) return -1;
  6. }

  7. dev_handle = LPCUSBSIO_Open(0);
  8. if (dev_handle == NULL) return -2;

  9. fprintf(stdout, "%s\n", LPCUSBSIO_GetVersion(dev_handle));

  10. /* 配置 I2C */
  11. I2C_PORTCONFIG_T i2c_cfg = {
  12.     .ClockRate = I2C_CLOCK_FAST_MODE,
  13.     .Options   = 0U,
  14. };
  15. i2c_handle = I2C_Open(dev_handle, &i2c_cfg, 0);

  16. /* 初始化 ISP 结构体 */
  17. s_isp.pdev = i2c_handle;
  18. s_isp.xfer = app_isp_issue_command;

  19. lpc_isp_init(&s_isp);
  20. lpc_isp_probe(&s_isp);
复制代码
3.2 Get Version 函数实现
  1. int lpc_isp_get_version(lpc_isp_t *isp, uint8_t *ver) {
  2.     uint8_t tx_buf[8];
  3.     uint8_t rx_buf[8];

  4.     tx_buf[0] = 0xA1;

  5.     lpc_isp_i2c_xfer_t xfer = {
  6.         .address = LPC_ISP_I2C_ADDR,
  7.         .tx_data = tx_buf,
  8.         .tx_size = 1,
  9.         .rx_data = rx_buf,
  10.         .rx_size = 6,
  11.     };

  12.     if (isp->xfer(isp->pdev, &xfer) < 0) return -1;
  13.     if (rx_buf[0] != 0x55 || rx_buf[1] != 0xA1) return -2;

  14.     ver[0] = rx_buf[4]; // Major version
  15.     ver[1] = rx_buf[5]; // Minor version
  16.     return 0;
  17. }
复制代码


4. 实验结果:

4.1 RM 手册 Get Version 命令说明
Snipaste_2025-10-24_12-15-21.png
可以看出command get version 的命令为0xA1,并且一个字节。
response 回应为6个字节。
4.2 实际逻辑分析仪波形
new.png
通过逻辑分析仪截图可以看出 I2C 总线上发送 0xA1 命令和接收响应包
对比 RM 手册字段:确认 SOP、命令码、长度、版本号是一致的。


5. 结论
本文展示了如何使用 libusbsio 与 LPC51U68 I2C ISP 通信。通过编写 PC 上位机程序,可以方便地完成芯片固件版本查询等操作。这种方法的优势是:
•        无需额外编程器,直接利用板载 LPC-Link2
•        I2C 接口灵活,适合嵌入式系统调试和量产编程
•        上位机程序可扩展,便于集成进自动化工具链



回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-10-27 12:25 , Processed in 0.118078 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表