深入解析TMS320VC5501/5502 DSP七大启动模式与Bootloader实战
1. 项目概述在嵌入式DSP系统开发中如何让芯片在“上电”或“复位”后自动加载并运行我们编写的应用程序是每个工程师都会遇到的第一个关键问题。这背后依赖的就是Bootloader引导加载程序。它就像是DSP的“开机自检”和“程序搬运工”负责在CPU核心开始工作前完成必要的硬件初始化并将存储在外部低速、非易失性存储器如Flash、EEPROM中的程序代码搬运到高速的内部RAM中执行。对于德州仪器TI的TMS320VC5501和TMS320VC5502这两款经典的定点数字信号处理器来说其片上ROM中固化的Bootloader功能相当强大且灵活支持多达7种启动模式几乎涵盖了所有常见的系统启动场景。我接触过不少基于C550x系列DSP的项目从早期的音频处理设备到后来的便携式医疗仪器Bootloader的配置往往是硬件调试和软件联调的第一步也是最容易“卡壳”的地方。选错了启动模式、GPIO引脚配置不当或者Boot Table生成有误都会导致DSP“静默”不启动让新手工程师一筹莫展。这篇文章我将结合官方文档SPRA911C以及我个人的实践经验为你彻底拆解TMS320VC5501/C5502的片上Bootloader。我会详细解释每种启动模式的工作原理、硬件连接要点、GPIO配置的“坑”并手把手带你走一遍Boot Table的生成流程。无论你是正在评估C5501/5502的硬件选型还是已经进入调试阶段遇到了启动问题相信这篇近万字的深度解析都能给你提供清晰的指引和实用的解决方案。2. Bootloader核心工作机制与初始化流程2.1 Bootloader的“藏身之处”与上电序曲当C5501或C5502的复位引脚RESET从低电平跳变到高电平即释放复位的瞬间芯片内部一场精密的“启动交响乐”便开始了。CPU的初始程序计数器PC会被硬件强制指向一个特殊的地址0xFF8000。这个地址正是片上ROM的起始位置Bootloader就固化在这里。在Bootloader开始执行搬运代码的“正事”之前它必须为DSP建立一个最基本的运行环境。这个过程我们称之为初始化。根据文档Bootloader会进行以下几项关键操作堆栈指针设置数据堆栈指针SP被初始化为字地址0x000090系统堆栈指针SSP被初始化为字地址0x000080。这意味着你的应用程序代码和数据其起始地址最好安排在字地址0x0090字节地址0x0120之后以避免与Bootloader使用的栈空间冲突。中断管理状态寄存器1ST1_55中的中断屏蔽位INTM被设置为1。这意味着在Bootloader执行期间以及它跳转到你的应用程序的瞬间所有可屏蔽中断都是被禁止的。你的应用程序在开始运行时如果需要响应中断必须记得在合适的时机手动清除INTM位。工作模式配置符号扩展模式SXMD被暂时禁用清零但在所有代码段搬运完成后、跳转前又会被重新置1。同时54x兼容模式54CM被使能置1。这些设置保证了Bootloader自身代码和后续搬运过程的正确性。实操心得很多工程师在调试时发现程序跑飞问题可能出在应用程序一开始就开启了中断但中断向量表或服务程序还未正确初始化。安全的做法是在应用程序的入口点C语言的main()函数或汇编的起始标签处先保持中断关闭完成所有外设和全局变量的初始化后再打开中断总开关。2.2 启动模式的选择GPIO引脚的状态就是“指令”Bootloader支持多种启动方式具体采用哪一种完全由三个特定的GPIO引脚在复位释放时的电平状态决定。这三个引脚是BOOTM[2:0]它们分别与GPIO2、GPIO1、GPIO0复用。BOOTM2 (GPIO2)BOOTM1 (GPIO1)BOOTM0 (GPIO0)启动模式关键特性000无引导从16位外部异步存储器执行微处理器模式直接从CE3空间0xFFFF00执行001从McBSP0进行SPI EEPROM引导支持24位地址的SPI Flash010从McBSP0进行标准串行引导16位数据宽度需外部提供时钟和帧同步011从外部异步存储器进行并行EMIF引导从CE1空间字地址0x200000读取Boot Table100无引导从32位外部异步存储器执行微处理器模式32位总线101HPI引导主机通过HPI接口加载代码110从I2C EEPROM或I2C从设备引导支持多个I2C EEPROM自动递增从机地址111UART引导通过UART接口接收Boot Table这里有一个至关重要的时序细节BOOTM[2:0]引脚并不是在RESET引脚变高的瞬间就被采样的。芯片内部有一个稳定化周期Stabilization Period。这个周期的长度取决于GPIO4引脚在复位期间的状态如果GPIO4为低使用内部振荡器外部晶体稳定化周期长达41,102个输入时钟周期。如果GPIO4为高使用外部时钟源CLKIN稳定化周期仅为70个时钟周期。只有在稳定化周期结束后Bootloader才会去采样BOOTM[2:0]的状态。因此在硬件设计时必须确保在复位信号稳定后的整个稳定化周期内BOOTM[2:0]和GPIO4的电平都保持稳定。通常的做法是通过上拉或下拉电阻将其固定在所需的电平。2.3 关键引脚GPIO4、GPIO6、GPIO7的多重角色除了BOOTM[2:0]另外几个GPIO引脚在启动阶段扮演着“导演”和“通讯员”的角色配置错误会导致整个启动流程失败。GPIO4这是一个“身兼数职”的引脚。时钟源选择复位期间的电平决定时钟源。低电平选择内部振荡器需接外部晶体高电平选择外部直接输入的CLKIN时钟。状态指示/握手信号在多种启动模式中Bootloader会将其配置为输出用于指示自身状态。例如在标准串行模式中GPIO4输出低电平时表示DSP已准备好接收下一个数据字输出高电平则表示正在处理数据或处于延时中主机应等待。片选信号在SPI EEPROM引导模式中GPIO4直接作为SPI存储器的片选CS信号。GPIO6此引脚决定了C5502上EMIF和HPI引脚的功能复用以及对C5501上EMIF/HPI的使能。对于C5502复位时GPIO61共享引脚用作EMIF功能HPI使用独立的HD总线复用模式。GPIO60共享引脚用作HPI功能16位非复用模式EMIF被禁用。对于C5501复位时GPIO61使能EMIF和HPI。GPIO60则禁用EMIF和HPI相关引脚变为通用并行I/O。关键影响任何需要使用外部存储器包括“无引导”模式和EMIF引导模式的启动方式都必须将GPIO6上拉到高电平否则EMIF无法工作。GPIO7此引脚仅对C5502有效用于决定UART和McBSP2的引脚复用。复位时GPIO70共享引脚分配给UARTMcBSP2被禁用。复位时GPIO71共享引脚分配给McBSP2UART被禁用。因此如果你计划使用UART引导模式在C5502上必须将GPIO7拉低。3. 七大启动模式深度解析与实战配置3.1 模式一无引导No-Boot—— 微处理器模式当BOOTM[2:0]000b或100b时Bootloader自身不会运行。芯片的MPNMC位被置1片上ROM被移出内存映射空间。CPU复位后直接从外部CE3空间的字节地址0xFFFF00对应字地址0x7FFF80开始取指执行。应用场景你的程序已经烧录在外部异步存储器如NOR Flash中且该存储器被映射到CE3空间。DSP就像一个简单的微处理器直接从Flash运行代码。这种方式常用于程序非常简单或对启动速度要求不高的场合。硬件配置要点C5501GPIO6必须为高使能EMIFGPIO7必须为低。C5502GPIO6必须为高共享引脚用作EMIF功能GPIO7状态根据应用需求决定若后续使用UART则拉低使用McBSP2则拉高。根据BOOTM[2:0]选择16位000b或32位100b数据总线宽度并据此设计外部存储器的硬件连接。注意事项你需要确保外部存储器的访问时序满足DSP在复位后的默认EMIF配置。由于Bootloader未运行无法通过Boot Table配置EMIF时序因此外部存储器的速度必须足够快能在默认的保守时序下工作。3.2 模式二HPI引导模式当BOOTM[2:0]101b时DSP进入HPI引导模式。在此模式下Bootloader不会主动加载任何代码而是初始化后进入一个等待循环。它不断地轮询内部DARAM中两个特定的字地址0x0060和0x0061等待外部主机如ARM、FPGA或另一片DSP通过HPI接口将应用程序代码和数据写入DSP的内部存储器。工作原理DSP释放复位后Bootloader初始化HPI并将GPIO4拉低作为“准备就绪”信号通知主机。主机通过HPI将应用程序的各个段section写入DSP内部DARAM的任意位置建议从字地址0x0090开始避开Bootloader使用的栈区。代码搬运完成后主机需要向DSP写入一个“启动指令”。这个指令由两个16位字组成先向字地址0x0061写入期望的入口点地址的低16位。再向字地址0x0060写入一个结构特殊的字其高8位bit15-bit8是一个非零的等待标志低8位bit7-bit0是入口点地址的高8位。Bootloader一旦检测到0x0060地址的高8位为非零便会将0x0061和0x0060中的24位值组合成一个完整的字节地址然后跳转到该地址开始执行。硬件配置要点C5501仅支持8位复用HPI模式GPIO6必须为高。C5502支持8位复用和16位非复用模式由GPIO6在复位时的电平决定高复用低非复用。HPI的时钟属于快速外设时钟组复位后频率为CPU时钟的1/4主机需据此协调通信速度。实操心得HPI模式非常适合多处理器系统尤其是主机处理器需要动态加载或更新DSP固件的场景。调试时可以先用仿真器将一个小段测试代码比如点亮一个LED写入DARAM然后手动通过仿真器的内存写入功能修改0x0060和0x0061观察DSP是否能正确跳转这是验证HPI硬件连接和Bootloader状态的有效方法。3.3 模式三并行EMIF引导模式当BOOTM[2:0]011b时Bootloader会通过外部存储器接口EMIF的CE1空间从外部16位异步存储器通常是NOR Flash或FPGA模拟的存储器中读取一个结构化的Boot Table并按照其中的指示将代码/数据段搬运到指定地址最后跳转执行。关键地址Bootloader固定从CE1空间的字地址0x200000字节地址0x400000开始读取Boot Table。因此你的Boot Table二进制文件必须烧录到连接在CE1片选上的存储器这个起始地址。默认时序Bootloader会以最保守的时序访问CE1空间READ SETUP15, STROBE63, HOLD7 cycles。如果你的存储器速度较快可以通过Boot Table中的“寄存器配置”功能来优化EMIF的CE1控制寄存器CE1_1以加速启动过程。GPIO4行为在此模式下GPIO4作为流程指示器。启动开始时拉低在Boot Table中配置的延时期间会拉高延时结束后恢复低电平整个引导过程完成后再次拉高并跳转。硬件配置要点GPIO6必须为高使能EMIF。确保ARDY信号线被正确处理。如果目标系统不驱动ARDY必须将其上拉到高电平否则DSP会一直等待“就绪”信号而导致启动挂起。注意事项这是最常用、最可靠的引导方式之一。在通过Boot Table修改EMIF时序时必须非常小心。绝对不能改变CE1空间的MTYPE存储器类型设置且修改时序寄存器的指令后必须跟随足够的延时文档建议至少10个EMIF时钟周期等待配置生效否则后续的Boot Table读取会失败。3.4 模式四标准串行引导模式McBSP当BOOTM[2:0]010b时Bootloader将McBSP0配置为16位标准串行模式等待外部主机如MCU、CPLD或另一片DSP的McBSP通过串行方式发送Boot Table数据。McBSP0配置Bootloader会固定将McBSP0设置为单相帧、每帧1个字、字长16位、数据右对齐、第一个数据位延迟1位RDATDLY01b。接收时钟CLKR0和接收帧同步FSR0必须由外部主机提供。时钟关系McBSP0属于慢速外设时钟组复位后其工作时钟为CPU时钟CLKIN的1/4。外部主机提供的CLKR0频率不能超过此值。流量控制与GPIO4这是该模式的核心难点。Bootloader通过GPIO4引脚实现硬件流控。GPIO4为低表示McBSP0接收器就绪可以接收下一个16位数据字。GPIO4为高表示接收器“忙”可能正在处理数据、搬运数据到内存尤其是外部内存或正在执行Boot Table中配置的延时。主机必须在检测到GPIO4为低时才能发送下一个字。如果主机发送过快导致McBSP0接收溢出overrun整个引导过程将失败。硬件设计建议为了可靠通信强烈建议主机端使用一个GPIO连接DSP的GPIO4并实现“查询-发送”机制。如果无法使用GPIO4握手则主机必须在每个数据字发送后插入足够长的延时文档指出当目标地址是内部RAM时至少需要等待140个CPU时钟周期以确保DSP有足够时间处理。3.5 模式五SPI EEPROM引导模式当BOOTM[2:0]001b时Bootloader将McBSP0配置为SPI主机模式从连接在McBSP0上的SPI接口EEPROM或Flash中读取Boot Table。硬件连接这是最简单的连接方式之一。McBSP0的CLKX0接EEPROM的SCK。McBSP0的DX0接EEPROM的SI数据输入。McBSP0的DR0接EEPROM的SO数据输出。GPIO4接EEPROM的CS片选由Bootloader自动控制。EEPROM的WP写保护和HOLD引脚如果存在需要上拉到高电平无效状态。通信协议Bootloader会先发送SPI读取指令0x03接着发送24位的起始地址0x000000然后开始连续读取数据。它依赖SPI存储器的内部地址自动递增功能来读取整个Boot Table。时钟速度SPI时钟由DSP产生频率为慢速外设时钟 / 4即CLKIN / 16。例如如果CLKIN20MHz则SPI时钟为1.25MHz。选择SPI存储器时其最高时钟频率必须高于此值。版本注意初始版本的Bootloader通过读取ROM地址0xFFECAE的内容为0xF106来识别不支持此模式。只有版本A0xF107及以后才支持。请务必确认你的芯片Bootloader版本。3.6 模式六I2C EEPROM引导模式当BOOTM[2:0]110bBootloader将I2C模块配置为主机接收模式从I2C总线的EEPROM中读取Boot Table。硬件要求EEPROM需符合I2C V2.1规范使用2字节内部寻址并支持地址自动递增。SDA和SCL线必须连接上拉电阻。支持最多8个从设从机地址从0x50开始每64KB地址空间递增一次。例如第一个EEPROMA2A1A0000对应地址0x500000-0x50FFFF第二个A2A1A0001对应0x510000-0x51FFFF以此类推。通信过程Bootloader首先对当前从机地址执行一个“随机读”操作先发送写命令地址0再发送读命令读取第一个字节。之后在同一64KB块内使用“当前地址读”命令连续读取后续字节。当到达64KB边界时从机地址会自动加1转向下一个EEPROM。I2C时钟Bootloader会设置I2C时钟分频寄存器使SCL频率 CLKIN / 104。设计时必须选择CLKIN频率使得最终的SCL频率不超过I2C模块支持的400kHz上限。GPIO4行为仅版本A在版本A的Bootloader中GPIO4会在读取每个数据字节期间被拉低在其他时间被拉高可作为状态指示。3.7 模式七UART引导模式当BOOTM[2:0]111b时Bootloader将UART配置为特定参数等待主机通过串口发送Boot Table。固定参数8位数据位无校验位1位停止位。波特率固定为 CLKIN / 256。例如CLKIN11.0592MHz时波特率为43200bpsCLKIN12MHz时波特率为46875bps。主机UART必须匹配此波特率误差需在可接受范围内。硬件连接与使能C5501的UART引脚独立无需特殊配置。C5502的UART与McBSP2引脚复用必须将GPIO7拉低才能使能UART功能。回显功能Bootloader会将接收到的每一个字节原样发送回去回显。主机可以利用这个特性进行简单的通信测试和流控虽然不如GPIO4直接。主机应等待回显后再发送下一个字节以避免UART的16字节FIFO溢出。GPIO4指示GPIO4在Bootloader准备好接收数据时被拉低并在整个引导过程中保持低电平引导完成后恢复为输入状态。4. Boot Table的奥秘结构、生成与高级功能Boot Table是连接你的应用程序.out文件和Bootloader的桥梁。它是一个具有特定格式的数据块不仅包含了要加载的代码和数据还包含了启动入口点、外设寄存器配置指令和延时指令。4.1 Boot Table的详细结构一个完整的Boot Table在内存中的布局如下所示它由一系列连续的字段组成字节地址 0: 入口点地址 (32位高字节在前) 字节地址 4: 寄存器配置/延时计数 (32位) [如果计数0则重复以下4项“计数”次] 字节地址 N: 寄存器地址 (16位) 或 延时标识 (0xFFFF) 字节地址 N2: 寄存器值 (16位) 或 延时周期数 (16位) [以下为段数据可重复多个段] 字节地址 M: 段字节长度 (32位) 字节地址 M4: 段目标起始地址 (32位24位有效) 字节地址 M8: 段数据内容 (长度由“段字节长度”指定) ... [结束标志] 字节地址 Z: 全零的段长度 (32位的0x00000000)入口点地址引导完成后DSP第一条指令的字节地址。寄存器配置/延时这是Bootloader提供的一个强大功能。你可以在引导过程中在搬运应用程序代码之前预先配置某些外设寄存器。例如你可以提高PLL倍频以加速后续的搬运过程或者重新配置EMIF时序以匹配高速Flash。0xFFFF是一个特殊地址表示后面跟的是一个延时周期数1-65535用于等待寄存器配置生效如PLL锁定。段数据每个段由长度、目标地址和原始数据组成。Bootloader会忠实地将数据块搬运到指定的目标地址。对于程序段可能不是字对齐的Bootloader会在Boot Table中自动插入填充字节以保证数据块字对齐但在搬运到目标地址时会剔除这些填充恢复原始的字节对齐。结束标志一个长度为0的段告诉Bootloader“后面没有数据了可以跳转了”。4.2 使用HEX55工具生成Boot TableTI的汇编语言工具链中提供了hex55.exe工具或CCS中的Hex Conversion Utility用于将链接器生成的COFF格式的.out文件转换为各种格式的十六进制文件其中就包括生成Boot Table。生成Boot Table的命令行核心选项如下hex55.exe -boot -v5510:2 -parallel16 -e _c_int00 -o my_app.hex my_app.out-boot关键选项告诉工具生成Boot Table格式。-v5510:2至关重要指定使用C55x系列兼容C5510的Boot Table格式2.0。使用错误格式会导致引导失败。-parallel16指定目标引导模式。必须与硬件上BOOTM[2:0]的设置严格对应。-parallel16: EMIF 16位并行引导 (BOOTM011b)-serial16: McBSP标准16位串行引导 (BOOTM010b)-serial8: SPI EEPROM / I2C EEPROM / UART 引导 (BOOTM001b, 110b, 111b)-e _c_int00指定入口点。对于用C语言编写、使用了C运行时库的程序入口点通常是_c_int00。对于纯汇编程序则是你的起始标签。-o my_app.hex指定输出文件名。my_app.out输入的链接后文件。高级功能示例假设我们需要在引导时先将PLL配置为更高的频率配置CLKMD寄存器端口地址0x1C00然后等待1000个CPU周期等待锁定最后再加载程序。命令行如下hex55.exe -boot -v5510:2 -parallel16 -reg_config 0x1C00, 0x8001 -delay 1000 -e _c_int00 -o my_app_fast.hex my_app.out-reg_config和-delay选项会按照它们在命令行中出现的顺序被依次加入到Boot Table的寄存器配置/延时区域。4.3 实战创建用于SPI Flash的Boot Table并烧录让我们以一个具体的例子将程序通过SPI Flash引导。编写链接器命令文件.cmd确保你的代码段如.text和数据段如.data被正确分配到内部DARAM中例如从0x00010000开始。编译链接使用编译器cl55和链接器lnk55生成my_app.out。生成Boot Tablehex55.exe -boot -v5510:2 -serial8 -e _c_int00 -o my_app.bin -image my_app.out这里使用了-image选项生成纯二进制binary镜像这种格式通常可以直接被SPI Flash编程器使用。你也可以生成Intel Hex或TI-TXT格式具体取决于你的编程工具。烧录到SPI Flash使用Flash编程器如通过JTAG和Flash编程算法或独立的编程器将生成的my_app.bin文件烧录到SPI Flash的起始地址0x000000。硬件配置将BOOTM[2:0]引脚设置为001bGPIO20 GPIO10 GPIO01。将GPIO4通过下拉电阻接地如果使用内部振荡器晶体或接高如果使用外部有源时钟。确保GPIO6上拉使能EMIF尽管此模式不一定需要但建议使能。按照图4正确连接SPI Flash到McBSP0。上电启动上电后Bootloader会通过McBSP0从SPI Flash的0地址开始读取Boot Table并自动完成代码加载和跳转。避坑指南生成的Boot Table二进制文件大小可能会比你预期的.out文件大。这是因为Boot Table包含了结构信息长度、地址以及可能的填充字节。在计算所需Flash大小时务必以生成的.bin或.hex文件为准。另外确保你的SPI Flash容量足够且其命令集尤其是读指令0x03与Bootloader期望的一致。5. 调试指南与常见问题排查Bootloader不工作是最令人头疼的问题之一。下面提供一个系统化的排查思路和常见问题清单。5.1 通用排查流程确认电源、时钟和复位这是最基本也是最容易忽略的。用示波器测量核心电压、I/O电压是否稳定且在容差范围内检查晶振是否起振CLKIN是否有时钟确认复位引脚的电平变化过程是否符合要求低有效有够的低电平时间然后稳定到高。确认Boot Mode引脚在复位释放后的稳定化周期内用示波器或逻辑分析仪抓取BOOTM[2:0]和GPIO4、GPIO6、GPIO7的电平确保它们稳定在预期的逻辑电平。上拉/下拉电阻的阻值选择要合适通常10kΩ是个安全值确保能抵抗板子上的噪声干扰。观察GPIO4行为GPIO4是Bootloader的“状态灯”。在不同的引导模式下它有特定的行为模式如拉低、闪烁、保持高平等。参考前面各模式的描述观察GPIO4的实际行为是否与预期相符是定位问题阶段的重要线索。使用仿真器JTAG如果条件允许连接XDS仿真器使用Code Composer Studio (CCS)进行调试。首先尝试在“无引导”模式下在外部存储器的0xFFFF00处设置断点看CPU能否跑到这里。这可以验证最基础的CPU、时钟、复位和外部存储器接口是否正常。在引导模式下可以在Bootloader的ROM入口0xFF8000或应用程序的入口点设置断点看程序能否执行到。查看关键内存和寄存器内容例如HPI模式下的0x0060/0x0061或者EMIF的配置寄存器。5.2 分模式常见问题速查表启动模式现象可能原因与排查点所有模式DSP完全无反应仿真器也无法连接1. 电源异常。2. 时钟未起振检查晶体、负载电容、CLKIN信号。3. 复位电路问题复位引脚未正确释放到高电平。4. JTAG接口连接问题。无引导程序无法从外部Flash启动1. BOOTM[2:0]电平错误。2. GPIO6未拉高EMIF未使能。3. 外部Flash未正确映射到CE3空间或硬件连接错误。4. Flash中的程序未烧录在0xFFFF00起始的位置。5. Flash的访问时序太快不满足DSP复位后的默认EMIF时序。HPI引导主机写入数据后DSP不跳转1. GPIO6电平未正确设置C5501必须为高C5502根据HPI模式选择。2. 主机写入入口点地址的顺序错误必须先写低字(0x0061)再写高字标志(0x0060)。3. 写入0x0060的高8位等待标志为0。4. 入口点地址是字节地址但主机通过HPI访问的是字地址概念混淆。5. 主机加载的代码覆盖了Bootloader使用的栈区低于0x0090。EMIF并行引导GPIO4无变化或变化后不跳转1. BOOTM[2:0]非011b。2. GPIO6未拉高。3. Boot Table未烧录在CE1空间的0x200000字地址起始处。4. ARDY信号浮空或为低应上拉。5. Boot Table格式错误未使用-v5510:2选项生成。6. 在Boot Table中错误地修改了CE1空间的MTYPE字段。McBSP标准串行数据传输一段时间后失败1.最常见原因主机发送速率过快导致McBSP0溢出。2. 未使用GPIO4进行流控且主机字间延时不足。3. 外部提供的CLKR0/FSR0信号不满足McBSP0的配置要求。4. McBSP0的时钟慢速外设时钟组被意外更改。SPI EEPROM引导Bootloader不读取SPI Flash1.芯片Bootloader版本为初始版本不支持此模式。2. GPIO4未正确连接到Flash的CS#引脚。3. Flash的WP#或HOLD#引脚未上拉。4. Flash的读指令不是0x0324位地址模式。5. SPI时钟频率超出Flash支持范围。I2C EEPROM引导I2C总线无活动或地址不对1. SDA/SCL线上缺少上拉电阻。2. EEPROM的从机地址设置A2,A1,A0引脚与Bootloader寻址顺序不匹配。3. EEPROM不支持2字节地址寻址或自动递增。4. I2C总线速度CLKIN/104超过400kHz或EEPROM的极限。UART引导无回显数据或回显乱码1.C5502特有GPIO7未拉低UART引脚未使能。2. 主机波特率设置错误未计算CLKIN/256。3. 数据格式不匹配8N1。4. 线路连接错误TX/RX交叉。5. 主机发送过快超过UART FIFO16字节容量。5.3 关于Bootloader版本如文档所述早期流片的TMX版本芯片可能搭载的是“初始版本”的Bootloader而正式生产的TMS版本则是“版本A”。两个版本的主要区别在于对SPI EEPROM引导的支持以及I2C模式下GPIO4的行为。你可以通过JTAG读取ROM地址0xFFECAE的内容来确认版本0xF106为初始版本0xF107为版本A。如果你的硬件设计依赖于SPI引导务必确认芯片版本。