USB论坛
直播中

微风挽雨

10年用户 1014经验值
擅长:可编程逻辑 电源/新能源 嵌入式技术
私信 关注
[问答]

如何用 C# 代码对 FX3/CX3 的 EEPROM 进行编程?

根据 FX3 SDK 的 CyUSB.NET.pdf(2018 年最新版本https://community.infineon.com/t5/USB-superspeed-peripherals/CyUSB-NET-manual/td-p/105011),我如何用 C# 代码对 FX3/CX3 的 EEPROM 进行编程?

我应该使用这个功能吗?

"4.9.1 DownloadFw( )
描述

CyFX3Device 的 DownloadFw 方法允许用户将固件下载到各种介质,如
,RAM、I2C E2PROM 和 SPI FLASH。

固件文件的文件名作为第一个参数传递给 API。 文件必须是 *.img
,以防止此操作失败。"

回帖(1)

1652711011.026500

2025-5-30 17:48:26

根据 FX3 SDK 的 CyUSB.NET 文档,使用 DownloadFw() 方法对 EEPROM 编程的正确步骤如下:




1. 准备工作




  • 生成固件映像文件



    • 使用 Elixir 工具(FX3 SDK 自带)将你的 .c/.h 固件代码编译成 .img 文件

    • 在 Elixir 中选择 Boot from I²C EEPROM 选项(关键步骤!)

    • 确保 EEPROM 型号在 FX3 的兼容列表(如 24LC64/256)




  • 硬件连接



    • 确认 FX3/CX3 开发板的 I²C EEPROM 已正确连接

    • 检查 I²C 总线地址(默认 0x50)






2. C# 代码实现


using CyUSB;

public class EEPROMProgrammer
{
    public bool ProgramEEPROM(string imgFilePath)
    {
        try
        {
            // 查找 FX3 设备
            USBDeviceList usbDevices = new USBDeviceList(CyConst.DEVICES_CYUSB);
            CyFX3Device fx3Device = null;

            foreach (USBDevice dev in usbDevices)
            {
                if (dev is CyFX3Device && dev.VendorID == 0x04B4) // Cypress VID
                {
                    fx3Device = dev as CyFX3Device;
                    break;
                }
            }

            if (fx3Device == null)
            {
                Console.WriteLine("FX3 device not found!");
                return false;
            }

            // 关键参数设置
            const int EEPROM_ADDR = 0x50; // I2C 地址
            const int I2C_BUS_SPEED = 400; // kHz (标准模式)

            // 设置编程参数
            fx3Device.SetDownloadAddr(EEPROM_ADDR);
            fx3Device.SetI2CConfig(EEPROM_ADDR, I2C_BUS_SPEED);

            // 执行固件下载
            int status = fx3Device.DownloadFw(imgFilePath, CyConst.FW_DOWNLOAD_MEDIA_TYPE.I2C_EEPROM);

            return (status == CyConst.STATUS_SUCCESS);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
            return false;
        }
    }
}



3. 关键注意事项




  1. 权限问题



    • 必须以 管理员权限 运行程序(因需要底层 USB 访问)

    • 确认已安装 Cypress USB Suite 驱动




  2. 错误处理


    if (status != CyConst.STATUS_SUCCESS)
    {
       Console.WriteLine($"Error code: {status}");
       // 常见错误码:
       // 0xE0004001 - 无效的媒体类型
       // 0xE0004003 - 映像文件校验失败
    }



  3. 映像文件验证



    • 使用 CyUSBControlCenter 工具预烧录测试

    • 检查 .img 文件头是否包含正确的 EEPROM 参数:
      hexdump -C your_firmware.img | head -n 5






4. 高级调试技巧




  • I²C 总线监控
    使用示波器或逻辑分析仪抓取 I²C 波形,确认 ACK/NACK 信号




  • EEPROM 预擦除
    如果遇到编程失败,可先用 fx3prog.exe 工具执行擦除:


    fx3prog -t i2c -i your_image.img --erase-only



  • 多设备处理
    若连接多个 FX3 设备,需通过 SerialNumber 区分:


    if (fx3Device.SerialNumber == "Your_Device_SN")





5. 替代方案比较



























方法 优点 缺点
DownloadFw() 官方推荐,操作简单 依赖 Cypress 工具链
直接 I²C 读写 灵活控制 需手动实现协议栈
Cypress ControlCenter 图形化操作 不适合自动化生产环境

建议优先使用 DownloadFw() 方法,因其已处理 EEPROM 的页写入、校验和验证等底层细节。


如果遇到固件启动失败问题,请检查 FX3 的 PMODE 引导引脚配置是否匹配 EEPROM 启动模式(通常需要 PMODE[2:0] = 001)。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分