USB论坛
直播中

贾飞世

8年用户 1887经验值
私信 关注
[问答]

CY7C68016固件无法从EEPROM启动的原因?

参照AN61345的文件,已经成功将接口程序调试完毕。现在遇到一个问题,68016中的固件程序只能通过RAM的方式运行,详细说明如下:     
1、将SLAVE.IIC文件下载到EEPROM中,软件显示下载成功。      
2、上电启动,成功发现新硬件,成功安装USB驱动,CyControl软件显示正确的设备名称。      
3、使用CyControl软件下载SLAVE.HEX,在FPGA端口上会看到68016有时钟输出,使用steam_in和steam_out读写数据都正常。      
4、如果不下载HEX文件,在FPGA端口上68016没有时钟输出,使用steam_in和steam_out读写数据不正常。      
5、我已经将SLAVE的启动方式设置为C2,在电路上,A0脚拉高,A1和A2脚接地。      
6、我已经将VID和PID作了修改:VID_04B4&PID_DE01.DeviceDesc="Cypress USB2.0 Generic Driver"      
7、EEPROM的型号是:CAT24L128UI。      
请问除了以上步骤,是否还有遗漏?为何固件无法从EEPROM中启动?

回帖(1)

周煌煦

2025-6-9 18:09:36

好的,结合你的描述(成功RAM运行,EEPROM烧写成功但无法启动)和CY7C68016的特性,这是非常典型的EEPROM启动失败问题。原因通常集中在EEPROM内容是否被正确识别和加载以及硬件配置是否匹配上。以下是详细的原因分析和排查方向:


核心原因分析


CY7C68016从EEPROM启动的关键在于:



  1. 有效的固件映像: SLAVE.IIC文件内容必须正确无误,包含固件主体、VID/PID、设备字符串和至关重要的配置字节/长度信息

  2. 可访问的EEPROM: I²C地址匹配、总线物理连接可靠、上电时序正常、芯片识别正确。

  3. 芯片配置引脚状态: EEDATA[1:0]引脚(或 I2C_ADDR[1:0])必须在上电/复位期间正确设置,以指示EEPROM类型和地址位。最关键的是EEDATA[0]

  4. 内部逻辑: 芯片复位后固件加载器能成功读取EEPROM起始处的配置信息,并能根据其中的固件长度成功加载整个固件。


具体原因和排查方向(按优先级排序)


1. EEPROM映像 .iic 文件生成配置错误(最常见!)



  • 长度信息不正确: AN61345中生成IIC文件时,需要指定固件的总长度(字节数)。这个长度必须与实际固件映像大小精确匹配(通常是.hex文件的大小或.iic中固件数据部分的大小)。如果这个值设置得太小,芯片只加载部分固件,导致启动失败;如果设置得太大,芯片会尝试读取EEPROM中不存在的无效数据。

  • 缺少/错误的配置字节: CY7C68016要求.iic文件的开头前3个字节(24位)是特殊的配置信息

    • Bits [23:16]: EEPROM配置字节(CF)。在FX2.h中定义,常见值为:

      • 0xC2 (默认值):加载固件和描述符,重枚举。这是最常用的

      • 0xC0:仅加载固件,不加载描述符(不重枚举)。


    • Bits [15:0]: 固件映像的总长度(字节数)减1。例如,如果固件总长0x1234字节,这里应写入0x1233


  • 排查: 使用十六进制编辑器(如HxD)打开生成的SLAVE.IIC文件:

    • 检查字节0是否等于0xC2(或你期望的值)。

    • 检查字节1字节2:它们组成的字(Word) (Byte1是LSB, Byte2是MSB) 应该等于 (固件总长度 - 1)。计算你的.hex文件的实际大小(注意不是文件大小,是映像内容大小),或看看你生成工具里输入的长度值。

    • 字节3开始是固件主体数据。



2. EEPROM I²C地址不匹配



  • 默认地址: CY7C68016的固件加载器默认期望EEPROM的I²C器件地址是0x50(写操作)的。

  • EEDATA[1:0]引脚配置:

    • EEDATA[0]必须下拉(接GND)。这个引脚在复位期间采样,低电平表示使用默认地址0x50

    • EEDATA[1]:这个引脚配置地址的最高位。低电平=0,高电平=1。所以默认0x50对应EEDATA[1]=0(下拉)。如果EEDATA[1]=1(上拉),则期望的地址是0x51


  • 排查:

    • 检查原理图和PCB: 确认EEDATA[0]引脚在上电/复位期间可靠地拉低到GND(通过电阻,不能悬空!EEDATA[1]也需要根据需求下拉或上拉以确定地址高位。

    • 检查EEPROM地址: 确认你使用的EEPROM芯片型号,其器件地址是否确认为0x50(常见EEPROM如24LC64通常是0x50)。仔细阅读EEPROM的数据手册,确认其地址引脚(如A2, A1, A0)的连接是否与0x50(二进制1010000,地址位A2/A1/A0都是0)相对应。如果你的EEPROM地址设置不同(比如地址脚接了VCC导致地址变了),就会出现无法访问的情况。



3. EEPROM硬件/电气问题



  • 连接性: 检查I²C总线(SCLSDA)到EEPROM的走线是否连通,有无虚焊、短路、断路。

  • 上拉电阻: SCLSDA线上都需要强上拉电阻(通常是4.7kΩ)。确保它们正确连接在电源(通常是3.3V)和这两条线上,并且电源电压稳定。

  • 电源/地: 检查EEPROM的VCCGND连接是否可靠,电压是否在EEPROM和CY7C68016要求的范围内(通常是3.3V)。

  • EEPROM上电速度: 确保EEPROM能在CY7C68016开始尝试读取之前准备好。虽然不常见,但特别慢的EEPROM或VCC上升时间可能导致初始化失败。尝试用示波器观察VCCSCL/SDA在电源上电瞬间的变化。

  • EEPROM型号兼容性: 虽然CY7C68016支持标准I²C EEPROM,但极少数非常规EEPROM或有严格时序要求的可能有问题。确认你使用的型号是Cypress文档中推荐的兼容型号之一(如24LC系列)。注意有些型号(如24AA)可能需要更慢的时钟(但默认加载器应该兼容)。

  • EEPROM内容损坏: 在非常偶然的情况下,下载过程出错或存储单元本身问题导致内容损坏。尝试重新写入或换一片EEPROM。


4. 其他配置问题(较不常见)



  • 枚举尝试次数: CY7C68016加载器在放弃重枚举前会尝试几次(默认似乎是3次)。如果你的主机USB枚举很慢(比如系统忙),超过尝试次数,会导致设备被识别为UNCONFIGURED,虽然此时固件其实已加载成功但设备类型未变。你尝试重新插拔USB线看看能否正确识别。

  • 固件代码依赖RAM运行模式: 非常罕见。你的固件代码本身是否有某些初始化部分假设只会在RAM模式下运行?例如访问了某些只在RAM加载后有效的状态?检查你的固件启动代码。

  • 芯片型号配置: SLAVE.IIC文件必须是针对CY7C68016(FX2LP)编译生成的,而不是其他型号(如FX2)。

  • 内部复位时序: 极其罕见的情况下,芯片内部状态机在读取EEPROM时出错。检查一下复位信号是否干净。


排查步骤建议(重点优先)



  1. 首要:检查 .iic 文件头! 用十六进制编辑器查看前3个字节。Byte0应为0xC2, Byte1(LSB)和Byte2(MSB)等于(固件长度 - 1)。如果不正确,修复固件生成工具/脚本的配置,重新生成SLAVE.IIC并下载到EEPROM。

  2. 检查 EEDATA[0]引脚: 用万用表测量板上EEDATA[0]引脚在上电/复位过程中的电压,确保它是低电平(接近0V),且连接稳固。

  3. 确认 EEPROM I²C 地址:

    • 根据EEDATA[1:0]的实际接线,计算期望的I²C地址。

    • 根据EEPROM型号和其地址引脚(A2/A1/A0)的连接,确认其实际I²C地址是否匹配期望值。


  4. 检查 I²C 总线硬件: 确保SCL, SDA有上拉电阻(4.7kΩ to VCC 3.3V),用万用表检查电源、地连接,检查线路通断。如果有可能,使用示波器或逻辑分析仪在上电瞬间抓取SCL和SDA的波形,看是否有起始条件、芯片是否在尝试读取(发地址0xA0 = 0x50 << 1 | 0)。

  5. 尝试另一片EEPROM: 排除存储单元损坏问题。

  6. 尝试枚举后重新插拔: 上电后在设备管理器中看到UNCONFIGURED设备,尝试重新插拔USB线,看是否变成配置好的设备。

  7. 简化固件: 如果可能,尝试烧写一个最简化的、仅用于证明EEPROM启动成功(比如点亮一个LED或发送特定枚举描述符)的固件映像到EEPROM,排除复杂固件本身的问题。

  8. 咨询文档/官方支持: 再次仔细阅读 AN61345,特别是关于生成IIC文件和配置字节的部分。查阅 CY7C68013A/CY7C68014A/CY7C68015A/CY7C68016A EZ-USB® FX2LP™ USB Microcontroller High-Speed USB Peripheral Controller数据手册中关于EEPROM Boot的章节(通常在复位和配置部分)。如果有官方论坛或技术支持,也可以咨询。


总结


根据你的描述(RAM完全正常,CyControl能识别),最核心的问题点几乎肯定落在生成的.iic文件的起始配置字节/长度错误或者EEDATA[0]未被正确拉低(或I²C地址整体不匹配)上。首先严格按照上述建议1和2进行排查,成功率非常高。硬件问题(布线、上拉)通常是备选检查项。


祝你排查顺利!

举报

更多回帖

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