深入解析TMS320DM643x DSP启动引导机制与AIS脚本实战
1. 项目概述:深入理解DM643x的启动引导机制
在嵌入式DSP系统的开发中,最让人“提心吊胆”的时刻,往往不是算法调优,也不是性能瓶颈,而是系统上电后那块黑漆漆的屏幕——程序能不能跑起来?对于基于TI TMS320DM643x这类高性能数字信号处理器的设备来说,一个可靠、高效且灵活的启动引导(Bootloader)方案,是整个项目稳定运行的基石。我经历过不少项目,前期算法验证一切顺利,却在量产时因为启动配置的一个小疏忽,导致整批板卡“变砖”,教训深刻。
简单来说,Bootloader就是DSP芯片上电复位后,最先执行的那一小段固化在ROM里的代码。它的核心任务就三件:初始化最基础的硬件环境、从指定的外部介质(比如SPI Flash、NAND Flash)或者主机接口(比如UART)找到并加载你的应用程序代码、最后干净利落地跳转到你的程序入口点,把CPU的控制权交出去。这个过程看似简单,但里面门道很多,时钟配置、存储器接口时序、镜像格式解析,任何一个环节出错,你的应用程序连被执行的机会都没有。
TMS320DM643x系列DSP的强大之处在于,它原生支持多种启动模式,给了硬件设计很大的灵活性。你可以根据成本、板卡空间、生产烧录方式等因素,选择SPI EEPROM、NAND Flash,或者通过UART、HPI等接口从主机加载。而将这些模式统一起来的“灵魂”,就是TI定义的AIS(Application Image Script)脚本格式。它不是简单的二进制代码堆叠,而是一个包含配置命令、加载指令和校验信息的“启动剧本”,Bootloader会严格按照这个剧本来执行初始化、搬移数据和跳转。
本文将聚焦于DM643x Bootloader的几个核心实战场景:SPI Master Boot、NAND Flash Boot以及AIS脚本的详细解析与构建。我会结合手册中的技术细节和实际调试中的经验,不仅告诉你“怎么做”,更会解释“为什么这么做”,以及那些手册里没写但能让你少走弯路的“坑”在哪里。
2. 核心启动模式详解与硬件设计要点
DM643x的启动模式由芯片上电时特定引脚(BOOTMODE[3:0])的电平状态决定。这部分硬件设计必须在画原理图时就确定下来,一旦板卡生产出来就很难再更改。因此,理解每种模式的硬件连接要求和底层机制至关重要。
2.1 SPI Master Boot模式深度解析
SPI Boot是一种非常常用且可靠的启动方式,尤其适合代码量中等(通常几MB以内)、追求稳定性和简单性的应用。DM643x支持两种SPI Boot模式:16位地址模式(16x8)和24位地址模式(24x8),后者可以寻址更大容量的SPI Flash。
2.1.1 SPI 16x8 Master Boot模式
在这种模式下,DSP作为SPI主机,通过McBSP0(多通道缓冲串行口0)模拟SPI协议,从连接的SPI EEPROM中读取AIS脚本和应用程序。硬件连接非常简单直接:
| SPI EEPROM 引脚 | DM643x McBSP0 引脚 | 说明 |
|---|---|---|
S#(片选) | FSX0 | 帧同步信号用作SPI片选 |
C(时钟) | CLKX0 | 串行时钟 |
D(数据输入) | DX0 | DSP发送,EEPROM接收(MOSI) |
Q(数据输出) | DR0 | DSP接收,EEPROM发送(MISO) |
Bootloader在ROM代码中已经固化了SPI的初始化配置。关键寄存器设置如下:
- PCR寄存器: 设置
FSXM=1(帧同步由DSP产生),FSRP=1(接收帧同步高有效),CLKXM=0(时钟由DSP产生,上升沿发送),FSXP=1(发送帧同步低有效)。这里FSXP=1意味着片选信号低电平有效,这是大多数SPI器件的标准。 - SPCR寄存器: 设置
CLKSTP=11b。这个模式决定了时钟的极性和相位。CLKSTP=11且CLKXP=0(默认)的组合,意味着时钟空闲时为高电平,在时钟上升沿采样数据。这正好匹配了绝大多数SPI EEPROM的时序要求:EEPROM在时钟上升沿锁存(采样)主机发送的数据(命令/地址),并在时钟下降沿更新其输出数据。 - RCR/XCR寄存器: 设置
RDATDLY=1和XDATDLY=1。这个数据延迟设置确保了数据帧与帧同步信号之间的正确对齐,对于SPI模拟的稳定性很重要。
实操心得:时钟频率计算与器件选型手册中提到时序基于27MHz输入时钟。Bootloader会配置McBSP的内部时钟分频器。你需要根据你选择的SPI EEPROM所支持的最高时钟频率,来反推DSP的输入时钟(CLKIN)是否合适。例如,如果EEPROM最高支持20MHz,而DSP的McBSP分频后时钟接近25MHz,就可能导致读写失败。务必查阅两个器件的数据手册进行匹配。在早期硬件设计时,选择一款支持足够高频率的SPI Flash,能为后期调试留出裕量。
2.1.2 SPI 24x8 Master Boot模式
当你的应用程序超过16位地址(64KB)的寻址范围时,就需要使用24位地址模式。这种模式的硬件连接有一个重要变化:
| SPI EEPROM 引脚 | DM643x 引脚 | 说明 |
|---|---|---|
S#(片选) | GPIO97 | 关键变化:片选改用GPIO97控制 |
C(时钟) | CLKX0 | 串行时钟 |
D(数据输入) | DX0 | DSP发送(MOSI) |
Q(数据输出) | DR0 | DSP接收(MISO) |
FSX0 | 悬空或不连接 | 在此模式下不再使用 |
为什么会有这个变化?根本原因在于McBSP在SPI模式下的单次传输数据长度限制。一次标准的SPI Flash读取操作需要:8位命令 + 24位地址 + 8位哑元(dummy) + 读出数据。这总共需要40个时钟周期。而McBSP的传输单元是固定的(例如32位),无法直接满足40位的需求。
Bootloader的解决方案很巧妙:它利用GPIO97来模拟片选信号,而将McBSP配置为每次传输8位数据。这样,它就可以分5次发送来完成一次读操作:先拉低GPIO97(片选有效),然后通过McBSP依次发送8位读命令、地址字节3、地址字节2、地址字节1、8位哑元,紧接着再接收8位数据,最后拉高GPIO97。这个过程完全由Bootloader的ROM代码控制,对用户透明,你只需要在硬件上正确连接即可。
避坑指南:GPIO97的上电状态与PCB布局GPIO97在芯片复位后默认为输入状态,其电平由上拉/下拉电阻或驱动源决定。如果这个引脚在Bootloader操作前处于不确定状态,可能会导致SPI EEPROM被意外选中。建议在PCB上为GPIO97连接一个10kΩ的下拉电阻到地,确保上电期间EEPROM的片选为高(无效),待Bootloader明确控制后再拉低。同时,SPI时钟线(CLKX0)和数据线(DX0/DR0)应尽可能短,并远离高速数字信号线,以减少噪声干扰,保证启动时序的可靠性。
2.2 NAND Flash Boot模式实战与版本差异
对于需要存储大量代码或数据的应用(如视频处理、文件系统),NAND Flash是更经济的选择。但DM643x的NAND Boot支持情况与芯片的硅版本(Revision)强相关,这是最容易踩坑的地方。
Rev 1.30及以后版本:这些版本的芯片,其ROM Bootloader原生支持从NAND Flash启动。Bootloader会从NAND的Block 1(块1)开始搜索AIS魔术数字(Magic Number0x41504954),自动跳过坏块(通过检测备用区0x4偏移处的0xBADDBADD标记),并利用EMIF模块的硬件ECC进行1位错误纠正。这是最理想的情况。
Rev 1.0 和 Rev 1.20版本:注意!这两个版本的ROM Bootloader在轮询NAND就绪状态时存在一个竞态条件(race condition),会导致直接从NAND启动失败。这是TI手册中明确指出的一个硬件缺陷。
对于这些早期版本的芯片,标准的解决方案是采用二级引导(Secondary Boot)。即:芯片首先从一个可靠的、小容量的启动介质(如SPI EEPROM或I2C EEPROM)启动一个“二级Bootloader”小程序。这个二级Bootloader程序再负责从NAND Flash中读取主应用程序并加载运行。你需要将二级Bootloader的代码烧写到SPI/I2C存储器中,而将主程序的AIS镜像烧写到NAND Flash里。
经验之谈:二级Bootloader的实现要点
- 存储规划:二级Bootloader本身很小,通常几KB到十几KB,可以存放在一个廉价的SPI EEPROM中。主程序则存放在大容量NAND里。
- AIS格式:二级Bootloader和主程序都需要被转换成AIS格式。二级Bootloader的AIS镜像烧写到SPI,主程序的AIS镜像烧写到NAND。
- 坏块管理:TI提供的示例二级Bootloader通常比较简单,它可能不处理NAND的坏块。它一旦在某个块找到AIS魔术数字,就认为后续数据是连续存储的好块。这意味着你在烧写主程序AIS镜像到NAND时,必须确保从起始块到结束块之间的物理空间是连续的、无坏块的,或者你需要自己实现一个带坏块管理功能的二级Bootloader。
- 器件支持:确保你选用的NAND Flash型号在Bootloader的支持列表中(如手册Table 16所示)。特别是要避开那些需要切换片选(Toggle Chip Select)信号才能操作的NAND器件。
2.3 UART Boot:用于调试与生产烧录的利器
UART Boot模式与其他模式有本质不同:它是一个交互式的启动过程。DSP Bootloader在启动后会主动通过UART向主机发送“BOOTME”字符串,然后等待主机通过串口发送AIS脚本流。这使得UART Boot成为极佳的调试和生产烧录工具。
工作流程如下:
- DSP配置UART(固定为115200bps, 8N1)。
- DSP发送字符串
"BOOTME"。 - DSP等待主机回复AIS魔术数字(注意,UART模式下AIS数据是ASCII字符形式,魔术数字
0x41504954需要以字符"41","50","49","54"发送)。 - 主机开始发送完整的AIS命令流。
- DSP解析并执行AIS命令(配置、加载代码)。
- 当DSP接收到
JUMP_CLOSE命令后,它回送字符串"DONE"给主机,然后跳转到应用程序执行。
有两种UART Boot模式:BOOTMODE[3:0] = 1000b(无硬件流控)和1110b(启用硬件流控)。对于稳定的数据传输,强烈建议使用带硬件流控(RTS/CTS)的模式,尤其是在高速或长距离通信时,可以避免因缓冲区溢出导致的数据丢失。
调试技巧:利用UART Boot快速迭代在开发初期,你可以不烧写任何外部存储器,完全通过UART Boot来加载和测试程序。只需一个USB转TTL串口线连接到DSP的UART0,再配合一个简单的PC端工具(如TI的AISgen工具配合串口发送脚本,或自己编写一个小程序),就可以实现“一键下载调试”。这极大地加快了开发调试循环。你可以在AIS脚本中先只包含一个简单的LED闪烁程序,验证整个启动链路是否通畅。
3. AIS脚本:启动流程的“灵魂”与精妙设计
AIS脚本是连接你的应用程序编译输出(.out文件)与DSP Bootloader的桥梁。它不是一个被动的数据容器,而是一个主动的、可编程的配置脚本。理解AIS的每个命令,你就能精确控制启动过程中的每一个细节。
3.1 AIS脚本的整体结构与魔法数字
一个最基本的AIS脚本结构如下所示,它就像一串由Bootloader执行的指令序列:
[魔术数字 0x41504954] -> [SET命令1] -> ... -> [SET命令N] -> [SECTION_LOAD命令1] -> ... -> [JUMP_CLOSE命令]- 魔术数字(Magic Number):固定的
0x41504954(ASCII对应“AIPI”)。这是Bootloader在存储器中寻找AIS镜像的“信标”。对于NAND Boot,Bootloader会逐块搜索页0的前32位是否是这个值。 - SET命令:用于在加载主程序之前,配置DSP的内部寄存器。最常见的就是配置PLL(提高系统主频)和EMIF(配置外部存储器时序)。这能显著提升后续代码加载速度。
- SECTION_LOAD命令:核心命令,负责将你的应用程序代码段和数据段搬运到DSP的内部或外部存储器(DDR2)的指定地址。
- JUMP_CLOSE命令:收尾命令,告诉Bootloader所有加载和配置已完成,可以跳转到应用程序的入口地址(通常是
_c_int00),并关闭Bootloader。
3.2 SET命令:启动优化的关键
SET命令的格式为:<地址> = <数据><类型>::<延时>。它的威力在于其灵活性和精确控制。
为什么需要SET命令?芯片刚上电时,PLL处于旁路(Bypass)模式,CPU以低速的输入时钟(如27MHz)运行。EMIF等外设的等待状态也是保守的默认值。如果直接用这个状态去从外部慢速Flash加载几MB的程序,耗时将非常可观。通过SET命令,我们可以在加载用户代码前,将PLL倍频到最高工作频率(如594MHz),并优化EMIF的访问时序,使得后续的代码加载过程在“全速”下进行,启动时间可能缩短一个数量级。
一个配置PLL和EMIF的SET命令示例: 假设我们要将PLL配置为倍频25倍(输入27MHz,输出675MHz),并设置合理的分频。
- 查找寄存器地址:从芯片数据手册找到PLL控制寄存器(如
PLL_CTL)和EMIF配置寄存器的地址。 - 构造SET命令:
0x01C40800 = 0x00001900I::100:向地址0x01C40800(假设为PLL_CTL)写入32位数据0x00001900(配置倍频器),然后等待100个CPU周期让PLL锁定。0x01800004 = 0x00003322I::10:向EMIF的某个控制寄存器写入配置值,优化时序。
注意:
I表示32位写入,B表示8位,S表示16位。::后的延时参数至关重要,特别是在配置PLL后,必须给予足够的延时(通常几百个周期)确保时钟稳定。
更高级的用法:字段(Field)和位(Bits)操作SET命令支持直接操作寄存器中的某些位域,而无需进行“读-修改-写”的软件操作。例如,你只想修改PLL控制寄存器中的倍频字段(bits 12-19),而保持其他位不变。你可以使用<类型>为4(Field)或5(Bits),并在类型字中指定起始位和结束位。Bootloader会在硬件层面完成精确的位操作,这比先读后写更可靠、更原子化。
3.3 代码加载与填充命令
- SECTION_LOAD:这是最主要的加载命令。你需要为链接器生成的每一个需要初始化的段(如
.text,.cinit,.const)生成一个SECTION_LOAD命令。命令中包含目标地址、段大小和段的原始二进制数据。AIS生成工具(如hex6x和AISgen)会自动完成这个繁琐的工作。 - SECTION_FILL:用于初始化特定的内存区域为固定模式,最常见的就是将
.bss段(未初始化的全局变量区)清零。在AIS脚本中使用SECTION_FILL命令比在应用程序启动代码中清零更高效,因为它是DMA式的填充,速度更快。
3.4 跳转与CRC校验:安全收尾
- JUMP_CLOSE:这是AIS脚本的终点。除了指定跳转地址,该命令后还跟有两个重要的校验值:已加载的段总数和已加载的总字节数。Bootloader会在执行跳转前核对这两个值,如果不匹配,则启动失败。这是一个简单的完整性检查。
- CRC校验机制:在不可靠的通信渠道(如UART)或容易受干扰的存储介质(如NAND Flash)中,数据可能出错。AIS支持CRC-32校验来应对。
- ENABLE_CRC/DISABLE_CRC:开启或关闭CRC计算。
- REQUEST_CRC:在加载一个或所有段之后,插入此命令来请求校验。命令中包含期望的CRC值和“回溯值(Seek Value)”。
- 流程:Bootloader在加载数据时会计算CRC。当遇到REQUEST_CRC命令时,它将计算值与期望值比较。如果匹配,继续;如果不匹配,Bootloader会进入错误状态。对于UART等主机模式,主机需要检测到这一错误,然后发送STARTOVER命令让Bootloader重置CRC状态,并根据“回溯值”将AIS流的位置回退到出错段之前,重新发送数据。这实现了一个简单的差错重传机制,极大地提高了通过UART等不稳定接口烧录的可靠性。
3.5 函数执行命令:隐藏的利器
这是AIS中一个非常强大但常被忽略的功能:FUNCTION_EXECUTE。它允许你直接调用Bootloader ROM中预置的优化函数。
手册中提到了三个预置函数:
- PLL配置函数(索引0):用更简洁的方式配置PLL。
- EMIFA配置函数(索引1):配置EMIF-A控制寄存器。
- DDR配置函数(索引2):配置DDR2内存控制器。
使用函数执行命令的优势在于:这些函数是用汇编高度优化的,执行速度极快,且代码已经存在于ROM中,不占用你的AIS镜像空间。对于配置复杂的DDR2控制器,使用这个命令比用一系列SET命令去写几十个寄存器要高效、可靠得多。
一个调用PLL配置函数的AIS片段示例:
0x5853590D // FUNCTION_EXECUTE 操作码 0x00030000 // 高16位:参数数量(3);低16位:函数索引(0) 0x00000019 // 参数1: PLL倍频系数 (0x19 = 25倍) 0x00000001 // 参数2: PLL分频器1 (CPU分频,1表示除以2) 0x00000000 // 参数3: 振荡器源 (0=内部)这三行命令就完成了PLL的配置,比多个SET命令更紧凑。
4. 从编译到烧录:完整的AIS镜像生成与调试流程
理解了原理,最终要落地到操作。下面是一个从CCS工程到最终可启动镜像的完整流程。
4.1 工具链准备与编译链接
- 编译:在Code Composer Studio (CCS)中,使用C6000编译器将你的C/C++源代码编译成目标文件(.obj)。
- 链接:这是关键步骤。链接器(Linker)根据你的链接命令文件(.cmd)将各个目标文件中的段(Section)合并,并分配到具体的物理地址。对于DM643x,通常:
.text(代码段)放到快速的内部RAM(IRAM)或DDR2中。.cinit(初始化数据)、.const(常量)放到DDR2或Flash中。.bss(未初始化变量)和.stack(栈)分配到DDR2中。- 你必须明确定义一个入口点,通常是
_c_int00。
一个简单的链接命令文件片段示例:
MEMORY { IRAM: origin = 0x00000000, length = 0x00010000 DDR2: origin = 0x80000000, length = 0x08000000 } SECTIONS { .text > IRAM .cinit > DDR2 .bss > DDR2 .stack > DDR2 }4.2 生成AIS脚本与二进制镜像
CCS编译链接后生成的是COFF格式的.out文件,Bootloader无法直接识别。需要转换:
生成Hex文件:使用
hex6x工具将.out文件转换为ASCII-Hex格式(.hex)。这个工具是TI编译器套件的一部分。你需要编写一个.hex.cmd配置文件,指定输出格式和宽度。// myapp.hex.cmd -a // 输出ASCII-Hex格式 -boot // 生成适用于Bootloader的格式 -order L // 字节序为小端 -romwidth 8 // 假设SPI Flash数据宽度为8 myapp.out执行:
hex6x myapp.hex.cmd生成myapp.hex。生成AIS文件:使用TI的
AISgen工具(一个Windows GUI或命令行工具),将.hex文件转换为最终的.ais二进制文件。- 在AISgen中,选择你的目标芯片型号(DM643x)。
- 加载上一步生成的
.hex文件。 - 配置启动参数:这是核心步骤。你需要在这里指定:
- Boot Mode: 选择你的启动方式,如SPI 24-bit Master。
- PLL Configuration: 设置你期望的CPU核心频率、输入时钟等。这里配置的值会通过AIS开头的SET命令或FUNCTION_EXECUTE命令生效。
- EMIF/DDR Configuration: 如果你的程序在外部DDR2运行,必须在这里正确配置DDR2的时序参数(如刷新率、CAS延迟等)。参数配置错误是导致启动失败的最常见原因之一。务必参照你的DDR2芯片数据手册和DM643x的EMIF章节推荐值。
- CRC Options: 选择是否需要CRC校验以及校验模式(整体校验或分段校验)。
- 点击生成,得到
myapp.ais文件。这个文件就是最终要烧写到SPI Flash、NAND Flash中的镜像,或者通过UART发送的数据流。
4.3 烧录到存储介质与深度调试
对于SPI Flash:
- 可以使用编程器(如Flash烧录座)直接烧写
.ais文件。 - 也可以在系统运行时,通过已运行的DSP程序(或JTAG)调用SPI驱动程序,将
.ais文件写入到连接在McBSP0上的SPI Flash中。这常用于产品软件的现场升级。
对于NAND Flash:
- 通常需要通过JTAG接口,配合CCS的Memory Browser和GEL脚本,将
.ais文件写入到NAND Flash的特定块(如Block 1)。务必确保写入的物理块是好的,并且后续的块也是连续的好的,除非你的二级Bootloader支持坏块管理。 - 对于量产,则需要制作专门的治具,通过并口或USB转NAND编程器进行烧录。
深度调试技巧:
- 仿真器(JTAG)是你的好朋友:在第一次尝试新硬件或新启动模式时,不要急于烧写Flash。先用JTAG连接,在CCS中加载你的
.out文件并运行,确保硬件基本功能(时钟、DDR2、GPIO)正常。 - 利用UART Boot进行“软”验证:在烧写Flash之前,先通过UART Boot模式加载你的
.ais文件。如果成功运行,说明AIS脚本本身、PLL/DDR配置、代码逻辑都是正确的,问题可能出在Flash烧录或硬件连接上。 - 阅读Bootloader的“日志”:DM643x的Bootloader在某些失败情况下,会在特定的内存地址留下错误代码。通过JTAG读取这些地址(具体地址需查阅芯片勘误表或Bootloader手册),可以判断是CRC错误、地址错误还是超时错误。
- 示波器/逻辑分析仪抓取时序:当SPI或NAND启动失败,且软件排查无果时,硬件时序是最后的检查手段。用示波器测量SPI的CLK、CS、MOSI、MISO信号,检查上电后Bootloader发出的第一个读命令(通常是
0x03)的波形是否正确,片选和时钟频率是否符合EEPROM要求。对于NAND,检查CE#、WE#、RE#、ALE、CLE等控制信号的时序关系。
5. 常见问题排查与实战经验汇总
即使按照手册一步步操作,启动过程仍可能遇到各种问题。下面是我在多个项目中总结的一些典型故障和排查思路。
5.1 典型故障现象与排查路径
| 故障现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 上电后无任何反应,JTAG也无法连接。 | 1. 核心电源或时钟异常。 2. Boot模式引脚配置错误或被干扰。 3. PLL配置严重错误导致芯片锁死。 | 1. 测量核心电压(CVdd)、PLL电压是否稳定且在容差范围内。 2. 用万用表或示波器确认BOOTMODE[3:0]引脚在上电复位期间的电平与设计一致,注意上拉/下拉电阻。 3. 尝试通过JTAG进行强制复位并重新配置PLL,如果JTAG能连接,说明硬件基本正常。 |
| JTAG可以连接,但程序无法加载到DDR2运行。 | 1. DDR2配置参数(时序、刷新率)错误。 2. DDR2硬件连接问题(线序、终端电阻)。 3. DDR2电源或参考电压异常。 | 1. 检查AISgen中DDR2配置是否与所用DDR2芯片型号匹配。重点检查CL、tRCD、tRP、tRFC等关键时序参数。 2. 使用CCS的Memory Browser尝试读写DDR2的测试地址(如0x80000000),看是否成功。如果失败,可能是配置或硬件问题。 3. 测量DDR2的VDD、VTT、VREF电压。 |
| SPI Boot失败,但UART Boot相同镜像成功。 | 1. SPI Flash型号不支持或时钟频率过高。 2. SPI硬件连接错误(线序接反)。 3. AIS镜像烧写位置错误(未烧到Flash起始地址)。 4. 芯片硅版本较老,对某些SPI指令支持有差异。 | 1. 用逻辑分析仪抓取Bootloader发出的前几个字节,确认是否是标准的0x03读命令+24位地址0x000000。2. 核对原理图,确认CS、CLK、MOSI、MISO四根线连接正确,且上拉/下拉电阻配置合理(特别是CS引脚)。 3. 确认编程器将 .ais文件烧写到了Flash的物理地址0x0开始处。4. 尝试降低SPI时钟频率(如果可能),或查阅芯片勘误表。 |
| NAND Boot失败,搜索不到Magic Number。 | 1. NAND Flash型号不在支持列表,或需要特殊初始化。 2. AIS镜像未烧入正确的块(应为Block 1或之后)。 3. NAND Flash存在坏块,且Bootloader或二级Loader不支持跳转。 4. 芯片为Rev 1.0/1.20,却尝试直接从NAND启动。 | 1. 确认NAND Flash的ID与手册Table 16匹配。 2. 通过JTAG工具确认AIS镜像已正确写入NAND的Block 1,且页0的前4字节为 0x41504954。3. 使用NAND厂商工具扫描并标记坏块。确保AIS镜像写入的块链是完好的。 4. 如果是早期版本芯片,必须使用二级Bootloader方案。 |
| UART Boot能收到“BOOTME”,但发送AIS后无“DONE”回应。 | 1. 串口波特率、数据位、停止位、流控设置不匹配。 2. AIS数据格式错误,不是ASCII Hex格式。 3. AIS脚本中的配置命令(如PLL/DDR)导致芯片异常。 | 1. 确认主机串口工具设置为115200, 8N1,并正确启用/禁用硬件流控(与BOOTMODE匹配)。 2. 使用TI AISgen工具的输出作为发送源,确保是纯ASCII字符流。可以先用一个极简的(只包含JUMP_CLOSE到内部RAM小程序的)AIS脚本测试。 3. 在AIS脚本中暂时注释掉PLL和DDR配置命令,先让芯片以最低速运行,测试代码加载功能是否正常。 |
5.2 关键经验与最佳实践
- 版本管理至关重要:记录清楚你使用的DM643x芯片的硅版本(Rev)。Rev 1.0/1.20与Rev 1.30在NAND Boot支持上是天壤之别。在BOM、原理图和设计文档中明确标注。
- 先仿真,后烧写:永远先用JTAG+仿真器在RAM中运行你的代码,确保逻辑正确。然后通过UART Boot测试完整的启动流程。最后才烧写到非易失性存储器(SPI/NAND Flash)中。
- 配置参数双校验:PLL和DDR2的配置参数非常敏感。务必使用两个来源进行交叉验证:一是TI官方针对该型号芯片的示例代码或配置工具(如AISgen的预置);二是你所使用的具体时钟晶振和DDR2芯片的数据手册。计算出的参数要在AISgen中手动复核。
- 预留测试点:在PCB设计时,为关键的Boot模式引脚、SPI信号线、UART TX/RX预留测试点。这会在调试硬件启动问题时为你节省大量时间。
- 制作一个“黄金镜像”:开发一个最简单的LED闪烁或串口打印“Hello World”的程序,生成AIS镜像并确保它能通过你设计的所有启动方式(SPI、UART等)成功运行。这个镜像将成为你硬件底板和基本启动流程的“试金石”,任何新板卡回来,先跑这个镜像。
- 理解AIS脚本内容:不要只把AISgen当作一个黑盒工具。尝试用文本编辑器打开生成的
.ais文件(虽然是二进制,但可以用十六进制查看器),结合AIS命令格式,粗略地看一下开头的SET命令是否和你配置的一致,结尾的JUMP_CLOSE地址是否正确。这能帮你发现一些工具配置上的低级错误。
启动引导是嵌入式系统开发中融合了硬件、底层软件和工具链知识的复杂环节。对于TMS320DM643x这样功能强大的DSP,其灵活的启动方式既是优势,也带来了学习的复杂性。希望这篇结合了官方文档精髓与实战踩坑经验的总结,能帮助你构建起对DM643x Bootloader清晰而深入的理解,让你在下次面对一块“沉默”的板卡时,能更有信心地找到问题的钥匙。