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.
您好!
我们有一些相当旧的板、使用 TMS320F28335PGFA。
我的任务是更新那里的固件。 他们给了我几个板进行测试、其中一个似乎正常工作。 但是、在那里下载代码几次后(使用 code composer)、它不再允许我将代码下载到闪存中。
我可以将代码加载到芯片上的存储器中、并从那里进行调试。 只要 CODE-composer 正在运行、代码就会运行。 但似乎没有进入闪存、如果我重新启动电路板、代码将不再运行。
在我看来、也许芯片已经足够旧了、并且已经被使用了、这样存储程序的 EEPROM/Flash 就不再接受编程了。 旧程序也不存在、因此在加载新程序之前擦除闪存的器件似乎可以正常工作。
我是否可以通过某种方式确定(或合理确定)问题是什么?
或者、我是否只需要让某人更换芯片(假设 TI 仍在销售它们)并查看其是否仍然有效?
任何建议肯定都是值得赞赏的。
谢谢!
卡西
Cathy、
无法判断闪存已编程/擦除了多少次、 但我们保证器件寿命周期为20000 W/E、因此、如果您粗略地了解了在现场重新编程闪存的次数、我们可以在我遇到问题之前查看闪存是否位于该焊球公园的任何位置。
下面是一些让我们开始调试的问题:
1) CCS 版本
2)加载.out 文件失败时出现错误消息
3)连接到设备时,您能否打开内存窗口(我认为是 View->Memory browser)以寻址0x33FFF8 - 0x33FFFF 并让我知道您在内存窗口中看到的值。 这些是闪存 CSM 密码、如果这些是读回0、则闪存被锁定。 在这种情况下、我们需要以不同的方式继续。
4)假设 CCS 的版本较新,请转至 Tools->On Chip Flash (工具->片上闪存)。 这将启动 CCS 的闪存设置。 我想确认假设的时钟值与您 PCB 上的时钟值相匹配。 如果这不正确、闪存编程可能不起作用。
我们可以在收到您的回复后再继续。
最后、F28335仍处于活动/完整生产状态、因此不会给您带来更多/新器件。 您可以并行取样几个作为对冲、但我认为我们还不知道根本原因需要更换芯片。
最棒的
Matthew
Matthew、
感谢您的回答。
CCS 版本为5.3.0
我还在另一台计算机上安装了更新版本10.4.0、但从该计算机上加载时似乎一点也不正确、因此我返回到了已知状态(使用它构建的 CCS、多年前)。 该二进制文件已在该领域使用多年。 我对其进行了更改、使其正常加载、然后它停止加载。 因此我返回到已知的二进制文件、但现在我也无法加载该二进制文件。
我没有收到加载.out 文件的错误消息。
我不知道有没有方法可以在不使用调试器的情况下加载二进制文件? 因为这就是我加载它的方式。 它在调试模式下运行、但当我移除用于加载的 C2000电缆时、它会一直运行、直到我复位。 因此我推断我实际上不会将其放入闪存中(尽管它说它正在擦除内存)
密码都是 FFs。
如果您想说的话、我非常怀疑我们已经达到20000次重编程的次数。 (不确定 W/E 周期的含义)
我们有自己的引导加载程序、在我看来、可能我擦除了官方的引导加载程序。 在阅读帮助文件时、我认为官方引导加载程序应调用我们的引导加载程序、然后将引导加载程序加载到我们的程序中。 所以我不知道问题是什么、但这可能是问题的一部分。
是否有办法在不涉及 CCS 调试器的情况下加载二进制文件? (文件中的人员没有 CCS 副本...)
卡西
此外、关于时钟速度设置、我去了您说的地方、但它似乎没有显示时钟速度
您在20000个负载上是正确的、W/E 代表写入/擦除、我应该已经澄清了这一点。 因此、从闪耀的角度来看、我怀疑任何东西都是磨损的。 如果 CCS 在加载时没有给出任何错误、那么我认为电源轨等可能也很好。
器件未锁定、这将有助于轻松进行调试、因此也很好。 我已经放置了一个我提到的闪存窗口的图像、以防它有用。
我们有一个名为 Uniflash 的独立(GUI 或命令行)工具、您可以在 以下位置下载该工具:https://www.ti.com/tool/UNIFLASH
这将使用 JTAG 连接将.out 文件下载到器件。
我想这里可能有一些事情在发挥作用、现在您提到了现场升级。 在这种情况下、我们还通过器件上电时的引导模式引脚支持闪存以外的引导模式(例如 UART 或 CAN 等)。 该字段的一种潜在策略是、当 UART 连接到器件时、该标头还会更改引导引脚以启用直接下载代码。 您的引导内核很可能会被下载、然后从那里接管、等等 然后、当它被移除时、下一次上电将正常引导至闪存。
或者、正如您提到的、您工厂闪存中的代码可能具有某些序列、用于查找该总线/外设上的活动并启动其自己的下载/更新等
不过、回到引导方面、我会检查 PCB 上是否已将器件配置为从闪存引导(请参阅下文)、因为您直接对其进行编程。 如果引导引脚未配置为从闪存引导、这将说明为什么在加电/独立时其行为不符合预期。
CCS 或 Uniflash 可以实现的另一个方面是读取闪存内容、并将其与您认为应该存在的内容进行比较。 一种可能的策略是采用已知良好的 PCB 并保存闪存中的内容、然后在器件上调试、您可以直接加载该内容(您可以将存储器转储另存为.out 文件); 或者将其与使用 txt diff 通过 CCS 加载时发生的情况进行比较。
这是闪存工具设置的屏幕截图、请注意、默认情况下 CCS 会在尝试对闪存进行编程时擦除所有扇区。 如果您知道您只想修改某个扇区中的代码(并且只想保留其他扇区)、则可以指示它只擦除这些扇区。 CCS 仍会尝试对照最终闪存验证.out、但这也可能是您不打算使用具有潜在差异的新.out 文件更改所有扇区的线索。
最棒的
Matthew
好的、这需要一些时间、但下面是我现在要做的:
我无法使用较新的 Uniflash、因为我使用的是较旧的 Spectrum Digital C2000 JTAG。 但是、我在上找到了旧版本的 Uniflash
与旧版 Code Composer 相同的机器。 这对现在来说很好、我很可能很快就会更新我的工具。
我使用 Uniflash 加载代码。 它没有给出任何错误。 但它仍然无法启动
我想知道我是否可以加载默认的引导加载程序? 我想也许我在 TI 的默认加载程序之上加载了引导加载程序、而我应该将引导加载程序放入程序代码区域。 我还非常确定我们的代码应该在没有*我们的*引导加载程序的情况下运行。 那么、我可能应该从接地零开始吗?
其他领域。 Uniflash 显示时钟速度为30:
OSOCLK (MHz) 30.
CLK Indiv 2.
PLLCR 值10
我真的不知道如何读取 GPIOs...it 是一个复杂的电路板、所以如果我想直接读取它们、我必须找到它们的位置。 Uniflash 允许我选择 GPIO、但不对它们执行任何操作(我希望它能读取它们)。 下面有一些按钮表示频率测试、停止频率测试、但不清楚这些按钮是否与 GPIO 有关。
Cathy、
如果 OSCCLK 的值与 PCB 上的值相匹配、那么我可以确定这是什么。 如果代码中的设置与电路板上的设置相匹配、GPIO 切换测试将在您选择的 GPIO 上输出10kHz 脉冲。 这是一种检查这些协议是否一致的快速方法。 不过、我并不完全确定这里的错误编程是什么问题、但您可以检查它是否足够简单。
本应用手册介绍了我们的串行闪存引导加载过程 https://www.ti.com/lit/pdf/SPRABV4 我们的引导加载程序位于 ROM 中、因此您无法覆盖它们、但正如您所说的、如果您直接使用 JTAG 对闪存进行编程、则没有真正的理由说明这一点至关重要。
您是否能够检查我之前连接的引导引脚? 这些决定了器件在加电时如何独立启动。 根据您描述的内容、您将需要为您的应用选择闪存引导模式。
正如我提到过的、在擦除/编程闪存之前、采用现场已有的器件并使用 uniflash (或 CCS)保存其闪存内容可能会有所帮助。 编程后(或使用已重新编程的器件)、您可以保存闪存、然后根据内容执行基于文本的 DIFF、以查看其是否与您打算进行的更改一致。 最坏的情况下、您只需查看相同的地址范围是否具有代码并且未被擦除即可。
最棒的
Matthew
Matthew、
感谢你的所有帮助。 奇怪的是、事情又开始了。 我看不到我做了什么不同的事情、但现在代码在加电时启动。
不知道它为什么不起作用、现在是什么、我不是很舒服、但如果它在工作、我无法进行真正的调试。
再次感谢、
卡西
Cathy、
感谢您的更新、同意您对情况的评估。
物理环境是否可能改变了工作状态与非工作状态? 即环境温度、PCB 电源等?
由于工作正常、我假设闪存编程本身不是问题;
调试、我将查看
1)电源(VDDIO/VDD/VDDA)、加电时的 XRSn 引脚之间的关系(DS 将在此处提出要求)
2) XRSn 失效时的引导引脚电平;我们是否确认所有引导引脚上都有外部上拉/下拉电阻?
3)确保 TRSTn 引脚在独立模式下保持低电平、即 PCB 上也有一个下拉电阻。
如果您认为有必要深入了解上述内容、这些只是更一般的问题、可以使事情正常运行/不运行、尤其是在控制不当的情况下、环境会产生一些影响。
最棒的
Matthew