深入解析TMS320DM643x DSP启动引导:AIS脚本与多模式配置实践
1. 项目概述
在嵌入式系统开发中,启动引导程序(Bootloader)是系统上电后运行的第一个关键软件,它负责将处理器从“裸机”状态引导至一个可运行应用程序或操作系统的环境。对于德州仪器(TI)的TMS320DM643x系列数字信号处理器(DSP)而言,其片上ROM中固化的Bootloader提供了多种灵活的启动方式,而这一切的核心都围绕着一种名为AIS(Application Image Script)的专有脚本格式展开。如果你正在开发基于DM643x的工业控制、音视频处理或通信设备,理解并掌握这套启动机制,是确保产品稳定上电、快速加载和可靠运行的基础。
简单来说,DM643x的Bootloader就像一位经验丰富的“系统管家”。设备复位后,它会首先检查芯片外部几个特定引脚(BOOTMODE[3:0], FASTBOOT, AEM等)的电平状态,这个状态被锁存到BOOTCFG寄存器中。根据这个“启动菜单”的选择,“管家”决定以何种方式去获取第一段用户代码——是从SPI Flash读取,还是通过I2C EEPROM,亦或是等待UART主机发送,甚至是直接从EMIFA接口的NOR Flash启动。无论选择哪条路径,最终送达“管家”手中的“货物清单”都必须是一份标准格式的AIS脚本。这份脚本不仅包含了要加载的程序代码和数据,还精确地指示了“管家”如何配置PLL提升系统时钟、如何初始化DDR内存控制器、以及最终将控制权移交到哪个地址。本文将深入拆解AIS格式的每一个细节,并手把手带你实践SPI、I2C、UART、NAND Flash及EMIFA等多种启动模式的配置,让你彻底掌握DM643x的启动奥秘。
2. 启动模式深度解析与硬件配置
启动模式的选择,本质上是在告诉Bootloader从哪里、以何种方式获取AIS脚本。DM643x的启动模式大致可分为三类:非快速启动模式(FASTBOOT=0)、固定倍频快速启动模式(FASTBOOT=1, AEM[2:0]=001b)和用户可选倍频快速启动模式(FASTBOOT=1, AEM[2:0]=000b, 011b, 100b, 101b)。选择哪种模式,直接决定了Bootloader在开始加载AIS脚本前,是否以及如何配置系统锁相环(PLL),从而影响整个启动过程的初始运行速度。
2.1 启动引脚配置与模式选择
硬件设计阶段,你必须通过电阻上拉或下拉,正确设置BOOTMODE[3:0]、FASTBOOT、AEM[2:0]、PLLMS[2:0]和PCIEN等引脚。这些引脚的状态在电源复位(POR)的上升沿被采样并锁存到BOOTCFG寄存器,Bootloader随后读取该寄存器以决定行为。下面是一个典型的配置决策流程:
- 确定是否需要FASTBOOT:如果你的应用对启动速度有要求,或者需要使用PCI启动模式,必须将FASTBOOT引脚拉高(置1)。这会使Bootloader在启动初期就配置PLL,将CPU时钟从默认的晶振频率(如27MHz)提升到更高频率(如270MHz,对应PLLM=19),从而加速后续从外部存储器读取AIS脚本和数据的过程。
- 选择具体的启动介质:通过BOOTMODE[3:0]选择。例如:
0101b:I2C EEPROM启动。0110b:16位地址SPI EEPROM启动。1111b:24位地址SPI EEPROM启动(使用GPIO97作为片选)。1000b:UART启动(无硬件流控)。0111b:NAND Flash启动(必须连接至EMIFA CS2)。0100b:EMIFA ROM启动(带AIS格式)。
- 配置PLL倍频(如果FASTBOOT=1):
- 如果AEM[2:0]被设置为
001b,则进入固定倍频模式,PLL倍频器由BOOTMODE决定(例如HPI模式可能有x27, x20, x15等选项,其他模式通常为x20)。 - 如果AEM[2:0]为其他值(如
000b),则进入用户可选倍频模式,PLL倍频器由PLLMS[2:0]引脚决定,范围从x15到x30。
- 如果AEM[2:0]被设置为
注意:PLL的配置必须在芯片允许的时钟频率范围内。例如,对于DM6437-600器件,PLL输出频率不能超过600MHz。设计时务必查阅具体型号的数据手册,确保你选择的倍频组合不会超频。
2.2 各启动模式详解与硬件连接
不同的启动模式对应不同的物理接口和通信协议,硬件连接是成功的第一步。
2.2.1 SPI启动模式(16x8与24x8)SPI启动利用McBSP0模块模拟SPI主控制器。关键在于正确连接引脚和配置时钟极性。
- 16x8模式(BOOTMODE=0110b):支持最大64KB(16位地址)的SPI EEPROM。连接方式为:
- SPI EEPROM
Sn(片选) -> DSPFSX0 - SPI EEPROM
C(时钟) -> DSPCLKX0 - SPI EEPROM
D(数据输入,MOSI) -> DSPDX0 - SPI EEPROM
Q(数据输出,MISO) -> DSPDR0Bootloader会将SPI时钟配置为无效态高电平(CLKXP=0),并在时钟上升沿采样数据(CLKSTP=11b),这与大多数标准SPI EEPROM的时序兼容。
- SPI EEPROM
- 24x8模式(BOOTMODE=1111b):支持更大容量(16MB,24位地址)的SPI EEPROM。由于McBSP单次传输限制为32位,而“8位命令+24位地址+8位哑元”需要40位,因此Bootloader改用GPIO97作为片选,并将McBSP配置为8位数据传输模式,通过多次8位传输完成一次读操作。连接方式需调整为:
- SPI EEPROM
Sn-> DSPGPIO97 - SPI EEPROM
C-> DSPCLKX0 - SPI EEPROM
D-> DSPDX0 - SPI EEPROM
Q-> DSPDR0 FSX0引脚悬空不接。
- SPI EEPROM
2.2.2 I2C启动模式I2C启动模式要求一个I2C EEPROM作为从设备,其7位从机地址必须固定为0x50(即1010000b)。Bootloader作为I2C主机,会按照标准I2C协议读取数据。连接时,务必在SDA和SCL线上接上拉电阻(典型值4.7kΩ)。Bootloader会根据FASTBOOT设置不同的I2C时钟频率(标准模式约87kHz,快速模式约310kHz),你需要确保EEPROM支持相应的速率。
2.2.3 UART启动模式UART启动是一种从机模式。Bootloader会先通过UART0发送字符串“BOOT ME”给主机(如PC),然后等待主机以ASCII字符形式发送AIS脚本。波特率固定为115200 bps,8位数据,1位停止位,无校验。如果选择BOOTMODE=1110b,则启用硬件流控(RTS/CTS),这在高波特率或主机处理速度慢时有助于防止数据丢失。你需要一个UART转USB工具将DSP与PC连接。
2.2.4 NAND Flash启动模式NAND启动要求Flash芯片连接到EMIFA的CS2片选。Bootloader会从块1(Block 1)开始搜索AIS魔数(Magic Number),自动跳过被标记为坏块(Spare Area偏移0x4处为0xBADDBADD)的区域,并启用硬件ECC进行1位纠错。一个关键限制是:Bootloader不支持需要切换片选(Toggle)操作的特殊NAND器件。在选型时,必须确认你的NAND芯片型号在Bootloader的支持列表中(如K9F系列等)。
2.2.5 EMIFA ROM启动模式这是最直接的启动方式之一。当BOOTMODE=0100b时,如果FASTBOOT=0,DSP硬件会直接从EMIFA地址0x42000000开始执行代码(非AIS格式)。如果FASTBOOT=1,则Bootloader会介入,从0x42000000读取AIS格式的镜像。此时,存储器的第一个字节(8位设备)或字(16位设备)必须指明数据宽度(0x00代表8位,0x01代表16位),紧接着的3个字节保留,从下一个32位字边界开始才是AIS魔数0x41504954。
3. AIS(Application Image Script)格式精解
AIS是TI为其Bootloader设计的一种紧凑的、命令驱动的脚本格式。它不仅仅是一个二进制镜像的容器,更是一个可以执行初始化操作的“微型脚本引擎”。理解AIS的每个命令,是进行高级启动配置的关键。
3.1 AIS整体结构与魔数
一个完整的AIS数据流始于一个32位的魔数(Magic Number):0x41504954(ASCII对应“AIP T”)。Bootloader在接收到这个魔数后,才会开始解析后续的命令流。AIS命令流由一系列命令组成,最终必须以一个JUMP_CLOSE命令结束,该命令指示了应用程序的入口地址。
3.2 核心AIS命令详解
每个AIS命令由一个32位的操作码(Opcode)和可选的数据参数构成。以下是几个最核心的命令:
3.2.1 SET命令 (Opcode: 0x58535907)SET命令用于在加载应用程序之前配置DSP的内部寄存器,例如PLL、DDR控制器、EMIF等。这对于在高速(FASTBOOT)模式下正确初始化外部内存至关重要。其格式为:
0x58535907 (SET Opcode) <TYPE> // 数据类型和位域信息 <ADDRESS> // 要写入的寄存器地址 <DATA> // 要写入的数据 <SLEEP> // 写入后的延时(CPU周期数)<TYPE>字段非常强大,它不仅可以指定写入8位、16位或32位数据,还可以指定只写入某个寄存器的特定位域(Field/Bits)。例如,<TYPE>值为0x04010008表示:数据类型为“域”(4),起始位是8,结束位是16。Bootloader会先读取<ADDRESS>处的值,修改指定比特位,再写回。
3.2.2 SECTION_LOAD命令 (Opcode: 0x58535901)这是加载应用程序代码和数据的主要命令。格式如下:
0x58535901 (SECTION_LOAD Opcode) <ADDRESS> // 目标加载地址(如 0x10800000) <SIZE> // 要加载的字节数 <DATA0> // 数据字0 <DATA1> // 数据字1 ... <DATAn> // 数据字nBootloader会连续读取SIZE字节的数据,并将其写入从ADDRESS开始的内存中。通常,一个应用程序的.text(代码)段和.data(已初始化数据)段会各对应一个SECTION_LOAD命令。
3.2.3 SECTION_FILL命令 (Opcode: 0x5853590A)用于将某段内存区域填充为固定模式,常用于初始化.bss段(清零)或设置特定内存模式。格式类似于SECTION_LOAD,但用<PATTERN>代替了数据流。
3.2.4 JUMP_CLOSE命令 (Opcode: 0x58535906)AIS脚本的终止符。它告诉Bootloader:“所有代码和数据已加载完毕,现在请跳转到指定地址开始执行应用程序,并且我的任务结束了。” 其格式为:
0x58535906 (JUMP_CLOSE Opcode) <ENTRY_POINT> // 应用程序入口地址(如 0x10800000) <SECTION_COUNT> // 本次启动应加载的总段数 <BYTE_COUNT> // 本次启动应加载的总字节数后两个参数用于Bootloader进行完整性校验。
3.2.5 函数执行命令 (Opcode: 0x5853590D)这是一个高级功能,允许你调用Bootloader ROM中预置的初始化函数。目前支持三个函数:
- PLL配置函数(索引0):3个参数(PLL倍频器、CPU分频、时钟源)。
- EMIFA配置函数(索引1):5个参数(AB1CR, AB2CR, AB3CR, AB4CR, NANDFCR 控制寄存器值)。
- DDR内存控制器配置函数(索引2):9个参数(DDR PLL配置、各种时序参数)。
使用函数执行命令比用多个SET命令更简洁,且这些函数可能包含必要的延时和状态检查。例如,配置PLL和DDR的命令序列如下所示:
0x5853590D // 函数执行命令 0x00030000 // 3个参数,函数索引0(PLL配置) 0x00000015 // PLLM = 21 (PLL倍频为22) 0x00000001 // PLLDIV1 = 1 (CPU时钟2分频) 0x00000000 // 时钟源 = 0 (内部) 0x5853590D // 函数执行命令 0x00090002 // 9个参数,函数索引2(DDR配置) 0x00000017 // DDR PLLM 0x00000001 // DDR CLK DIV ... (后续DDR控制器寄存器值)3.3 CRC校验机制
为了保证在传输过程中(尤其是UART、I2C等易受干扰的接口)加载数据的正确性,AIS支持CRC-32校验。ENABLE_CRC(0x58535903)和REQUEST_CRC(0x58535902)命令配合使用。
- 分段CRC:在每个
SECTION_LOAD或SECTION_FILL命令后紧跟一个REQUEST_CRC命令,并附上该段数据的预期CRC值。Bootloader计算该段的CRC(计算范围包括段地址、段大小和段数据本身)并进行比对。如果失败,Bootloader会通过BOOTCMPLT寄存器报告错误,并根据REQUEST_CRC命令中提供的“负向指针”回退到上一个检查点重新加载。 - 整体CRC:在所有段加载完毕后,进行一次总的CRC校验。 CRC生成算法使用多项式
0x04C11DB7。在生成AIS文件时,genAIS工具可以自动计算并插入CRC命令和值。
4. 使用genAIS工具生成AIS镜像
TI提供了Perl脚本工具genAIS.pl,用于将链接后的可执行文件(.out)转换成特定启动模式所需的AIS格式文件。这是将你的应用程序部署到Flash或EEPROM的关键一步。
4.1 基本命令与参数
一个典型的命令如下:
genAIS.pl -i my_app.out -o my_app_spi.ais -bootmode spi -otype ascii -addrsz 16 -crc 1-i:指定输入的.out文件。-o:指定输出的AIS文件。-bootmode:指定启动模式(spi,i2c,uart,nand,emifa,raw等)。raw模式生成与启动方式无关的通用AIS。-otype:输出文件格式。ascii是十六进制文本,便于查看和通过UART发送;binary是纯二进制,适合直接烧录到Flash;asm生成汇编.word伪指令文件,可再次汇编链接。-addrsz:对于SPI模式,指定EEPROM的地址宽度(16或24位)。-memwidth:对于I2C/SPI,指定存储器数据宽度(DM643x的I2C只支持16位)。-datawidth:对于EMIFA FASTBOOT,指定Flash的数据宽度(8或16位)。注意:这不能替代硬件上EMIF_8_16引脚的正确设置。-crc:CRC选项。0为无CRC,1为分段CRC,2为整体CRC。-cfg:指定一个配置文件,该文件包含一系列要在AIS镜像最前面执行的SET或函数执行命令。这个功能极其重要,用于在加载应用程序前初始化PLL、EMIF、DDR等关键外设。
4.2 配置文件(-cfg)的编写与使用
配置文件是一个纯文本文件,里面直接写入要嵌入AIS开头的命令序列,通常用于外设初始化。例如,一个名为init_ddr.cfg的配置文件可能包含:
# 初始化PLL,倍频到22倍,CPU分频为2 0x5853590D # 函数执行命令 0x00030000 # 3个参数,函数索引0 (PLL配置) 0x00000015 # PLLM = 21 (0x15),即倍频22 0x00000001 # PLLDIV1 = 1 (2分频) 0x00000000 # 时钟源:内部 # 初始化EMIFA 0x5853590D # 函数执行命令 0x00050001 # 5个参数,函数索引1 (EMIFA配置) 0x3FFFFFFC # AB1CR 值 0x3FFFFFFC # AB2CR 值 0x3FFFFFFC # AB3CR 值 0x3FFFFFFC # AB4CR 值 0x00000000 # NANDFCR 值 # 初始化DDR2内存控制器 0x5853590D # 函数执行命令 0x00090002 # 9个参数,函数索引2 (DDR配置) 0x00000017 # DDR PLLM 0x00000001 # DDR CLK DIV 0x0000000B # VPBE CLK DIV 0x00000000 # PLL SRC (内部) 0x50006405 # DDRPHYCR 控制寄存器 0x00138822 # SDBCR (SDRAM配置寄存器) 0x16492148 # SDTIMR (SDRAM定时器0) 0x000CC702 # SDTIMR2 (SDRAM定时器1) 0x000004EF # SDRCR (SDRAM刷新控制)然后在genAIS命令中加上-cfg init_ddr.cfg,这些初始化命令就会出现在AIS魔数之后、你的应用程序段加载命令之前。Bootloader会首先执行这些配置,确保当它开始将代码加载到DDR内存时,DDR控制器已经正确初始化。
4.3 依赖与注意事项
genAIS工具内部会调用TI的ofd6x(Object File Display)工具来解析.out文件。你需要确保Code Generation Tools(CGT)已正确安装,并且ofd6x的版本在v6.1.0A06333或以上。在某些Windows系统上,如果Perl的system()函数调用失败,你需要手动运行ofd6x生成XML中间文件,再提供给genAIS:
ofd6x -x --obj_display=none,header,optheader,sections,symbols my_app.out -o my_app.xml genAIS.pl -i my_app.out -x my_app.xml -o my_app.ais -bootmode uart -otype txt5. 各启动模式下的AIS镜像实例分析
理解AIS的抽象格式后,我们结合具体启动模式来看其物理存储布局。这能帮你更好地调试和验证烧录到存储器的数据是否正确。
5.1 SPI启动镜像布局
对于SPI启动,AIS镜像的第一个32位字必须包含EEPROM的地址宽度(以字节为单位)。对于16位地址的SPI EEPROM,该值为0x00000002;对于24位地址,则为0x00000003。这个字必须存储在EEPROM的地址0处。紧接着从地址4开始,才是AIS魔数0x41504954。
在二进制烧录文件中,你需要特别注意字节序(Endianness)。Bootloader期望数据按照小端字节序(Little-Endian)存储在存储器中。例如,AIS魔数0x41504954(在内存中表示为54 49 50 41),在SPI EEPROM中的存储顺序(从低地址到高地址)应该是:
| 字节地址 | 字节0 | 字节1 | 字节2 | 字节3 | 解释 |
|---|---|---|---|---|---|
| 0x0000 | 0x02 | 0x00 | 0x00 | 0x00 | 地址宽度=2字节 |
| 0x0004 | 0x54 | 0x49 | 0x50 | 0x41 | AIS魔数0x41504954 |
| 0x0008 | 0x03 | 0x59 | 0x53 | 0x58 | 启用CRC命令0x58535903 |
| ... | ... | ... | ... | ... | ... |
当你使用编程器将.ais二进制文件烧录到SPI Flash时,通常编程器软件会处理字节序。但如果你是自己编写程序通过DSP的SPI接口来写入EEPROM,就必须确保按上述字节顺序写入。
5.2 I2C启动镜像布局
I2C启动的AIS格式与SPI非常相似,但第一个32位字是保留的(通常填充0x00000002,但Bootloader会忽略它),从第二个字(EEPROM地址0x04)开始才是AIS魔数。I2C EEPROM的数据也要求是小端字节序。
5.3 UART启动数据传输流程
UART启动是交互式的。流程如下:
- DSP上电,Bootloader配置UART(115200, 8N1)。
- DSP主动发送字符串
BOOT ME给主机。 - 主机收到后,开始以ASCII字符形式(十六进制数字的字符表示)发送AIS数据流,字符间不能有任何空格或换行。
- 例如,要发送魔数
0x41504954,主机需要依次发送四个字节:'4','1','5','0','4','9','5','4'(即字符串"41504954")。Bootloader会将其转换回二进制值0x41504954。 - 主机持续发送所有AIS命令和数据。
- 当Bootloader接收到
JUMP_CLOSE命令后,它会向主机发送字符串DONE,然后跳转到应用程序入口点。 - 如果过程中发生CRC错误,Bootloader会发送
CORRUPT并重试。
因此,用于UART启动的AIS文件应使用-otype txt选项生成,得到一个纯ASCII文本文件,主机程序只需按顺序发送该文件中的每一个字符即可。
5.4 NAND Flash启动的特殊性
NAND启动的AIS数据流开头有三个特殊的预留字,用于指示镜像在NAND中的物理位置:
0x41504954:AIS魔数。0x00000000:占位符,表示AIS镜像跨越的页数(需在烧录时填充)。0x00000000:占位符,表示镜像起始的块号(需在烧录时填充)。0x00000000:占位符,表示镜像起始的页号(需在烧录时填充)。
genAIS工具生成NAND AIS镜像时,会为这三个位置填充0。你必须在使用编程器或DSP自身将镜像写入NAND Flash后,根据实际的写入位置(块号、页号)和镜像大小(页数),手动回填这三个字段的值。如果这些值不正确,Bootloader将无法找到有效的AIS魔数,导致启动失败。
6. 实战:从编译到烧录的完整流程
让我们以一个具体的例子,将一段简单的汇编程序(例如,循环递增一个计数器)通过SPI Flash启动。
步骤1:编写应用程序并编译链接假设你有一个简单的汇编程序start.asm,定义了入口点_c_int00,并链接到地址0x10800000(内部RAM)。使用TI的汇编器和链接器生成my_app.out。
cl6x -mv6400+ --abi=coffabi start.asm -z -o my_app.out -heap 0x1000 -stack 0x1000 -m my_app.map步骤2:创建PLL/DDR初始化配置文件根据你的硬件(如DDR2芯片型号、时钟频率),计算正确的寄存器值,编写init_hw.cfg文件,内容如第4.2节示例。
步骤3:使用genAIS生成AIS镜像针对16位地址、8位数据宽度的SPI EEPROM,生成带分段CRC校验的二进制AIS文件。
genAIS.pl -i my_app.out -o my_app_spi.bin -bootmode spi -otype binary -addrsz 16 -crc 1 -cfg init_hw.cfg步骤4:烧录AIS镜像到SPI EEPROM使用专用的SPI Flash编程器(或通过JTAG在DSP中运行一个烧录程序),将生成的my_app_spi.bin文件烧录到SPI EEPROM的起始地址(0x000000)。务必确认编程器设置或烧录程序是按照小端字节序写入的。
步骤5:配置硬件启动模式将DM643x的BOOTMODE[3:0]引脚设置为0110b(SPI 16x8启动),FASTBOOT引脚根据是否需要高速启动设置,AEM/PLLMS引脚根据PLL需求设置。确保SPI EEPROM的硬件连接正确(见2.2.1节)。
步骤6:上电测试与调试给系统上电。如果启动失败,首先检查电源、时钟和复位信号是否正常。然后,可以通过JTAG连接DSP,在Bootloader运行后或启动失败后,读取BOOTCMPLT寄存器的ERR字段。该字段的错误码(见原文表32)能提供明确的失败原因,例如:
0x1: 收到无效AIS命令(AIS文件可能损坏或烧录错位)。0x2: UART模式下未收到魔数(主机未及时响应或波特率不匹配)。0x4: CRC校验失败(数据传输或存储过程发生比特错误)。0x5: SPI地址宽度无效(-addrsz参数设置与EEPROM实际不符)。0xD: PLL锁相失败(PLL配置参数可能超出范围或不稳定)。
7. 高级主题与避坑指南
7.1 Bootloader对内存和Cache的使用
Bootloader自身需要使用一部分RAM作为栈和临时缓冲区。这部分内存位于L1D Cache的前20KB。你的应用程序链接命令文件(.cmd)必须避免将任何已初始化(.text, .data, .cinit等)的段分配到这片区域(通常是0x10800000 - 0x10804FFF),否则Bootloader的数据会被覆盖,导致启动失败。未初始化的段(如.bss, .far)可以分配到这里,因为它们是在Bootloader退出、应用程序开始运行后才被初始化的。
此外,Bootloader在启动过程中会禁用所有Cache(L1P, L1D, L2)。即使在AIS脚本中使用SET命令使能了Cache,Bootloader在跳转到应用程序前也会再次禁用它们。因此,你的应用程序入口代码必须包含显式使能Cache的步骤,如果你希望使用Cache来提升性能。
7.2 启动操作系统(如Linux/DSP/BIOS)
ROM Bootloader本身不关心它加载的是裸机程序还是操作系统的引导程序。要启动像uClinux这样的操作系统,通常采用二级引导(Secondary Boot)策略:
- 一级引导:ROM Bootloader从SPI/I2C等介质加载一个符合AIS格式的二级引导程序(如U-Boot的SPL)。这个二级引导程序体积很小,只包含最基本的硬件初始化。
- 二级引导:ROM Bootloader将控制权交给二级引导程序。二级引导程序再从其熟悉的格式(如U-Boot的uImage)中,从NAND、MMC或网络加载完整的内核和文件系统,并启动它们。
因此,你只需要确保二级引导程序的镜像被转换成AIS格式即可,操作系统的核心镜像可以保持其原有格式。
7.3 确定芯片上的Bootloader版本
不同版本的DM643x芯片,其ROM中的Bootloader版本可能不同。你可以通过JTAG读取地址0x00101A00处的值来获取版本信息:
0x27B2A120:仅支持EMIFA直接启动,不支持FASTBOOT及其他模式。0x00010200,0x00010300,0x00010400:支持本文描述的所有功能,包括FASTBOOT和各种启动模式。 在选型和设计时,务必确认芯片的Bootloader版本符合你的需求。
7.4 常见问题排查速查表
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 无法启动,JTAG连接后PC停在ROM中 | 1. 启动模式引脚配置错误。 2. 外部存储器无响应或连接错误。 3. AIS魔数未找到。 | 1. 测量BOOTMODE等引脚电平,与BOOTCFG寄存器值对比。 2. 检查Flash/EEPROM的电源、片选、时钟和数据线。 3. 用编程器读取存储器起始内容,确认AIS魔数 0x41504954在正确位置。 |
| CRC错误(ERR=0x4) | 1. 数据传输过程干扰(UART/I2C)。 2. 存储器物理损坏或读写时序不当。 3. genAIS使用的CRC选项与AIS文件中命令不匹配。 | 1. 检查通信线路质量,降低波特率(UART)或时钟频率(I2C/SPI)测试。 2. 换用存储器测试。 3. 确认 -crc参数设置,并检查AIS文件中ENABLE_CRC和REQUEST_CRC命令是否存在且顺序正确。 |
| PLL锁相失败(ERR=0xD) | 1. PLL配置参数(倍频、分频)超出芯片或具体型号允许范围。 2. 外部晶振或时钟输入不稳定。 | 1. 查阅芯片数据手册,确认PLL倍频器(PLLM)和输出频率范围。 2. 检查时钟源电路,测量CLKIN引脚波形。 |
| 应用程序跑飞或硬件异常 | 1. 应用程序链接地址与AIS中加载地址不匹配。 2. DDR或EMIF未正确初始化,访问外部内存失败。 3. Cache未正确使能/禁用,导致数据一致性错误。 | 1. 核对链接命令文件(.cmd)中的内存区域定义与AIS加载地址。 2. 确保在AIS开头(通过 -cfg文件)正确初始化了DDR/EMIF控制器,时序参数与你的内存芯片匹配。3. 在应用程序开头添加Cache使能代码( CSL库函数或直接写寄存器)。 |
| UART启动时主机收不到“BOOT ME” | 1. 串口线连接错误(TX/RX反接)。 2. 波特率、数据位、停止位设置与Bootloader(固定115200 8N1)不匹配。 3. 硬件流控引脚影响(如果模式为1000b却连接了RTS/CTS)。 | 1. 交叉TX/RX线再试。 2. 确认主机串口工具设置为115200, 8N1。 3. 尝试不使用硬件流控的模式(BOOTMODE=1000b),或将RTS/CTS引脚正确连接/上拉。 |
掌握TMS320DM643x的Bootloader与AIS格式,意味着你掌握了让这颗强大DSP“苏醒”的钥匙。从理解启动引脚配置,到深入AIS命令集的每一个细节,再到熟练使用genAIS工具和应对各种启动故障,这个过程需要耐心和实践。建议你从最简单的UART启动开始实验,因为它便于观察和调试数据流,然后再逐步挑战SPI、I2C等需要预先烧录存储器的模式。记住,仔细阅读芯片勘误表和数据手册,严格计算硬件时序参数,并充分利用BOOTCMPLT寄存器的错误信息,是解决复杂启动问题的关键。当你成功地从一片空白的Flash中引导起自己的系统时,这份对底层机制的掌控感,将是嵌入式开发中最有价值的回报之一。