This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C6672:在 SPI 引导期间、RBL 卡在无限循环中

Guru**** 2425290 points
Other Parts Discussed in Thread: TMS320C6672

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1538313/tms320c6672-rbl-stuck-in-infinite-loop-during-spi-boot

部件号:TMS320C6672


工具/软件:Code Composer Studio 12.7.1

我有一个 具有 TMS320C6672 处理器的定制板、该处理器通过 SPI 连接到 NOR 闪存器件。

我开发了一个 IBL、使用 pdk/packages/ti/boot/ibl/ibl/util src 实用程序创建了一个引导映像、对 NOR 闪存器件进行了编程、并执行一个字节比较以确保数据驻留在闪存中。  

当我启动电路板时、RBL 将无限期执行。

当我将调试器连接到没有符号的目标时、可以看到 RBL 在地址 0x20b004e4 和 0x20b0ccd6 之间执行。  

DEVSTAT 寄存器的读数为:0x02620020 = 0x0001860D
LENDIAN = 1.
BOOTMODE[12:0]= 0x306
  引导器件= 6 (SPI)
  参数表索引= 0
  片选= 10b(CS0 有效)
  ADDR 宽度= 1(24 位地址值)
  4、5 引脚= 0(4 引脚模式)
  MODE = 0(数据在 SPICLK 的上升沿上输出。 输入数据在下降沿锁存)   
PCIESSMODE[1:0]= 10b
PCIESSN = 1.
PACLKSEL = 0

引导日志为空:0x00873200 = 00000000 0000000A    00000001

我通过以下方式创建启动映像:
hex6x — 阶 L IBL_SPI.out
bconvert64x -le IBL_SPI.b
b2i2c ibl_spi.b ibl.spi.b
b2ccs ibl.spi.b ibl.spi.CCS
romparse -rom_base 0x00 IBL_SPI_ROM.map.pp
ccs2bin -swap i2crom.ccs ibl_spi.bin

IBL_SPI_ROM.map.pp:

部分

param_index = 0
BOOT_MODE = 50
SW_PLL_PREdiv = 0
SW_PLL_mult = 39
SW_PLL_postdiv = 1
SW_PLL_FLAGS = 0

OPTIONS = 0

core_freq_MHz = 1000

BUS_freq_MHz = 10
BUS_freq_kHz = 0

ADDR_WIDTH = 24
N_PINS = 4
MODE = 0
Csel = 2
c2t_delay = 1

exe_file =“IBL.SPI.ccs"</s>“
}

对于如何进一步调试此问题、我非常感谢您提供的任何意见或建议。  

谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    我会检查一下、然后返回给您。

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    您能否使用验证引导参数表是否正确并在正确的地址正确对齐"romparse"

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为根据我的理解、引导表是正确对齐的。
    在二进制文件/闪存中、前 40 个字节为:
    00 50 00 00 00 32 00 00 27 00 01 00 00 18
    00 04 00 02 00 00 00 01 03 E8 00 0A 00 00 00 00 00
    04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  

    截至 0x400 的其余字节均为 00。

    这应等于:

    0.5 μ V 偏移 Name 数据值
    0 长度中 0x0050
    2. 校验和 0x0000
    4. 启动模式 0x0032
    6. 端口编号 0x0000
    8. SW PLL、MSW 0x0027
    10. SW PLL、LSW 0x0001
    12 选项 0x0000
    14 地址宽度 0x0018
    16 N 引脚 0x0004.
    18 片选 0x0002.
    20 消耗量 0x0000
    22 C2Delay 0x0001
    24 CPU 频率 MHz 0x03E8
    26 总线频率 MHz 0x000A
    28 总线频率 KHz 0x0000
    30 读取地址 MSW 0x0000
    32 读取地址 LSW 0x0400
    34 下一个片选 0x0000
    36 下一次读取地址 MSW 0x0000
    38 下一读取地址 LSW 0x0000

    我已经用不同的配置尝试过几次、分别针对 SW PLL MSW、SW PLL LSW、CPU 频率 MHz、总线频率。 MHz 和总线频率 KHz。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    引导参数表似乎格式正确、但下面的引导表似乎具有在 SPRUGY5C 3.2.2 引导表中未调用的附加数据。

    根据 SPRUGY5C 3.2.2 引导表:
    引导表格式如下:
    •32 位标头记录、指示引导加载程序在完成数据复制后应分支的位置
    •对于每个已初始化的段:
    –32 位段字节计数
    –32 位段地址(复制的目标地址)
    –要复制的数据
    •32 位终止记录 (0x00000000)

    引导表从偏移量 0x400 开始、并以以下数据开始:
    00 80 0B 9F 0C 00 B1 60 00 00 BA A0 0C 00 00 00

    如果我正确理解 SPRUGY5C、第一条 32 位记录指示复制完成后引导加载程序应分支的地址。  
    第一条 32 位记录是 0x00800B9F。  
    但是、地址应为 0x0C00B160、这实际上是第二条 32 位记录。
    第 3 和第 4 条 32 位记录是:
    0x0000BAA0  32 位段字节计数
    0x0C000000  32 位段地址

    我觉得引导表头中有一个额外的 32 位值我无法解释。
    此外、从偏移量 0x480 开始、每 0x80 字节继续、还有一个 32 位值正在更改:
    0x008085EC
    0x00806F03
    0x00805DCE
    0x0080D402
    0x0080EB26

    这些附加值是否应该存在? 如果是、它们意味着什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    我会在内部进行检查、然后返回给您。

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    感谢您提供详细信息。

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    只是为了澄清您是否在没有 IBL 的情况下面临相同的问题?

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Betsy、

    我将什么放入闪存(IBL 或其他应用程序)似乎无关紧要、RBL 保持在其循环中、绝不会分支到应用程序。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    请确认以下内容:

    入口点是什么(位于 0x400 的前 4 个字节)? 它是在 L2SRAM 还是 DDR 中?

    您是否尝试过加载最小应用程序(例如,在 L2 存储器中一直循环的应用程序)? 如果这两者都无法引导、则问题可能出在 SPI 映像格式或 RBL 设置上。

    您能否分享用于此目的的.map 和链接器文件?

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否需要这些附加值? 如果是、它们是什么意思?

    我不这么认为。 但我会与团队核实、并在一天内为您提供最新信息。

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    入口点位于 MSM 中、根据 IBL_SPI.map、应位于 0x0c00b160 处。
    boot.c.obj (.text:_c_int00) 位于 0x0c00b160。

    不过、二进制文件/闪存中偏移量 0x400 处的值为 0x00800B9F。  
    我觉得 0x0080 是长度、0x0B9F 是校验和。
    该值(以及每隔 0x0080 偏移处的值)由 hex6x 实用程序添加并遵循相同的格式。

    我刚刚尝试了一个最小应用程序(在 L2 中一直循环的应用程序) 、结果是相同的。 RBL 将一直循环、而不会分支到应用程序。

    这是链接器文件 C66x。cmd:

    e2e.ti.com/.../4336.C66x.cmd.txt

    这是映射文件 IBL_SPI.map:

    e2e.ti.com/.../IBL_5F00_SPI.map.txt

    一些额外的奇数行为:  
    SPRS708E 表 2-3 指示 RBL 使用的引导参数表位于 0x00873680 处。 在启动时、默认值看起来是合适的。
    RBL 运行到无限循环后、似乎会将来自闪存的偏移量 0x400 和 0x480 之间的数据复制到位于 0x00873680 的引导参数表中、然后再次将这些数据复制到 0x00873700:

    0x00873680    0080	0B9F	0C00	B160	0000	BAA0	0C00	0000
    0x00873690    07BF	005B	AC45	11C6	DC45	0627	9247	DC5D
    0x008736A0    0313	882A	0210	C802	AE49	4C6E	E9C0	00C0
    0x008736B0    3010	A120	6C6E	DC4D	DC45	2641	9247	DC5D
    0x008736C0    0210	C802	AE49	4C6E	2002	A120	E5C0	0040
    0x008736D0    0080	9362	07BD	005A	01BC	D4F6	019D	5028
    0x008736E0    0186	00E8	1014	8013	0627	AC35	E800	0000
    0x008736F0    0240	006A	023C	62F6	0280	C82A	02C0	006A
    0x00873700    0080	0B9F	0C00	B160	0000	BAA0	0C00	0000
    0x00873710    07BF	005B	AC45	11C6	DC45	0627	9247	DC5D
    0x00873720    0313	882A	0210	C802	AE49	4C6E	E9C0	00C0
    0x00873730    3010	A120	6C6E	DC4D	DC45	2641	9247	DC5D
    0x00873740    0210	C802	AE49	4C6E	2002	A120	E5C0	0040
    0x00873750    0080	9362	07BD	005A	01BC	D4F6	019D	5028
    0x00873760    0186	00E8	1014	8013	0627	AC35	E800	0000
    0x00873770    0240	006A	023C	62F6	0280	C82A	02C0	006A

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    我理解您的担忧。 此器件上 SPI 引导失败的最可能原因是引导映像的字节顺序不正确。 此问题通常源于启动映像创建实用程序如何生成映像以及刷写工具如何将其写入闪存。

    感谢您共享.map 文件和链接器脚本。 您还能分享 i2crom.ccs 文件吗?  这将有助于我进一步调查。

    我将在内部查看其余问题、然后返回给您。

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是 i2crom.ccs 文件:
    e2e.ti.com/.../i2crom.ccs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    感谢您分享详细信息。

    i2crom.ccs 文件似乎正确。 我正在研究与此问题相关的更多可能性、并在两天内为您提供更新。

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    您能否在不使用-swap 选项的情况下重新生成图像? 并尝试?

    此致、

    Betsy Varughese.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我相信我找到了这个问题。 我需要将 IBL_SPI_ROM.map.pp 中的选项字段从 0 更改为 1

    IBL_SPI_ROM.map.pp:

    部分

    param_index = 0
    BOOT_MODE = 50
    SW_PLL_PREdiv = 1
    SW_PLL_mult = 39
    SW_PLL_postdiv = 1
    SW_PLL_FLAGS = 0

    选项= 1

    core_freq_MHz = 1000

    BUS_freq_MHz = 10
    BUS_freq_kHz = 0

    ADDR_WIDTH = 24
    N_PINS = 4
    MODE = 0
    Csel = 2
    c2t_delay = 1

    exe_file =“IBL.SPI.ccs"</s>“
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在没有-swap 选项的情况下重新生成了映像并使用它编程了闪存。

    对于此映像、引导日志 (0x00873200) 填充:20B0F7D8 000000C8 00000066

    我认为是 BOOT_SPI_CHECKSUM_FAIL (102)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    负责的工程师目前不在办公室。 请预计响应将延迟 2 天。

    此致、
    Sivadeep

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edward:

    对延迟深表歉意。 我当时在病假。

    我需要将 IBL_SPI_ROM.map.pp 中的选项字段从 0 更改为 1

    请问您是否有机会在将选项更新为“1"后“后进行检查? 如果我们希望 IBL 配置 PLL ,那么我们必须使用“options = 1“。

    如果问题仍然存在、请告诉我。

    此致、

    Betsy Varughese.