Richard_SJ1 2025-07-06 11:20 采纳率: 100%
浏览 17
已结题

Windows GUI FTDI芯片及驱动程序

想建一个VS2022 C++ WINDOWS GUI 的 FTDI 公司 MPSSE 程序。
Build VS2022 libMPSSE-I2C no problem.

Thank you!

Richard

  • 写回答

7条回答 默认 最新

  • 檀越@新空间 2025-07-06 11:21
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    很高兴你成功构建了 libMPSSE-I2C!这是一个非常有用的库,用于通过 FTDI 芯片(如 FT232H、FT2232H 等)实现 I²C 通信。接下来,我将为你提供一个 完整的 C++ Windows GUI 应用程序示例,使用 VS2022 编写,并集成 libMPSSE-I2C 来操作 FTDI 设备。


    ✅ 目标

    • 使用 VS2022 创建一个 Windows GUI 应用程序
    • 集成 libMPSSE-I2C 实现 I²C 通信
    • 提供基本的 UI 控件:按钮、文本框等
    • 展示如何读取和写入 I²C 设备(例如:EEPROM)

    🧰 所需工具与依赖

    1. Visual Studio 2022(社区版或专业版)
    2. libftdilibMPSSE-I2C(已构建成功)
    3. FTDI D2XX Driver(安装在系统中)
    4. FTDI Chip (e.g., FT232H, FT2232H)(硬件设备)

    🔧 步骤一:创建 Win32 Application 项目

    1. 打开 Visual Studio 2022
    2. 选择 Create a new project
    3. 搜索并选择 Win32 Console ApplicationWin32 Project(GUI)
    4. 设置项目名称,如 FTDI_I2C_GUI
    5. 在向导中选择:
      • Application Type: GUI application
      • Additional options: 勾选 Empty project

    📁 步骤二:添加源文件和头文件

    1. 右键项目 → 添加新项 → 选择 C++ 文件 (.cpp)
      • 名称:main.cpp
    2. 右键项目 → 添加新项 → 选择 Header File (.h)
      • 名称:ftdi_i2c.h

    📄 步骤三:编写代码

    1. ftdi_i2c.h

    #pragma once
    
    #include <windows.h>
    #include <iostream>
    #include "libMPSSE-I2C.h" // 根据你的 libMPSSE-I2C 安装路径调整
    
    // 定义 I²C 地址
    #define I2C_DEVICE_ADDRESS 0x50
    
    // 函数声明
    bool InitializeFTDI();
    void CloseFTDI();
    bool WriteI2C(uint8_t regAddr, uint8_t data);
    bool ReadI2C(uint8_t regAddr, uint8_t* data);
    

    2. main.cpp

    #include "ftdi_i2c.h"
    #include <string>
    #include <sstream>
    
    // 全局变量
    FT_HANDLE ftHandle = NULL;
    
    // 初始化 FTDI 设备
    bool InitializeFTDI() {
        FT_STATUS ftStatus;
        ftStatus = FT_Open(0, &ftHandle); // 打开第一个 FTDI 设备
        if (ftStatus != FT_OK) {
            MessageBox(NULL, "Failed to open FTDI device!", "Error", MB_OK | MB_ICONERROR);
            return false;
        }
    
        // 设置 MPSSE 模式
        ftStatus = FT_SetUSBParameters(ftHandle, 64, 64);
        if (ftStatus != FT_OK) {
            MessageBox(NULL, "Failed to set USB parameters!", "Error", MB_OK | MB_ICONERROR);
            return false;
        }
    
        ftStatus = FT_SetBitMode(ftHandle, 0x00, FT_BITMODE_MPSSE);
        if (ftStatus != FT_OK) {
            MessageBox(NULL, "Failed to set bit mode to MPSSE!", "Error", MB_OK | MB_ICONERROR);
            return false;
        }
    
        // 初始化 I²C
        ftStatus = I2C_Init(ftHandle);
        if (ftStatus != FT_OK) {
            MessageBox(NULL, "Failed to initialize I²C!", "Error", MB_OK | MB_ICONERROR);
            return false;
        }
    
        return true;
    }
    
    // 关闭 FTDI 设备
    void CloseFTDI() {
        if (ftHandle != NULL) {
            I2C_Close(ftHandle);
            FT_Close(ftHandle);
            ftHandle = NULL;
        }
    }
    
    // 写 I²C 数据
    bool WriteI2C(uint8_t regAddr, uint8_t data) {
        FT_STATUS ftStatus = I2C_Write(ftHandle, I2C_DEVICE_ADDRESS, &regAddr, 1, &data, 1);
        return ftStatus == FT_OK;
    }
    
    // 读 I²C 数据
    bool ReadI2C(uint8_t regAddr, uint8_t* data) {
        FT_STATUS ftStatus = I2C_Read(ftHandle, I2C_DEVICE_ADDRESS, &regAddr, 1, data, 1);
        return ftStatus == FT_OK;
    }
    

    🧩 步骤四:创建 GUI 界面

    1. 右键项目 → 添加新项 → 选择 Resource File (.rc)
    2. 在资源编辑器中,添加以下控件:
      • Button: ID: IDC_WRITE_BUTTON, Text: "Write"
      • Button: ID: IDC_READ_BUTTON, Text: "Read"
      • Edit Control: ID: IDC_REG_ADDR_EDIT, Text: "0x00"
      • Edit Control: ID: IDC_DATA_EDIT, Text: "0x00"
      • Static Text: ID: IDC_RESULT_TEXT, Text: "Result: ..."

    🧠 步骤五:处理消息循环

    main.cpp 中加入以下内容:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
        switch (message) {
        case WM_COMMAND:
            if (LOWORD(wParam) == IDC_WRITE_BUTTON) {
                char regStr[10], dataStr[10];
                GetWindowText(GetDlgItem(hWnd, IDC_REG_ADDR_EDIT), regStr, sizeof(regStr));
                GetWindowText(GetDlgItem(hWnd, IDC_DATA_EDIT), dataStr, sizeof(dataStr));
    
                uint8_t regAddr = (uint8_t)strtol(regStr, NULL, 16);
                uint8_t data = (uint8_t)strtol(dataStr, NULL, 16);
    
                if (WriteI2C(regAddr, data)) {
                    SetWindowText(GetDlgItem(hWnd, IDC_RESULT_TEXT), "Write successful!");
                } else {
                    SetWindowText(GetDlgItem(hWnd, IDC_RESULT_TEXT), "Write failed!");
                }
            } else if (LOWORD(wParam) == IDC_READ_BUTTON) {
                char regStr[10];
                GetWindowText(GetDlgItem(hWnd, IDC_REG_ADDR_EDIT), regStr, sizeof(regStr));
                uint8_t regAddr = (uint8_t)strtol(regStr, NULL, 16);
                uint8_t data = 0;
    
                if (ReadI2C(regAddr, &data)) {
                    char result[20];
                    sprintf_s(result, "Read: 0x%02X", data);
                    SetWindowText(GetDlgItem(hWnd, IDC_RESULT_TEXT), result);
                } else {
                    SetWindowText(GetDlgItem(hWnd, IDC_RESULT_TEXT), "Read failed!");
                }
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    

    🔄 步骤六:主函数入口

    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                         _In_opt_ HINSTANCE hPrevInstance,
                         _In_ LPWSTR    lpCmdLine,
                         _In_ int       nCmdShow) {
        // 注册窗口类
        WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInstance, NULL, NULL, NULL, NULL, L"FTDI_I2C_GUI", NULL };
        RegisterClassEx(&wc);
    
        // 创建窗口
        HWND hWnd = CreateWindow(L"FTDI_I2C_GUI", L"FTDI I²C GUI", WS_OVERLAPPEDWINDOW,
                                 CW_USEDEFAULT, 0, 400, 300, NULL, NULL, hInstance, NULL);
    
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
    
        // 初始化 FTDI
        if (!InitializeFTDI()) {
            MessageBox(hWnd, "Failed to initialize FTDI device!", "Error", MB_OK | MB_ICONERROR);
            return 0;
        }
    
        // 消息循环
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        // 清理
        CloseFTDI();
    
        return (int)msg.wParam;
    }
    

    ✅ 总结:关键步骤清单

    1. 创建 Win32 GUI 项目
    2. 添加 libMPSSE-I2C 头文件和库文件
      • 确保链接器设置包含 .lib 文件
      • 包含目录指向 libMPSSE-I2C 的头文件路径
    3. 编写初始化和 I²C 通信逻辑
    4. 设计 GUI 界面,绑定按钮事件
    5. 实现读写功能并更新 UI 显示结果

    📦 注意事项

    • 确保 FTDI 驱动已安装:从 FTDI 官网 下载并安装驱动。
    • libMPSSE-I2C 的编译方式:建议使用 Visual Studio 编译为静态库(.lib)并链接到项目中。
    • I²C 设备地址:根据实际使用的设备修改 I2C_DEVICE_ADDRESS

    如果你需要我帮你生成完整的 VS2022 项目文件(.sln, .vcxproj),或者进一步扩展功能(如支持 SPI、GPIO 等),欢迎继续提问!

    祝你开发顺利!🚀

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 7月14日
  • 已采纳回答 7月6日
  • 创建了问题 7月6日