工具/软件:Code Composer Studio
那么、这里是我要尝试执行的操作。
我有一位客户希望能够通过 CAN 将新的独立应用写入闪存。 我已获取 F2803x_flash_kernel 示例、并仅对其进行了一点修改以支持 CAN。 我还将评估板配置为引导至 CAN_BOOT 模式。
我能够引导至 CAN_BOOT 模式、并将修改后的闪存内核写入 RAM (我认为)。 我已经使用硬件断点验证了这一点。 但是、我无法将独立应用程序写入闪存。 我知道应用程序可以正常工作、因为它是我一直使用的一个、它通过 JTAG 对闪存进行编程。 从闪存中一个良好的应用程序开始(通过 JTAG 写入)、在通过 Code Composer 中的存储器浏览器观察闪存存储器时、闪存内核似乎正在正常擦除闪存存储器、 但是、随着 CAN 数据字节的发送、闪存存储器字节在0x0000和0xFFFF 之间来回循环、而不是像我所说的那样以错误的方式循环。 闪存永远不会写入任何有意义的数据。 当 CAN 传输结束时、所有 Flash 存储器为0xFFFF。 我的 CAN 数据传输是使用 hex2000与我编写的脚本相结合创建的、以构建2字节 CAN 消息的序列。 我非常确信我能够正确地执行此操作、因为我可以通过 CAN 成功地将闪存内核和为 RAM 构建的应用写入 RAM。 我似乎无法使用闪存内核写入闪存。
我能得到的任何帮助都很好。 我在修改后的闪存内核示例中找不到任何错误。 我已经注释掉 了闪存内核中的 InitPll 调用、因为我希望保持与引导 ROM 设置的所有内容相同。
编辑: 所以我现在有两个问题。
1) 1)我发现闪存擦除工作正常、但需要一段时间、并且 CopyData 似乎只是在擦除闪存时尝试对其进行编程。 如果我将 CAN 数据的第一个序列发送到第一个块大小、然后等待闪存存储器被擦除、然后发送剩余的 CAN 数据、那么写入闪存似乎就可以了。 这是已知的限制吗? 在您知道闪存被擦除之前、您无法通过 CAN 发送实际的写入数据?
2) 2)尽管我的应用程序似乎对闪存执行写操作、但当它引导至闪存时、它不会运行应用程序。 我无法判断它在做什么。 我比较了闪存存储器中内核写入后的前几十个字与 Code Composer 通过 JTAG 写入的字、它们匹配、因此我假设闪存存储器写入正确。 也许我需要检查一下所有内容?
EDIT2:另一个线索、当我通过 CAN 闪存内核进行编程时、闪存入口点(0x3F7FF6 - 0x3F 7FF7)包含0xFFFF。 但是、当我通过 code composer JTAG 进行编程时、该位置包含一个有效值(0x007E 和0x88B0)、这对我来说似乎很奇怪。 我想我不确定该值的含义。 我想它将包含我的闪存应用程序的入口点。
EDIT3:嗯,我的 CAN 流量似乎确实有写入该点的命令,它只是..... 我猜不是这样。
02 00
3F 00
F6 7F
7E 00
B0 88
EDIT4:因此、如果我更改 CAN 传输、使其 首先写入0x3F7FF6、那么写入操作就可以了。 但是、如果发送我的整个应用程序、它似乎在中间的某个位置"放弃"、因为最后要写入的一组地址只是0xFFFF。 我需要对 CopyData 函数进行故障排除、因为它在一段时间后似乎无法正常工作。
EDI5.5:它的工作原理!! 遗憾的是、为了使其正常工作、我必须将 CAN 传输从10ms 减慢至100ms。 我不知道为什么 RAM 之外的闪存内核无法跟上10ms 的速度。 此外、在100ms 时闪烁会花费太长的时间。 我需要弄清楚为什么它需要这么慢。 此外、还存在一个问题、即在发送实际数据进行写入之前、必须等待未知的闪存擦除时间。
我已附加修改后的闪存内核项目。