3067|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

C6678的SPI Flash启动失败 [复制链接]

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;     

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


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

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

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表