1. 项目概述与引导机制核心价值
在嵌入式系统开发,尤其是基于德州仪器TMS320C665x这类高性能多核DSP的复杂应用中,系统上电后的第一行代码如何执行,是整个项目成败的基石。这不仅仅是“把程序放进去跑起来”那么简单,它关乎到系统能否在脱离仿真器和调试器的情况下独立、可靠地启动,更决定了产品在现场的稳定性、可维护性以及后续的在线升级能力。我接触过不少项目,硬件设计精良,软件算法优秀,但最终却卡在了“板子脱机跑不起来”这个看似基础的问题上,根源往往就是对引导过程的细节理解不透彻。
TMS320C6652和C6654芯片内部固化了一段不可修改的ROM代码,即ROM Bootloader。它的核心任务,是在芯片上电或复位后,根据一组预先定义好的硬件引脚状态(BOOTMODE引脚)和存储在特定非易失性存储器中的配置信息,自动完成最基础的硬件初始化,并将最终的用户应用程序代码从外部存储介质搬运到内部或外部RAM中执行。这个过程完全由硬件逻辑和固化ROM代码控制,无需用户干预,是实现“自举”的关键。
为什么我们需要如此深入地研究这些配置表和比特位定义?因为在真实的项目开发中,你几乎不可能只使用TI默认的配置。你的硬件设计可能使用了特定频率的晶振,你的Flash芯片可能不是官方评估板上的型号,你的系统可能需要通过以太网进行远程更新,或者需要通过PCIe总线从主机加载固件。这些定制化需求,都要求你能够精确地理解并配置引导参数表中的每一个字段。这份技术手册的章节,就像是一把钥匙,它详细描述了每种引导模式(SGMII以太网、NAND、PCIe、I2C、SPI、UART)下,RBL如何解读这些配置信息。掌握它,意味着你获得了让DSP按照你设计的路径启动的主动权。
2. 引导模式选择与设备配置字段解析
芯片上电后,RBL首先会采样一组专用的BOOTMODE引脚的电平状态。这个状态决定了芯片第一次尝试从哪个外部接口去寻找引导信息。这是整个引导过程的“总开关”。然而,仅仅知道从哪个接口启动还不够,这个接口本身可能有多种工作模式、时钟要求和寻址方式。这就是“设备配置字段”存在的意义。它是一组紧凑的比特位信息,通常与BOOTMODE引脚的状态一同被锁定在芯片内部,或者在引导过程的早期从特定位置读取,用于对选定的引导外设进行最初步的、最基本的配置。
2.1 以太网SGMII引导配置详解
以太网引导,尤其是SGMII接口,是C6654(注意,C6652不支持)进行高速网络化引导或系统调试的利器。其设备配置字段集中在几个关键的比特位上,任何配置错误都可能导致物理链路无法建立。
SerDes时钟倍频(Bit 9-8):这是SGMII物理层SerDes模块的核心配置。SGMII协议要求链路速率为1.25 Gbps。SerDes模块需要一个参考输入时钟,并通过内部的PLL倍频到所需的高速串行时钟。这个字段就是告诉RBL,你给SerDes参考时钟引脚提供了多大的频率,以便它正确配置PLL倍频器。
00b: 对应输入时钟156.25 MHz。PLL倍频系数为8(156.25 * 8 = 1.25G)。这是非常常见的配置,因为156.25MHz可以由板上晶振直接提供,或由时钟芯片分频得到。01b: 对应输入时钟250 MHz。倍频系数为5(250 * 5 = 1.25G)。10b: 对应输入时钟312.5 MHz。倍频系数为4(312.5 * 4 = 1.25G)。11b: 保留,不可使用。
实操心得:这个配置必须与你的硬件原理图完全一致。我曾遇到一个案例,硬件工程师为了节省成本,将参考时钟设计为125MHz,但手册中并无此选项。最终解决方案是修改设计,采用156.25MHz的有源晶振。切记,这里的时钟是供给SerDes模块的模拟PLL的,与DSP核的主时钟无关。
外部连接模式(Bit 7-6):这个配置决定了DSP的SGMII端口以何种角色与对端设备连接。
00b: MAC to MAC,主模式,启用自协商。这是DSP作为主动方,连接另一个支持自协商的网络设备(如交换机、另一个DSP)的典型配置。01b: MAC to MAC,从模式,或MAC连接PHY。当DSP需要连接到一个标准的以太网PHY芯片时,通常选择此模式。在某些点对点直连且DSP作为从设备的场景下也可能用到。10b: MAC to MAC,强制链路。禁用自协商,强制建立1.25Gbps全双工链路。在对端设备不支持或自协商不稳定时使用。11b: MAC to Fiber,连接光纤模块。用于SFP光模块连接。
设备ID(Bit 5-3):这是一个3比特的值(0-7),会被填入后续引导过程中发送的“Ethernet Ready”帧里。在多DSP系统中,主机可以通过这个ID来区分不同的从设备,实现定向引导。如果只有单设备,通常设为0即可。
2.2 NAND Flash引导配置解析
NAND Flash因其高容量和低成本,是存储大量应用程序镜像的常用选择。但其访问需要复杂的时序控制,RBL需要知道从哪里开始读。
起始块(Bit 9-5):这是一个5比特字段,指定RBL从NAND Flash的哪个物理块(Block)开始读取引导参数表和镜像。范围是0到31。这里有一个关键点:NAND Flash通常以页(Page)为基本读写单位,以块为擦除单位。RBL的初始读取是以块为单位的。你需要确保指定的起始块是有效的、已擦除的,并且其内部存储的数据结构符合RBL的预期。在准备镜像时,必须使用TI的nandwriter等工具,将镜像正确烧写到这个指定的起始块。
I2C参数读取(Bit 4):这是一个非常灵活的功能。
0: RBL使用设备配置字段中定义的参数(主要是上面的起始块)直接访问NAND。1: RBL首先通过I2C总线,从一个预设地址的EEPROM中读取NAND的详细配置参数(如页大小、块大小、ECC配置、时序参数等),然后再用这些参数去访问NAND Flash。
避坑指南:如果你的NAND Flash型号比较特殊,或者其时序参数不在RBL的默认支持列表中,强烈建议使用I2C EEPROM方式。你可以将精确的NAND配置信息(通常是一个完整的
NAND_TIMING结构体)预先烧录到EEPROM中。这样,RBL就能以最匹配的时序访问你的Flash,极大提高引导成功率。否则,你可能遇到因时序不匹配导致的读取数据错误,引导失败。
2.3 PCIe引导配置解析
PCIe引导允许C6654作为端点设备(Endpoint),从主机(Root Complex)直接获取引导镜像。这对于板卡作为PCIe插卡的应用场景至关重要。
参考时钟配置(Bit 9):
0: PCIe参考时钟为100 MHz。这是PCIe规范中最常见的参考时钟频率。1: PCIe参考时钟为250 MHz。相对少见,需与主机侧严格匹配。
BAR配置(Bit 8-5):这是PCIe引导配置中最复杂的部分,它定义了DSP作为端点设备,其内部地址空间如何通过PCIe配置空间中的基址寄存器映射到主机的内存空间。表6-69详细列出了16种可能的配置(0x0到0xF),定义了BAR0到BAR5(或64位组合BAR)的窗口大小(单位为MB)。
例如,BAR CFG = 0b0000表示:
- BAR0: 映射PCIe模块自身的配置寄存器(MMRs)。
- BAR1: 32 MB窗口。
- BAR2: 32 MB窗口。
- BAR3: 32 MB窗口。
- BAR4: 32 MB窗口。
- BAR5: 是BAR4的克隆(Clone)。
而BAR CFG = 0b1000则表示:
- BAR2/3(组合为64位BAR): 128 MB窗口。
- BAR4/5(组合为64位BAR): 256 MB窗口。
核心原理:主机在枚举PCIe设备时,会为这些BAR分配物理地址。当主机向这些地址读写时,访问就会被路由到DSP内部对应的内存区域。RBL在引导初期,会将自己需要被访问的内存区域(如下文要讲的引导参数表所在位置)映射到某个BAR窗口内,并告知主机。主机驱动程序则通过向这个BAR对应的地址写入引导数据包,来完成镜像传输。因此,BAR配置必须与你的DSP软件所期望的内存映射,以及主机驱动程序的实现相匹配。配置不当会导致主机无法正确访问DSP内存,引导失败。
2.4 I2C引导配置解析
I2C引导模式分为主模式和被动模式,其设备配置字段长度不同,体现了不同的工作逻辑。
I2C主模式(12比特配置):在此模式下,DSP的RBL作为I2C总线的主机,主动去读取EEPROM中的内容。
- 模式(Bit 12):
0代表主模式。 - 地址(Bit 11-10): 选择从哪个I2C器件地址读取。
00b对应0x50,这是24系列EEPROM的典型地址。01b,10b,11b分别对应0x51, 0x52, 0x53,用于连接多个EEPROM或地址可配置的器件。 - 速度(Bit 9): 选择初始通信速率。
0为慢速模式(SYSCLK/5000),1为快速模式(SYSCLK/250)。这里有个关键顺序:RBL会先以这个初始速率读取一次配置表,表中包含了目标PLL倍频信息。配置好PLL后,RBL会按照配置表里设定的新速率进行后续的镜像数据读取。这保证了在系统时钟未稳定前,能以较低速可靠通信。 - 参数索引(Bit 8-3): 指定从EEPROM的哪个“配置表索引”开始读取。每个索引对应一个128字节(0x80)的参数表。这允许你在一个EEPROM中存储多套引导配置,通过硬件引脚或其它方式选择使用哪一套。
I2C被动模式(12比特配置):在此模式下,DSP的RBL不作为主机,而是作为从设备,监听特定的I2C地址,等待外部主机(如另一个MCU)通过I2C总线向其发送引导数据。
- 模式(Bit 12):
1代表被动模式。 - 地址(Bit 11-5): 设置DSP在引导期间监听的I2C从地址(0x00到0x7F)。外部主机需要向这个地址写入数据。
2.5 SPI引导配置解析
SPI引导与I2C主模式类似,也使用12比特的扩展配置字段,因为它需要配置的通信参数更多。
- 模式(Bit 12-11): 这2比特配置SPI的时钟极性和相位(CPOL和CPHA),即SPI的四种工作模式(0,1,2,3)。此配置必须与你的SPI Flash芯片数据手册的要求完全一致,否则无法正确采样数据。
- 4/5引脚模式(Bit 10): 选择使用标准的4线SPI(SCLK, MOSI, MISO, CS)还是5线SPI(多了一根
HOLD或WP引脚)。绝大多数SPI Flash使用4线模式。 - 地址宽度(Bit 9): 选择SPI Flash的地址是16位(
0)还是24位(1)。容量较小的Flash(如<16Mb)常用16位地址,更大容量的则使用24位地址。 - 片选(Bit 8-7): 选择使用哪个SPI片选信号(CS0或CS1)。如果你的板子上只有一个SPI Flash挂在CS0上,这里就配置为
10b。 - 参数表索引(Bit 6-3): 与I2C类似,指定从SPI Flash的哪个“参数表索引”开始读取。每个索引对应一个128字节的参数表,起始地址为
0x80 * 索引值。
3. 引导参数表:引导流程的“剧本”
设备配置字段只是“敲门砖”,它让RBL能够以正确的姿势“敲开”外部存储设备的大门。而真正指导RBL完成整个复杂引导流程的,是存储在设备中的引导参数表。你可以把它理解为RBL要执行的“剧本”,里面详细写明了每一幕的细节。
所有引导模式的参数表都有一个共同的开头,即“公共字段”,其结构如下表所示:
| 字节偏移 | 字段名 | 描述 |
|---|---|---|
| 0 | Length | 整个参数表的长度(字节),包含本长度字段自身。 |
| 2 | Checksum | 整个参数表的16位校验和。RBL会计算校验和并与该值比对,不匹配则引导失败。这是早期排查引导问题的关键点。 |
| 4 | Boot Mode | 引导模式标识。例如,0x0A(10)代表以太网,0x50(80)代表NAND等。此字段必须与BOOTMODE引脚选择的模式以及实际存储设备内容匹配。 |
| 6 | Port Num | 端口号。对于多端口设备(如多路以太网),指定从哪个端口引导。0xFFFF表示所有端口(用于以太网广播)。 |
| 8 | PLL config, MSW | PLL配置字的高16位。 |
| 10 | PLL config, LSW | PLL配置字的低16位。 |
PLL配置详解:这是引导过程中第一个重要的硬件初始化步骤。在读取外部镜像之前,RBL可能需要将芯片的内核时钟、总线时钟提升到更高的频率,以加速后续的数据加载过程。PLL配置字段(32位)包含了预分频、倍频和后分频系数,以及一个控制位(PLL Config Ctl)。
0b00: 不配置PLL。使用复位后的默认时钟。0b01或0b10: 仅在PLL当前被禁用或处于旁路模式时,才用表中的参数配置PLL。0b11: 禁用PLL并将其置于旁路模式。
重要经验:在引导初期就提升时钟频率是一把双刃剑。好处是能显著加快大镜像的加载速度。风险是,如果PLL配置参数(特别是输入时钟频率
CLKIN)设置错误,可能导致PLL失锁,系统挂死。对于时间不敏感或镜像很小的应用,一个稳妥的做法是在引导参数表中选择不配置PLL(或仅配置到较低频率),将完整的时钟初始化工作留给第二阶段引导程序或主应用程序去做。这样可以提高引导过程的鲁棒性。
3.1 以太网SGMII引导参数表实战
以太网引导参数表在公共字段之后,扩展出了大量网络相关的配置,是功能最复杂的引导模式之一。
核心字段解析:
- MAC地址(偏移14-18): 设置DSP在引导阶段使用的单播MAC地址。主机需要向这个地址发送引导包。
- 组播MAC地址(偏移20-24): 用于接收组播引导包。如果不使用组播,可以设置为广播地址(如FF:FF:FF:FF:FF:FF)。
- UDP端口(偏移26-28):
Source Port和Dest Port。RBL会监听Dest Port端口,并只接受源端口为Source Port的UDP包。如果Source Port为0,则接受任何源端口的包。这构成了一个简单的网络过滤机制。 - 设备ID(偏移30-32): 一个4字节的标识符,会包含在RBL发出的“Ethernet Ready”帧中。主机可以用它来识别特定的DSP设备,在多设备环境中非常有用。
- SGMII配置(偏移40): 这是一个16位的字段,其低4位(Index)和两个控制位(Direct, Bypass)共同决定了SGMII物理层的详细配置方式。
Index字段与设备配置字段中的“外部连接模式”含义类似。Direct位为1时,表示忽略Index,直接使用后面偏移42-56的各个SGMII控制寄存器值进行精细配置。Bypass位为1时,RBL将跳过SGMII的配置(假设它已被预先配置好)。
以太网引导流程还原:
- RBL根据设备配置字段初始化SGMII SerDes和MAC层。
- 根据参数表配置MAC地址、端口号,并开始监听网络。
- RBL主动发出一个包含自身设备ID的“Ethernet Ready”广播/单播帧,宣告自己已准备好接收引导数据。
- 主机上的TFTP服务器或定制引导工具收到该帧后,开始通过UDP向DSP发送包含程序镜像数据包。
- RBL接收并校验数据包,将其写入指定的内存地址。
- 镜像传输完成后,RBL跳转到镜像入口地址执行。
排查技巧:如果以太网引导失败,第一步应该用网络抓包工具(如Wireshark)查看是否收到了“Ethernet Ready”帧。如果没收到,问题可能出在物理链路(SGMII配置错误)、网络配置(MAC/IP未配?)或过滤条件(端口、MAC不匹配)。如果收到了但主机没发数据,检查主机端引导工具配置。如果数据包已发送但DSP没反应,可能是校验和错误或内存地址冲突。
3.2 NAND引导参数表与高级配置
NAND参数表在公共字段后,主要定义了如何获取更详细的NAND器件信息。
关键字段:
- I2C参数使能(Options字段Bit 0): 与设备配置字段的Bit 4呼应。如果此处为1,则RBL会使用下面几个I2C相关字段的信息。
- I2C时钟频率、目标地址、数据地址等(偏移14-22): 当启用I2C参数读取时,这些字段指明了从哪个I2C器件(
I2cTargetAddr,通常是EEPROM)、以多快的速度(I2cClkFreqKhz)、读取哪个地址(I2cDataAddr)的数据,来获取完整的NAND配置表(包含页大小、块大小、ECC、时序参数等)。 - 片选号(csNum)和起始块(firstBlock): 如果未启用I2C参数,则直接使用这两个字段访问NAND。
为什么需要I2C EEPROM存储NAND参数?因为NAND Flash的型号千差万别,时序参数(如tR, tWHR, tADL等)、页大小(512B, 2KB, 4KB, 8KB等)、块大小、ECC要求都不同。RBL的ROM代码不可能内建所有型号的支持。通过将特定Flash的详细参数表存储在独立的EEPROM中,RBL就能以“通用驱动+外部参数”的方式支持几乎任何型号的NAND Flash,极大地提高了硬件设计的灵活性。
3.3 PCIe引导参数表与地址空间映射
PCIe引导参数表的核心任务是配置PCIe端点控制器的复杂属性,并定义地址转换窗口。
关键字段解析:
- 地址宽度(Address Width): 32位或64位。决定了BAR是32位还是64位地址映射。
- Serdes频率与参考时钟: 用于精确配置PCIe物理层的SerDes模块,确保与主机端速率匹配(如Gen1, Gen2)。
- 窗口大小(Window 1-5 Size): 这些字段与设备配置字段中的
BAR Config紧密相关,共同定义了每个BAR所映射的DSP内部内存窗口的大小(单位MB)。例如,BAR Config选择了某种映射方案,这里的Window x Size就给出了每个窗口的具体大小。 - Vendor ID/Device ID/Class Code: 这些是PCIe配置空间的标准字段,用于主机操作系统或BIOS识别设备。在引导阶段,主机可能依赖这些ID来定位正确的设备并加载驱动。
- Serdes配置字: 提供对SerDes通道(Lane)电气特性的低级寄存器配置,用于应对特殊的信号完整性需求。
PCIe引导交互过程:
- 主机上电,进行PCIe总线枚举。
- 主机发现DSP设备,读取其配置空间(包括由RBL根据参数表设置的Vendor/Device ID, BAR等)。
- 主机操作系统或引导ROM为DSP的BAR分配物理内存地址。
- DSP的RBL通过PCIe配置空间得知主机为它的BAR分配了哪些物理地址。
- RBL将自己内存中用于接收镜像的区域(例如L2 SRAM的某段)与某个BAR窗口关联起来。
- 主机驱动程序开始向分配给该BAR的物理地址写入数据,这些数据通过PCIe链路自动传输到DSP的指定内存中。
- 镜像传输完成后,RBL跳转执行。
3.4 I2C/SPI/UART引导参数表精讲
这三种串行引导模式的参数表结构类似,主要围绕通信协议的细节进行配置。
I2C模式参数表:
- 模式(Options字段Bit 1-0): 这是I2C引导的精髓所在。
00: 从I2C EEPROM加载一个引导参数表。这是标准流程,先读一个小参数表,再根据它读镜像。01: 直接从I2C EEPROM加载引导记录(即程序镜像本身)。适用于镜像很小的场景。10: 从I2C加载引导配置记录。这是一种链式引导,允许一个配置表指向下一个存储设备。11: 执行从模式引导,监听Local Address指定的地址,等待主机发送数据。
- 设备地址与频率: 精确指定I2C总线的通信速率(
Bus Frequency)和目标从设备地址(Boot Dev Addr)。确保Device Freq(CPU频率)设置正确,这是计算I2C时钟分频比的基准。
SPI模式参数表:
- 模式(Options字段Bit 1-0): 与I2C类似,
00代表加载参数表,01代表直接加载镜像。 - 地址宽度、引脚模式、片选、时钟模式: 这些字段与设备配置字段中的定义必须一致,且符合SPI Flash芯片的规格。
- 总线频率(Bus Freq): 以
MHz.kHz格式指定SPI SCK的频率。例如,要设置5.125 MHz,则MHz部分填5,kHz部分填125。过高的频率可能导致在长走线或负载较重时通信失败,初期调试建议从较低频率(如1MHz)开始。
UART模式参数表:
- 数据格式与协议: 目前仅支持8位数据位、无流控、XMODEM协议。
Data Format固定为1,Protocol固定为0。 - 超时与重试:
Initial Ping Cnt,Max Err Count,Nack timeout,Char timeout这些参数对于不稳定的串行链路环境非常重要。如果线路噪声大,可以适当增加超时和重试次数。 - 波特率(Data Rate): 一个32位的值,需要根据输入时钟频率精确计算分频比。确保
timerRefMhz(PLL配置后的计时器参考频率)设置正确,否则实际波特率会偏差。 - 过采样(Oversample): 只能为13或16。更高的过采样率(16)可以提高抗噪能力,但对时钟精度要求更高。
4. 引导流程深度剖析与实战配置示例
理解了各个字段的含义,我们将其串联起来,还原一个完整的引导流程,并给出一个具体的NAND引导配置示例。
4.1 完整引导流程时序解析
- 复位与初始化: 芯片上电或复位,硬件逻辑锁定BOOTMODE引脚电平以及设备配置字段(可能来自特定引脚或内部熔丝)。
- PLL初步配置: RBL根据BOOTMODE[12:10]的3个比特,查询内置表格(表6-90),对主PLL进行一个最基础的配置,使内核时钟达到一个可工作的频率(例如850MHz)。注意,这个配置可能不是最终的,后续引导参数表中的PLL配置会覆盖它。
- 外设初始化与参数读取: RBL根据BOOTMODE选择的外设类型(如NAND),利用设备配置字段(如起始块、I2C使能位)对该外设进行最简初始化,然后从指定的起始位置(如NAND的Block 0)读取第一个512字节的数据。这512字节的前面部分就是引导参数表的公共字段。
- 参数表验证与PLL重配: RBL计算这512字节的校验和,与参数表中的
Checksum字段比对。校验通过后,解析Boot Mode确认与当前模式一致。然后,根据参数表中的PLL config字段,重新配置系统PLL到目标频率。 - 外设深度初始化: 根据参数表中该模式特有的字段(如NAND的I2C参数、以太网的MAC地址),对外设进行完整的、个性化的初始化。
- 镜像加载: 从外设中读取真正的程序镜像数据。镜像格式通常是TI定义的“AIS”或“App Image”格式,其中包含了多个数据段(Section)的加载地址、运行地址、入口点等信息。RBL将这些段搬运到参数表或镜像头指定的内存地址(通常是L2 SRAM或DDR3)。
- 跳转执行: 所有段加载完毕并校验通过后,RBL跳转到镜像的入口点(Entry Point),将CPU控制权交给用户的应用程序。
4.2 NAND引导实战配置示例
假设我们硬件使用了一颗美光MT29F4G08ABADAWP NAND Flash(4Gb, 4KB页,256KB块,8位总线),并通过I2C EEPROM(地址0x50)存储其参数表。
步骤1:确定硬件连接与BOOTMODE引脚设置
- NAND数据/地址/控制线连接到DSP的EMIF接口。
- I2C EEPROM连接到DSP的I2C0总线。
- 设置BOOTMODE引脚为NAND引导模式(具体值需查手册引脚定义表)。
- 设置设备配置字段(可能通过上拉/下拉电阻实现):
- Bit 9-5 (1st Block):
00000b(从Block 0开始读) - Bit 4 (I2C):
1b(从I2C读取NAND参数) - Bit 3: Reserved,设为0。
- Bit 9-5 (1st Block):
步骤2:准备I2C EEPROM中的NAND参数表这个参数表需要包含MT29F4G08ABADAWP的所有时序和结构信息。通常,我们可以从TI的NAND驱动库或Flash工具中生成这个二进制块。它会被烧录到EEPROM的起始地址(例如0x0000)。
步骤3:准备NAND Flash中的引导参数表我们需要编写一个二进制文件作为引导参数表,其结构如下(数值为示例,需按实际计算):
// 公共字段 Length: 0x0040 (64字节,假设我们的参数表总长64字节) Checksum: 0xXXXX (计算前面所有字节的16位和取反) Boot Mode: 0x0050 (NAND模式) Port Num: 0x0000 (NAND不适用,填0) PLL Config MSW: 0xXXXX (根据你的目标核心频率计算,例如配置PLL输出850MHz) PLL Config LSW: 0xXXXX // NAND特有字段 Options: 0x0001 (Bit0=1,启用I2C参数读取) I2cClkFreqKhz: 400 (I2C时钟频率400 kHz) I2cTargetAddr: 0x0050 (EEPROM的I2C地址) I2cLocalAddr: 0x00XX (DSP自身的I2C地址,被动模式用,主模式可忽略) I2cDataAddr: 0x0000 (参数表在EEPROM中的起始地址) I2cWtoRDelay: 5 (写地址到读数据的延迟周期) csNum: 0 (使用EMIF的CS0片选) firstBlock: 0 (从Block 0读取程序镜像)使用TI的hex6x工具或脚本将这个结构体转换成二进制*.bin文件。
步骤4:准备应用程序镜像使用TI编译器(如TI C6000 Compiler)和链接器生成可执行文件(.out),然后使用ofd6x和hex6x工具,或者直接使用tiimage工具,将其转换为RBL可识别的AIS格式或App Image格式的二进制文件。在转换时,需要指定加载地址(如0x0C000000,对应L2 SRAM)。
步骤5:烧录
- 使用编程器将步骤2生成的NAND参数表二进制烧录到I2C EEPROM的0x0000地址。
- 使用NAND编程器(或通过JTAG初始化的DSP程序),将步骤3生成的引导参数表烧写到NAND Flash的Block 0, Page 0。
- 将步骤4生成的应用程序镜像二进制文件,烧写到NAND Flash的Block 0, Page 1及之后的页面(确保避开参数表所占空间)。
步骤6:上电测试断开仿真器,给板卡上电。用示波器测量DSP的时钟输出引脚,或用串口输出调试信息,验证程序是否成功运行。
5. 常见问题排查与调试心得
引导失败是嵌入式开发中最令人头疼的问题之一,因为此时系统尚未完全启动,调试手段有限。以下是我总结的排查思路和技巧。
5.1 通用排查流程
- 确认电源、时钟、复位: 最基础也最易忽略。用示波器测量核心电压、DDR电压、时钟输入引脚、复位引脚波形是否干净、稳定、时序正确。
- 确认BOOTMODE引脚: 在上电瞬间,用示波器或逻辑分析仪捕获BOOTMODE引脚的电压电平,确保与你的设计意图一致,且无毛刺。特别注意上拉/下拉电阻的阻值,要确保在电源爬升期就能将引脚稳定到目标电平。
- 检查存储设备内容: 使用编程器或通过JTAG,回读你烧录到Flash/EEPROM中的数据,与原始二进制文件逐字节比对,确保烧录过程无误,没有位翻转。
- 计算并核对校验和: 对于引导参数表,手动计算其校验和,与表中
Checksum字段比对。很多工具在生成二进制时不会自动计算校验和,需要你后期手动填入或使用脚本处理。 - 利用指示灯和测试点: 在硬件设计时,为关键电源、时钟、复位信号以及DSP的GPIO(可配置为引导状态指示)预留测试点或LED。编写一个最简单的、能在RAM中运行的LED闪烁程序,通过仿真器加载,测试基本硬件是否正常。
5.2 模式特定问题
NAND引导失败:
- 症状: 程序毫无反应,或卡住。
- 排查:
- 首先确认是否使用了I2C参数模式。如果不使用,确保设备配置字段的
I2C位为0,并且参数表中的OptionsI2C位也为0。 - 如果使用I2C参数模式,用I2C协议分析仪监控DSP上电后是否发出了对EEPROM的读命令?地址是否正确?EEPROM是否有应答?如果没有,检查I2C总线布线、上拉电阻、EEPROM供电。
- 如果I2C读取成功但依然失败,很可能是NAND参数表内容不正确。对照Flash数据手册,检查时序参数、页大小、块大小、ECC设置等。一个常见错误是页大小(Page Size)设置不对,导致RBL读取地址计算错误。
- 测量NAND的读使能(RE)、写使能(WE)、命令锁存(CLE)、地址锁存(ALE)等控制信号在上电初期的波形,看是否有正常的读命令序列发出。
- 首先确认是否使用了I2C参数模式。如果不使用,确保设备配置字段的
以太网引导失败:
- 症状: 网络链路不亮,或抓不到“Ethernet Ready”帧。
- 排查:
- 检查SGMII参考时钟是否有、频率是否正确、波形是否干净。
- 检查设备配置字段中的
SerDes Clock Mult和Ext connection是否与对端设备匹配。 - 检查参数表中的MAC地址是否合法,避免使用广播地址(FF:FF:FF:FF:FF:FF)作为单播MAC。
- 如果使用自协商,对端设备(交换机、PHY)是否支持并启用了自协商?
- 检查参数表中的
Sgmii Config字段,Bypass位是否被误设为1,导致RBL跳过了SGMII配置。
SPI/I2C引导失败:
- 症状: 类似NAND,无反应。
- 排查:
- 时钟极性相位: 这是SPI最易出错的地方。用逻辑分析仪抓取SPI的SCK、MOSI、CS信号,第一个数据位是在SCK的哪个边沿输出的?与Flash数据手册要求是否一致?与参数表中
Mode字段设置是否一致? - 片选信号: 确认
Chipsel字段配置的片选号,与硬件上Flash连接的片选线是否对应。 - 地址宽度: 对于大容量SPI Flash(>16Mb),必须使用24位地址(
Addr Width设为1),并确保参数表中的Read Addr字段是24位地址。
- 时钟极性相位: 这是SPI最易出错的地方。用逻辑分析仪抓取SPI的SCK、MOSI、CS信号,第一个数据位是在SCK的哪个边沿输出的?与Flash数据手册要求是否一致?与参数表中
5.3 高级调试手段
当以上基础排查无效时,就需要更深入的手段:
- ROM Bootloader 日志: 一些TI的高端DSP,其RBL在遇到严重错误时,会将错误代码写入某个特定的内存位置(例如L2 SRAM的起始地址)或通过某个外设(如UART)输出。查阅芯片的勘误表(Errata)和RBL用户指南,看是否有此类功能。上电后立刻通过JTAG读取该内存区域,可能会发现错误码。
- 仿真器辅助调试: 虽然目标是脱机引导,但在开发阶段,仿真器是无价之宝。
- 在CCS中编写一个小的“引导加载器”程序,通过JTAG加载到RAM中运行。这个加载器的功能是模拟RBL的行为:初始化外设、从Flash读取你的应用程序镜像到RAM、然后跳转执行。如果这个自制加载器能成功,说明你的应用程序镜像和硬件访问逻辑是正确的,问题可能出在RBL的配置上。
- 在RBL刚执行完,但还未跳转到你的应用程序之前设置断点。这需要对RBL的代码入口点和你的应用程序入口点有精确了解。通过单步跟踪RBL的早期汇编代码(如果可见),观察寄存器状态和内存变化,可以判断它死在了哪一步。
- 信号完整性分析: 对于高速接口(如DDR3、PCIe、SGMII),引导失败可能是信号完整性问题导致的。使用高速示波器进行眼图测试,检查过冲、下冲、振铃是否在规范内。检查电源完整性,确保在芯片启动瞬间,核心电源没有大的跌落。
引导配置是一项细致且需要反复验证的工作。最好的习惯是:每次修改硬件或关键配置后,都从最基本的、最简单的引导方式(如从SPI Flash加载一个LED闪烁程序)开始测试,逐步增加复杂性。保存好每一版可工作的配置参数表和镜像,作为回归测试的基准。