主题中讨论的其他器件: C2000WARE
我有一个控制器(TMS320F28379D)和 EEPROM (25AA512、SPI 接口)、我试图在引导模式下使用 EEPROM 来引导该控制器、以便控制器从 EEPROM 中获取代码。 您能指导我执行相应的步骤吗? 我参考了控制器第 4.10.4.3节"SPI 引导模式"的参考手册、但内容尚不清楚。
注意: 不查找使用闪存的 EEPROM 仿真
此致
萨达姆
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.
我有一个控制器(TMS320F28379D)和 EEPROM (25AA512、SPI 接口)、我试图在引导模式下使用 EEPROM 来引导该控制器、以便控制器从 EEPROM 中获取代码。 您能指导我执行相应的步骤吗? 我参考了控制器第 4.10.4.3节"SPI 引导模式"的参考手册、但内容尚不清楚。
注意: 不查找使用闪存的 EEPROM 仿真
此致
萨达姆
您已经成功实现了 SPI 引导模式和硬件设置,但想知道如何通过 SPI 通信将十六进制文件从 EEPROM 发送到 F2837?
尊敬的 Allison:
是的、请提供帮助。
你好 Saddam,
我们不熟悉这个特定的 EEPROM 器件、但我们确实有涉及 AT25128/256的软件示例、您可以将其用作参考指南。 虽然 F2837xD 专门没有此 SPI EEPROM 示例、但 F2838x 确实有此示例(C2000Ware 中的 SPI_ex6_EEPROM)、您可以在此处寻求帮助。
您之前提到 可以与 EEPROM 通信、所以您遇到了特定部分的通信问题吗? 如果您尝试调试代码、确定4个 SPI 引脚的范围也有助于检查通信是否正确。
此致、
艾里森
尊敬的 Allison:
我不需要有关 SPI 的帮助、我需要有关"如何通过 SPI 使用引导模式"的确切步骤
要求:EEPROM 中的十六进制文件将由控制器在 SPI 引导模式下使用,那么如何实现该目标。
[/报价]请了解要求是什么(上面引用的)。
此致
萨达姆
你好 Saddam,
对于 通过 SPI 测试引导模式的步骤、您可以执行以下操作:
1.打开 CCS、查看并启动目标配置文件
2.在调试窗口中,右键点击 CPU1并连接到目标
3.在"View"选项卡下,点击"Memory Browser"窗口,然后输入地址0xD00。 在此地址处、键入十六进制值0x045A。
4.在工具栏窗格中、点击 CPU1的 CPU Reset 按钮、然后按 Resume 按钮。
您必须为 EEPROM 配置 SPI、以便能够被识别。 有关这方面的更多信息、最好查看第4.10.4.3节。 我的专业知识目前没有这个外设、但可以查看是否需要任何其他特定的东西、将会告诉您。
谢谢。此致、
查尔斯
1. 打开 CCS、查看并启动目标配置文件

=>启动目标配置文件后要做什么?
2.在调试窗口中,右键点击 CPU1并连接到目标
3.在"View"选项卡下,点击"Memory Browser"窗口,然后输入地址0xD00。 在此地址键入十六进制值0x8104。
[/报价]
=>成功完成
[/quote]4.在工具栏窗格中、点击 CPU1的 CPU Reset 按钮、然后按 Resume 按钮。
[/报价]
现在,在点击 CPU 重置后,发生以下情况:
点击"继续"后、将出现以下情况:
我无法看到这是如何使我进入 SPI 引导模式的?
问题1)在 TMS320F28x 控制器的 TRM 中、在 SPI 引导模式下的第4.10.4.3节、您能告诉我将在主函数内部或在主函数之前编码步骤1至8、
a)如果在主函数内部、那么在主函数开始之后的什么位置、或者在哪里?
b)如果在 main 函数之前、那么这里?
问题2)并且在第4.10.4.3节或 TRM 中的这个步骤中、不清楚代码/控制器是如何确定它应该运行哪个代码的、无论是来自 EEPROM 还是闪存
问题3)、它们是 SPI 引导模式的引导引脚:
a)不清除 SPI 模式的 GPIO 引脚、请清除此
B)以及代码中的 BOOTCTRL 寄存器在哪里、以及如何根据需要对其进行配置问题4)您能否提供示例代码、因为在 TRM 中、它还不是很清晰、如何实现任务(任务:我想将十六进制文件从外部 EEPROM 编程到控制器中、 由于在现场、我们不想对控制器进行编程、因此我们想要将 hex 文件放入外部 EEPROM、只需插入 PCB 并重置电路板、同时向引导引脚添加跳线引脚、控制器应从 EEPROM 获取更新的 hex 文件)
你好 Saddam,
实际上我为您准备了校正、启动模式应为0x045A (SPI 启动模式为04、5A 用于确认寄存器有效)。
Q1a)这些步骤发生在 UINT32 SPI_Boot (UINT32 Bootmode)函数中、该函数是 bootROM 代码(SPI_Boot.c)的一部分。
Q1b)在 main 之前、器件正在配置时钟并选择引导模式。
Q2)这是由 UINT16 SPIA_IPORI Address_Key 函数确定的。 我可以为您研究这种情况。
Q3a) SPI 模式的引导引脚由传递到 SPI_Boot 函数的引导模式确定。 默认情况下、引导引脚使用的是 GPIO16、GPIO17、GPIO18和 GPIO19。 这些与函数 SPI_SPI_2 Pinmux_Option ()有关。
Q3b) BOOTCTRL 寄存器在 Selection Mode_Boot 文件中的代码中引用。
Q4)我的带宽现在是有限的,为这个任务,将看到什么可以做.
谢谢。此致、
查尔斯
尊敬的 Charles:
我实际上为您做了修正,引导模式应为0x045A (04表示 SPI 引导模式,5A 用于确认寄存器有效)。
我没有得到您在此引用消息中建议的内容、您是要求将0xD00地址更新为值0x045A 吗?
1) 1)在您之前的回复中、您建议了进入引导模式的4个步骤、我已为您提供了相同的屏幕截图、请说明。
2) 2)正如您提到的 SPI_Boot.c 文件、但没有提到在 main 内或 main 之前调用该文件函数的位置、确切地说、TRM 中也确实缺少此信息、 因此、我需要基础/简单示例代码来了解使用 SPI EEPROM 的引导过程、我的所有问题都已回答。
3)如果您的带宽有限,请转发您的可用人员
此致
萨达姆
尊敬的 Allison:
还在等待您的回复。
我想和大家分享我已经执行的一些步骤、并且对此有一些疑问、
注意:有两个项目:a) EEPROM 的 LED 闪烁300ms b)控制器的 LED 闪烁100ms
a)在外部 EEPROM 中转储十六进制文件
=> 300ms LED 闪烁代码(十六进制文件)、要在外部 EEPROM 中转储
=>在转储之前、我已经在 properties->C2000 Hex Utility -> Boot Table Options -> Set a)选择引导模式、b) spi-a 端口、8位模式(--spi8、-spi8)中设置了一些设置

=>输出格式选项->设置"Intel hex"

=>构建工程

=>读取此 hex 文件时、我可以看到前两个字节的密钥= 0x8AA
b)独立引导
=>调试配置->目标->闪存设置-> Z1-Bootctrl (0x7801e)= 0x0000045A

=>构建后->调试模式
正如您在存储器浏览器中看到的 Z1-bootctrl 的值
=> CPU 复位

=>恢复

=>暂停
如图所示、bootctrl 寄存器的值没有改变、控制器代码在运行、而不是 EEPROM 代码
=>您也可以看到引导状态寄存器、因为寄存器的值中有闪存引导、而不是 SPI 引导


=>我认为控制器没有进入 SPI 引导、因为我设置值的地址(0x045A)不是您在 TRM 中提供的错误地址、因为在下面的内存浏览器中、您可以看到地址是 0x0005F004、而不是0x7801e、 如果0x0005F004是设置 bootctrl 寄存器的正确地址、请告诉我如何设置、因为在调试配置中、目标的闪存设置中、地址是0x7801e

=>我还必须在闪存设置中设置另一个寄存器、请参阅下图

注意 :我在独立引导中完成了电源重置我的控制器板,但控制器代码正在运行,而不是 EEPROM 代码
b)仿真模式
=>在调试模式下设置寄存器0x00d00中的值0x045A

=> CPU 复位

=>恢复

=>暂停

=>即使在仿真模式下、控制器代码也在运行、而不是 EEPROM 代码
我正在等待您的回复、我仍在要求您提供示例代码或任何文档。
此致
萨达姆
你好 Saddam,
很抱歉、我还在等待回复(这不是我的专长)、但我可以尝试在这里提供进一步指导:
首先要注意的是目前应坚持使用仿真引导模式-使用该模式进行调试并验证您是否可以正确连接使用 EEPROM 进行工作。 一旦我们确认其设置正确、然后继续使用闪存工具对 OTP 进行编程以对其进行设置。
设置 EMU 引导模式后、应该可以按照上面屏幕截图中所示选择该模式。 首先、在 CCS 中进行重置、然后转到工具栏中的"脚本"选项卡并使用"EMU 引导模式选择"功能。 请告诉我您能否完成此操作、并使 EMU 引导模式正常运行。
此致、
艾里森
尊敬的 Allison:
您提到的 emu 引导步骤对我无效。
1) 1)在工具栏-> Scripts->EMU Boot Mode Select->(EMU_BOOT_SARAM 和 EMU_BOOT_FLASH)中、但是我需要 EMU_BOOT_SPI、该选项中未显示此功能。
2) 2)即使我已在内存浏览器中手动将值0x045A 置于地址0x00d00上、在 CPU 复位状态下的调试模式下、然后点击"Resume"、但会运行控制器代码和 EEPROM 代码。 (注意:我已经完成了此操作、并提供了之前回复中的屏幕截图)
此致
萨达姆
你好 Saddam,
感谢您的答复。 另一个需要注意的事项是、您之前在回复中表示您使用的是 SPIB。 根据数据表、共有两种 SPI-Boot 模式(0和1)-取决于您所使用的 GPIO -但是这两种模式都被指定用于 SPIA 引导。 (请参阅表9-15。 数据表的每个外设引导加载器使用的 GPIO 引脚)。
有鉴于此、有一些问题:您正在使用哪组 GPIO (我知道 Charles 之前已与您讨论过、但我想再次查看您是否在使用 SPI 引导0和 SPI 引导1)。 另外、您是否仍在尝试使用 SPIB? 您 是否尝试过使用 SPIA? 如果没有、请尝试在此处实施 SPIA。
此致、
艾里森
你好 Saddam,
看起来、当您从上面的屏幕截图中恢复并重新暂停您的程序时、在实际上引用了 SPI_Boot.c 的地方、将传递此值。
下面是 一些逐步完成仿真 SPI 引导过程的说明、此过程为 调用 SPI_Boot.c 提供了更多的上下文。 这也有助于检查是否也能成功看到 SPI 通信。
请告诉我您是否能够按照以下步骤操作并查看 SPI 通信。
警告 :您只能对 OTP 启动控制键编程两次,因此 在实际编程 OTP 之前、请务必验证一切都在仿真模式下运行。 您可以使用"工具">"片上闪存"将密钥编程到 OTP 中。 向下滚动至"OTPBOOTCTRL"并在按下按钮进行编程之前键入它。 但是、请再次小心操作:

此致、
艾里森
尊敬的 Allison:
你提到的所有步骤都能很好地工作,是的,我能够在外部 EEPROM 和控制器之间建立 SPI 通信,因为在 SPI_START_Boot ()中,我可以看到它正在读取密钥: 0x08AA,这意味着 SPI 正在工作并返回 entryAddress(十进制:545171 )。
但是当我在获得入口地址后运行恢复时、它不会运行 EEPROM 代码、仍然运行控制器代码。
下面是供您参考的屏幕截图:
1)在完成返回 entryAddress 的 spi_boot()函数后,我将逐步执行到 exitBoot,然后按 resume,然后代码会转到 nowWhere (请参考 pic 4):
1)
2)
3)
4) 
此致、
萨达姆
你好 Saddam,
感谢您发布有关单步执行 SPI 引导流程的详细信息、我有一些问题和建议。
1. cpu1brom_system_init()返回的 entryAddress 是否与您在内存浏览器中看到的内容一致? 正如 技术参考手册的第4.10.1节所述、我希望在0x80000处对该应用程序进行编程。 0x80000地址是否被其他数据占用? 如果是、请在编程之前使用片上闪存工具擦除闪存。
2.我注意到您在为 LED 闪烁应用程序生成十六进制文件时使用了 Intel Hex 格式。 请使用 ASCII 十六进制输出格式(-a 或--ascii)生成十六进制文件。 有关详细信息、请参阅技术参考手册的第4.10.5节。
3.我不确定我是否理解在将应用程序加载到闪存后您看到的行为。 前面您说它运行控制器代码、而不是 EEPROM 代码、但在屏幕截图中您提到它不会在任何地方运行。 正在运行什么控制器代码? 是否在发生 SPI_Boot 之前将程序加载到控制器上?
此致、
斯凯勒
您好、Skyler:
1) 1)您可以在屏幕截图中看到、地址为 0x00085193、当我遵循 Allison 步骤时发生了这种情况
2)它应该是 Intel hex(我认为),因为当我读取 ASCII 十六进制文件时,我在前两个字节和之后看不到密钥(0x08AA),但我可以在 Intel hex 文件中看到密钥和其他类似波特率的东西。
ASCII 十六进制文件
Intel Hex 文件
3) 3)你可以在我的上述响应的屏幕截图中看到、在调试模式下、 我可以看到正在运行的代码 LED 在闪烁、但当我暂停程序时、nowWhere 出现(请参考之前响应 PIC 4中的屏幕截图)。
此致
萨达姆
你好 Saddam,
如果 LED 在调试中闪烁、则您的应用程序代码 似乎正在运行。 当您暂停它、但它"无处可去"、这可能表明您需要加载正确的符号(采用与调试 SPI_Boot.c 中类似的方式)、因此当您暂停它时、请尝试加载您项目 代码的.out 文件。 如果这会改变您的能够看到的内容、那么应该表明从 EEPROM 加载的代码正在运行。 请注意、代码运行不需要执行此步骤、但您必须能够在调试模式下查看此步骤。
您能否还请发送 led blinky 项目应用程序.cmd 文件,以便我可以检查那里的地址也?
此致、
艾里森
尊敬的 Allison:
我要生成输出文件、方法是在"Properties"->"C2000 Hex Utility"->"Output Format Options"中设置输出格式并构建工程、然后生成十六进制文件。
1) 1)您能否判断 SPI_boot 完成后(即在引导退出时)应该是什么?
2) 2)您希望我在引导完成后执行该步骤、即代码处于引导退出状态或 CPU 复位状态时执行?
因此当您暂停时,请尝试加载项目 代码的.out 文件。
3) 3)我认为符号加载正确、这就是代码运行 SPI 引导函数的原因、如果不正确、请告诉我如何正确执行。
4) 4)我无法向您发送.cmd 文件、因此我提供了该文件内容的屏幕截图。
图1)图2)
图3)图4)
此致、
萨达姆
你好 Saddam,
1.根据您提供的 hex 文件和.cmd 文件、SPI Boot 返回的条目地址看起来是正确的。 在 LED Blinky 项目中导航到 Properties -> C2000 Hex Utility 时、您是否可以发送"Summary of flags Set:"的内容?
2.我认为,你看到的代码在暂停后无处消失的原因是因为 LED Blinky 应用程序的符号没有加载。 因此、当您在 LED 开始闪烁后暂停调试会话时、您将无法看到器件上运行的源代码。 要加载符号、请在 LED 应用程序成功加载后暂停调试会话、导航至"Load Symbols"、然后选择 LED Blinky 应用项目 。
此致、
斯凯勒
您好、Skyler:
首先、让我清除两个代码:一个用于 EEPROM (LED 闪烁300ms)、另一个用于控制器(LED 闪烁1s)。
1) 1)我已经通过控制器代码对控制器进行编程、并在调试模式下设置、然后完成 CPU 重置、然后加载符号:"C:\ti\c2000\C2000Ware_2_01_00_00\libraries\boot_rom\f2837xd\RevB\rom_sources\CCS_files\cpu01\Release\F2837x_cpu01_01_bootROM_AllRevison.Out"、并根据上面的指导完成了以下步骤和指导完成了以下步骤。
2)
要加载符号,请在成功加载 LED 应用程序后暂停调试会话,导航至"Load Symbols",然后选择与 LED Blinky 应用项目 [/报价]我没有收到您在这条引用消息中的意思、您是希望我加载 EEPROM 代码或控制器代码的.out 文件吗?
3)
此致
萨达姆
你好 Saddam,
根据我对用例的理解、您需要实现 SPI 闪存内核以将 EEPROM 代码复制到闪存中。 SPI bootloader 将 EEPROM 代码加载至 RAM、而不是闪存。 我认为这就是您看到控制器代码在 SPI 引导完成后继续运行的原因。 SPI_Boot 返回的进入地址由构建 EEPROM 代码的工程中的连接器命令文件(.cmd)确定。 从您的屏幕截图我们可以看出、.cmd 文件试图将应用程序存储在闪存中、因此尽管 SPI_Boot 函数将程序加载到 RAM 中、但它仍返回闪存入口地址。 根据您所述的行为、先前在闪存中加载的控制器代码必须具有相同的入口地址、因此它会继续运行控制器代码。
为了实现所需的行为、必须使用闪存内核。 闪存内核负责擦除之前的控制器代码、接收 EEPROM 应用程序代码以及使用闪存 API 将 EEPROM 代码编程到闪存。 此过程的一般流程如下:
作为参考、添加一个 SCI F2837xD 的闪存内核位于 C2000 Ware_Install_Location / device_support/f2837xd/examples/dual/f2837xD_sci_flash_kernels。 (我注意到您使用的是 C2000Ware v2.01、而最新版本是 C2000Ware v5.01。 如果未找到我之前提到的位置、请尝试升级到 v5.01)。 需要对其进行调整以与 SPI 外设配合使用。 位于以下位置的 bootROM 代码: C2000 Ware_Install_Location /libraries/boot_rom/f2837xd/revB/rom_sources/f2837x_bootROM/cpu01-bootROM/source 对于创建闪存内核至关重要。 SPI 闪存内核应使用大量 bootROM 代码(位于 C2000 Ware_Install_Location /libraries/boot_rom/f2837xd/revB/rom_sources/f2837x_bootROM/cpu01-bootROM/source/SPI_Boot.c)以完成此任务。 本应用手册讨论了 SCI 闪存内核(https://www.ti.com/lit/sprabv4)、但主要理念对了解/实现 SPI 闪存内核很有用。
如有任何疑问、敬请告知。
此致、
斯凯勒
您好、Skyler:
我不明白我为什么必须执行这些 额外的步骤、如果我必须执行这些步骤、那么 SPI 引导 模式的使用是什么(我的意思是、我感觉当我对 EEPROM 使用 SPI 引导模式时、 然后、复制 EEPROM 中的代码到闪存地址(0x800000或闪存中的其他一些区域)、然后该地址从引导退出调用)、如果我错、请说明 SPI 引导时的用途是什么?
我当时认为仿真模式会很简单、但会变得越来越复杂。
您能告诉我下面的步骤吗? 独立 EEPROM 的 SPI 引导模式?
此致
萨达姆
你好 Saddam,
如果您想将代码从外部 EEPROM 复制到 RAM、可按照我们之前讨论过的仿真 SPI 引导步骤操作。 请确保 存储在 EEPROM 中代码的活动配置的目标是 RAM。 如果正确完成、引导加载程序代码和新生成的十六进制文件将直接将代码加载到 RAM 中。 SPI_Boot 返回的 entryAddress 将表示程序已加载到 RAM 中、您应该会看到 EEPROM 的新代码开始运行。
此致、
斯凯勒
您好、Skyler:
1) 1)我可以在独立和仿真模式下运行 EEPROM 代码、方法是将 flash.cmd 更改为"链接器命令文件"中的 ram.cmd 文件、但这些是 led 闪烁代码、它的代码大小很小、 但我的应用代码要大得多、并且未装入 RAM 中、因此我必须使用您之前建议的闪存内核。
2)请您更清楚地解释这些步骤:
[/报价]
- 复位器件并使用 SPI 引导模式
- 通过 SPI 将闪存内核从 EEPROM 传输到控制器
- 闪存内核将在 SPI 引导完成后进行控制
- 确保与闪存内核对应的.cmd 文件被配置为存储并从 RAM 运行
- 内核将从控制器上的闪存中擦除旧的应用程序代码
- 内核将配置与 EEPROM 的 SPI 连接并接收新的应用程序代码
- 内核会将新接收到的应用程序代码写入闪存并将控制权转移给它
- 将执行从 EEPROM 接收到的新代码
3) 3)您能否提供有关使用闪存内核的任何文档、我在 TRM 中找不到它。
4) 4)我有点困惑、例如如何使用"sci 闪存内核"和"spi_boot.c"进行 SPI 引导、如何将代码从 EEPROM 加载到闪存。
参考, SCI F2837xD 的闪存内核位于 C2000 Ware_Install_Location / device_support/f2837xd/examples/dual/f2837xD_sci_flash_kernels。 (我注意到您使用的是 C2000Ware v2.01、而最新版本是 C2000Ware v5.01。 如果未找到我之前提到的位置、请尝试升级到 v5.01)。 需要对其进行调整以与 SPI 外设配合使用。 位于以下位置的 bootROM 代码: C2000 Ware_Install_Location /libraries/boot_rom/f2837xd/revB/rom_sources/f2837x_bootROM/cpu01-bootROM/source 对于创建闪存内核至关重要。 SPI 闪存内核应使用大量 bootROM 代码(位于 C2000 Ware_Install_Location /libraries/boot_rom/f2837xd/revB/rom_sources/f2837x_bootROM/cpu01-bootROM/source/SPI_Boot.c)以完成此任务。 本应用手册讨论了 SCI 闪存内核(https://www.ti.com/lit/sprabv4)、但主要理念将对理解/实现 SPI 闪存内核很有用。此致、
萨达姆
[/quote]