C6678的SPI Flash启动失败

来源:互联网 发布:mac电脑itunes安装ipa 编辑:程序博客网 时间:2024/06/05 06:06

XX板上的6678使用I2C外接其他主机启动。但设计时保留了Nor Flash启动方式作为备份启动方式,因此需要调试SPI Flash启动。

6678支持多种启动方式,在《Bootloader for the C66x DSP User Guide(sprugy5b)》中都有描述。不同的启动方式由上电时启动模式引脚的状态配置,XX板上在研发阶段采用了拨码配置。

根据手册说明,需要先生成一个启动镜像烧入到Nor Flash中。SPI Flash模式下的启动镜像分两部分,一是启动参数表,二是启动表。启动表是从编译生成的.out文件经过TI提供的一些工具逐步转换格式生成的,启动参数表在每种启动模式下均不相同,可以手工逐字节填写。

首先做了一个简单的闪灯程序,用仿真器下载运行成功,然后用工具转化出启动表。最后需要手工加上启动参数表。
TI提供的示例中有I2C EEPROM的启动镜像,但是没有SPI镜像。两者的启动表格式相同,但启动参数表格式略有区别。参考手册并仿照I2C进行修改后生成镜像,烧进去后修改拨码,上电后发现灯不亮。

这时回到手册再仔细分析,花费两天时间也没有发现问题,网上也查找不到相应资料。后来把思路重新整理了一下,根据手册整理出CPU的启动流程图,然后准备一步步排查。

首先上电后采样引脚确定启动模式。用万用表测量拨码电平,没有发现问题。用示波器排查CPU时钟输出引脚,发现有输出信号,说明CPU在正常工作。
然后就要读Flash数据了,用示波器看Flash波形,有输出和输入信号,证实了CPU进入了SPI启动的分支。但持续约几十个字节后信号消失,而正常情况下应该有几百字节才对。这里明显有问题,但原因不明。
由于启动过程CPU都是在执行BootROM里的指令,不方便跟踪。这时分析和调试陷入了困境。

一段时间后,在TI中文论坛上技术支持给出了Bootloader的源码。花了若干天时间阅读源码,理解启动的大致步骤后,插上仿真器对照源码单步执行汇编指令,又花费了一天的时间弄清楚了一些重要细节。又花费了几天时间寻找问题无果。终于在某次调试中突然发现,源码中对启动参数表的定义与文档中不一致。

源码中对启动参数表的定义为:

typedef struct boot_params_spi_s{    /* common portion of the Boot parameters */    UINT16 length;    UINT16 checksum;    UINT16 boot_mode;    UINT16 portNum;    UINT16 swPllCfg_msw;  /* CPU PLL configuration, MSW */    UINT16 swPllCfg_lsw;  /* CPU PLL configuration, LSW */    UINT16 options;     UINT16 addrWidth;          /* 16 or 24 are the only valid values */     UINT16 nPins;              /* 4 or 5 pins are the only valid values */     UINT16 csel;               /* only values 0b10 (cs0 low) or 0b01 (cs1 low) are valid */     UINT16 mode;               /* Clock phase/polarity. These are the standard SPI modes 0-3 */     UINT16 c2tdelay;           /* Setup time between chip select assert and the transaction */     UINT16 cpuFreqMhz;         /* Speed the CPU is running after PLL configuration */     UINT16 busFreqMhz;         /* The speed of the SPI bus, the megahertz portion */     UINT16 busFreqKhz;         /* The KHz portion of the bus frequency. A frequency of 1.5 MHz would have the value 5 here */     UINT16 read_addr_msw;      /* The base address to read from the SPI, upper 16 bits */     UINT16 read_addr_lsw;      /* The base address to read from the SPI, lower 16 bits */     UINT16 next_csel;          /* The next chip select to use if in boot config mode, when the config is complete */     UINT16 next_read_addr_msw; /* The next read address to use if in boot config mode */     UINT16 next_read_addr_lsw; /* The next read address to use if in boot config mode */} BOOT_PARAMS_SPI_T;     

而文档中对参数表的描述为:
SPI启动参数表

从14字节开始两者就不一致了。把我们镜像中的启动参数表按代码描述做修改后,重新烧入Flash,上电启动,灯亮了!问题解决。

这里要吐槽TI对6678的支持了。在03年初开始使用时,6678还算是新生事物,业界使用还不算多,但TI在大力推广期。我们算是第一批吃螃蟹的人,还参加过北京的技术培训。结果在一年的开发过程中,发现文档错误、库Bug、示例代码错误有好几处,在网上还都找不到资料。整个开发过程充满了曲折无奈,着实锻炼人。在我们的驱动逐步稳定的半年后,论坛里对6678的帖子出现了大量的增长,毕业生应聘简历中也大量出现使用6678的项目。很久没有上TI的论坛,不知道用户反馈爆发时TI是否会回归关注这些问题,给出修复版本。
现在我们新平台的调研过程中发现,TI的KII系列也正面临着三年前一样的境遇,领导提出不再过早追求新事物,想必一两年后再来摸索KII,会顺利许多吧。

0 0