我们有必要写类似SmartSnippets的SPI Flash编程的SPI闪存编程器。
作为我们希望一个闪存编程UI可以自动化一些东西,无需用户必须知道闪存的每个区域的偏移地址,应该存储除DA应用FW之外的数据。使用SS,用户必须知道偏移地址位置以闪烁一段数据以进行FW消耗。
接着就,随即,
1.在我们的自定义UI中编写SPI Flash编程SS的子集需要什么?
2. SS SPI Flash编程和JTAG_PROGGROMMER之间的协议是什么?
谢谢,
——潘文凯
设备:

嗨kqtrinh,
1.flash_programmer项目接受一系列命令(你可以在programder .c文件中找到这些命令),所以当你按下连接按钮(和程序员fw下载
将这些命令通过UART或via JTAG发送到您的580)Smart Snippets UI。所以在“它需要什么”的问题中,你需要定义更多的命令
flash_programmer并实现相应的函数。
2.闪存程序员的协议未记录,对UART和JTAG完全不同,通常使用请求/响应方案的设备交换数据从UART下的智能片段发送的消息遵循以下结构。
由于这未记录,并且没有可用的应用程序注意(因此创建的工具原样),编写自定义应用程序的最佳方式是通过逻辑分析仪探测两个设备之间的通信要捕获并复制应用程序上的命令。
谢谢mt_dialog.
谢谢太。
在programmer.c,它看起来像USE_UART标志没有在任何地方项目定义。这是否标志对应于你正在谈论的UART模式?
在SS工作室,,当点击SmartSnippets工具箱图标按钮来启动它,它会显示一个对话框供用户选择UART或JTAG模式。这是我的理解,要能闪现新的FW到SPI闪存,用户必须选择JTAG模式和跳J4头为SPI所以SS可以读/写/擦除SPI闪存。我可以选择UART模式和运行SPI Flash编程而J4头跃升为SPI写入新的FW?
我已经测试了这两种情况,只有JTAG / SPI J4标题选择适用于我。至于UART / SPI J4标题选择,我收到了一条消息“请按下电路板上的HW重置按钮开始下载过程”,然后按下按钮并检测到它的重置。之后,所有SPI闪存相关按钮(函数)都是灰色的。
我带来的原因是我正在尝试了解什么工作,并将模仿在自定义Flash UI中。如果JTAG模式是唯一可以用于访问SPI Flash的模式,则SS如何检测用户在用户时选择JTAG连接选择JTAG无线电?我附加一个快照图片以清楚起见。
谢谢,
——潘文凯
嗨kqtrinh,
是的,USE_UART标志设置在UART模式的程序员(你可以为了改变从下拉框中凯尔这个选项构建为programmer_uart,而不是为programmer_jtag)。
打开SS时出现的对话框是用于选择要编程的设备之间的一般接口,而SS不仅仅是闪光灯。因此,您可以选择UART模式以便编程闪光灯,但这需要额外的跳线配置,您必须在SPI配置中设置跳线,并使用P04引脚跳线并将P05与UART引脚和SPI引脚连接(三种跳投)。
谢谢mt_dialog.
太,
谢谢你的澄清。
在SS Studio中,我刚刚意识到SS会在选择JTAG时自动选择jtag_programmer.bin,选择UART时自动选择flash_programmer.bin。因此,当选择UART时,USE_UART标志将变为true。
我的问题是选择JTAG单选按钮时,选择了480056116复选框。SS如何以及在哪里读取/阅读此号码?这是我的自定义UI需要做的部分。您可以帮助调查SS源代码,让我知道它如何找到JTAG连接?JTAG模式是我们想要支持自己的自定义HW。
谢谢,
——潘文凯
太,
如果你不介意,你能不能也给了ACTION_WRITE和ACTION_ERASE协议格式,你已经给了ACTION_READ以上?这就是我真正需要我的自定义UI。
谢谢,
——潘文凯
太,
是从计算或只是从数据字节流的CRC32?
谢谢,
——潘文凯
太,
从操作码(8位)计算字节流的CRC32 |地址(32位)|长度(16bits)|数据或仅来自数据?
谢谢,
——潘文凯
嗨kqtrinh,
我没有智能片段的源代码,但我怀疑SS使用Segger工具和J-Link Commander来检查。
UART请求和响应的写和擦除操作的协议如下。
CRC仅为消息部分计算,这意味着OpCode - Address - Length - Data
谢谢mt_dialog.
嗨太,
您一直提到上面的flash读/写/擦除请求的格式是针对UART连接的,对JTAG连接来说不是同样的吗?如果没有,那么能否也提供JTAG的flash功能?
谢谢,
——潘文凯
太,
ERASE的格式看起来是错误的。我说,因为flash_programmer不需要知道地址和长度的字节在flash中被擦除?协议消息不包含这些。你能澄清一下吗?在我的DA应用FW中,我为不同的数据定义了flash中的其他区域,因此它们需要被更新或删除。
谢谢,
——潘文凯
嗨kqtrinh,
在JTAG模式下,功能实体有点不同(工具直接在固定地址中访问580的存储器,以便与580通信)程序员定义了用于数据的命令和目标的相应偏移,因此,协议有点不同于UART。例如,JTAG的读取闪存是Base_Memory地址和Target_Memory地址:
对于写了JTAG
对于擦除通过JTAG:
自从我认为,自我提到的情况下,我提到了UART,因为我更容易地附加分析仪并跟踪两个设备(580和智能片段工具之间的通信,因为我提到的,所以没有文件,所以我正在做完全相同的事情为了报告“协议”。在UART线路上,我没有看到删除过程的其他标题,可以附加分析仪并验证它,但智能片段向SPI发出擦除命令,它不会写入0xFF以删除它。我想你想要spi_erase_block命令/响应而不是spi_erase,即:
谢谢mt_dialog.
嗨太,
在获取读/写/擦除的消息协议时,非常感谢为我做肮脏的工作。我真的很感激你所有的支持。
所以,按照你的指导方针来生成发送到580的读/写/擦除消息对我不起作用。我想是时候用逻辑分析仪来检测电路板了。你能告诉我检查UART交通的哪些pin码吗?现在,单板在UART配置中被跳转(J4和J6之间有两个3脚跳线)。
您可以给我尽可能详细的说明,因为我可能需要了解如何使用逻辑分析仪检查UART流量。我对它一点也不熟练。
谢谢,
——潘文凯
嗨太,
我能把flash_programmer放在Keil IDE的调试模式中吗?我在flash_programmer.c源文件中看到了一个标志DEVELOPMENT_MODE,表明它是用于调试的。你能给我一些建议和调试指令吗?我想看到当我从SS或我的自定义UI发送协议命令时,它将触发flash_programmer中的断点。这将是理想的。
谢谢,
——潘文凯
从programmer.c文件中剪切并粘贴。不知道这是什么意思。
#定义UART_PIN_PAIR 4 / / (0: (P0_0 P0_1), 2: (P0_2 P0_3), 4: (P0_4 P0_5) 6: (P0_6 P0_7))
#ifdef来USE_UART
setword16(clk_per_reg,uart1_enable);//为UART1启用时钟
的#ifdef DEVELOPMENT_MODE //要使用调试器,其定义并根据板配置中设置的UART_PIN_PAIR(periph_setup.h)
port_sel = UART_PIN_PAIR;
# endif
嗨kqtrinh,
是的,您只能将程序员纳入580.您可以连接到智能代码段(打开智能代码段转到Flash Programmer选项卡,然后按下Connect按钮以进行激活的智能片段)。在做完之后,比打开flash_programmer项目,编译并下载FW。之后,当从智能片段加热按钮时,工具将运行并发送数据,并且您将能够捕获命令,我相信这只是通过UART选项工作,因为我不认为你将能够能够通过JTAG调试和连接。
至于你已经粘贴代码,它选择将要用于UART的引脚。如果你去UART_PIN_PAIR定义的评论,它说:
#定义UART_PIN_PAIR 4 / / (0: (P0_0 P0_1), 2: (P0_2 P0_3), 4: (P0_4 P0_5) 6: (P0_6 P0_7))
因此,如果有4中的定义,这意味着P04和P05引脚将用于UART。
SetWord16 (CLK_PER_REG UART1_ENABLE);使能UART时钟
port_sel = UART_PIN_PAIR为指定的一对选择UART波特率(根据设计,每个UART对由标准波特率分配)。
谢谢mt_dialog.
太,
谢谢你的信息。所以在Keil中,我将优化选项设置为0表示不进行优化,这样我就可以逐步通过代码并设置断点。当我选择这个选项并重新编译代码时,我得到了以下错误:
*** Using Compiler 'V5.06 update 3 (build 300)', folder: 'C: Development\Embedded\Keil\ARM\ARMCC\Bin'
构建目标'programmer_jtag'
编译CRC32.c ...
编译system_CMSDK.c ...
编译外围设备......
编译OTPC.C ...
编译uart.c ...
编译i2c_eeprom.c ...
编译spi_flash.c……
编译spi.c……
编译gpio.c……
编译程序员......
链接......
。\ out_jtag \ jtag_programmer.axf:错误:l6406e:没有执行区域的空格.any选择器匹配spi.o(.text)。
。\ out_jtag \ jtag_programmer.axf:错误:l6406e:没有执行区域的空格.any选择器匹配外围设备.O(.text)。
\ Out_jtag \ jtag_programmer。axf:错误:L6406E:执行区域没有空间与。any选择器匹配otpc.o(.text)。
。\ out_jtag \ jtag_programmer.axf:错误:l6406e:没有执行区域的空格.any选择器匹配system_cmsdk.o(.text)。
\ Out_jtag \ jtag_programmer。axf:错误:L6406E:执行区域没有空间与。any选择器匹配spi_flash.o(.constdata)。
\ Out_jtag \ jtag_programmer.axf:错误:L6406E:与.ANY选择匹配uidiv.o(的.text)中执行区中没有空间。
。\ out_jtag \ jtag_programmer.axf:错误:l6406e:匹配memcpya.o(.text)的执行区域中没有空间。
\ Out_jtag \ jtag_programmer。axf:错误:L6406E:执行区域没有空间与。any选择器匹配memset .o(.text)。
。\ out_jtag \ jtag_programmer.axf:错误:l6406e:与执行区域中没有空格.any选择器匹配startup_cmsdk_cm0.o(.text)。
\ Out_jtag \ jtag_programmer。axf:错误:L6406E:执行区域没有空间与。any选择器匹配uart.o(i.__ARM_common_switch8)。
\ Out_jtag \ jtag_programmer。axf: Error: L6407E: section of aggregate size 0x54c bytes could not fit into any selector(s). axf: Error: L6407E: section of aggregate size 0x54c bytes could not fit into any selector(s)。
没有足够的信息来列出图像符号。
没有足够的信息来列出图像映射。
Finished: 2条信息,0条警告和11条错误信息。
”。\ Out_jtag \ jtag_programmer。axf" - 11错误(s), 0警告(s)。
目标不是创造。
建立时间过去:00:00:01
我该如何克服这个问题?
谢谢,
——潘文凯
嗨kqtrinh,
原因-O1优化和灰色的断点是因为你正在构建的jtag_programmer而不是uart_programmer。如前所述,你将无法运行通过JTAG的jtag_programmer(调试数据和实际数据被转移了相同的接口)。所以,从下拉框中从programmer_jtag到programmer_uart开关,您将能够运行和调试代码。如果你要使用-O0你会得到一个错误也是如此。
程序员的FW不包换对于这种规模的(因为你意识到你递减的增加,这将在MCU中运行的代码量的优化级别时),所以你产生太多的数据和当前FW不建立这种使用(程序员本身是相当小,但缓冲加载从智能片段是作为大的整体形象,所以从FW在0x20000000的sysram高达0x2200偏移占有面积FW当你增加了优化,代码生成的出货量超越这个限制,当链接器试图地方将要举办塔数据地址0x20002200会失败)的缓冲区。您可以尝试增加抵消0x20002800如果在编译的代码优化-O0坚持,但我不能够预测这个任何问题,如果有的话,从一些快速测试我可以看到该工具正常运行。
谢谢mt_dialog.
谢谢您的指导。我现在可以用-o1构建。然后我收到了这个错误:
*** Using Compiler 'V5.06 update 3 (build 300)', folder: 'C: Development\Embedded\Keil\ARM\ARMCC\Bin'
重建目标'programmer_uart'
组装startup_CMSDK_CM0.s……
编译system_CMSDK.c ...
编译CRC32.c ...
编译外围设备......
编译OTPC.C ...
编译uart.c ...
编译i2c_eeprom.c ...
编译spi_flash.c……
编译spi.c……
编译gpio.c……
编译程序员......
链接......
程序尺寸:码= 6584 RO-DATA = 240 RW-DATA = 1040 ZI-DATA = 33608
FromELF:创建hex文件…
构建后 - 用户命令#1:fromelf -bincombined --output =“。\ out_uart \ flash_programmer.bin”“。\ out_uart \ flash_programmer.axf”
”。\ Out_uart \ flash_programmer。axf" - 0错误(s), 0警告(s)。
建立时间经过:00:00:02
负载“C: \ \开发\ \中\ \ DialogSemi \ \ SDK 5.0.4 \ \ DA1458x_SDK \ \ 5.0.4 \ \工具\ \ flash_programmer \ \ Out_uart \ \ flash_programmer.axf”
将JLink项目文件设置为"C: Development\Embedded\DialogSemi\SDK 5.0.4\DA1458x_SDK\5.0.4\utilities\flash_programmer\JLinkSettings.ini"
* JLINK INFO:选择“Cortex-M0”所选的。
JLink信息:
------------
DLL: V5.12f,编译于2016年5月17日16:03:35
固件:J-Link OB-SAM3U128 V1 compiled july 5 2016 08:42:08
硬件:V1.00
S / N:480056116
* JLink Info: Found SWD-DP with ID 0x0BB11477
* JLink Info: Found Cortex-M0 r0p0, Little endian。
* JLink Info: FPUnit: 4代码(BP)槽和0文字槽
* JLink信息:CoreSight组件:
* JLink Info: ROMTbl 0 @ E00FF000
* JLINK信息:ROMTbl 0 [0]:FFF0F000,CID:B105E00D,PID:000BB008 SCS
* jlink信息:romtbl 0 [1]:fff02000,cid:b105e00d,pid:000bb00a dwt
* jlink信息:romtbl 0 [2]:fff03000,cid:b105e00d,pid:000bb00b fpb
romtableddr = 0xe00ff000
目标信息:
------------
设备:ARMCM0
V目标= 3.300V
销状态:
Tck: 0, tdi: 1, tdo: 1, tms: 1, tres: 1, trust: 1
Hardware-Breakpoints: 4
Software-Breakpoints: 8192
监测点:2
JTAG速度:5000 kHz
没有找到:20000000H - 20001EB7H的算法
擦除跳过!
错误:Flash下载失败- "Cortex-M0"
闪存负载在09:46:46完成
嗨kqtrinh,
转到“目标选项”,选择“实用工具”选项卡,在该选项卡中选择“使用外部工具进行Flash编程”。
谢谢mt_dialog.
嗨太,
感谢您帮助我前进的说明,在调试UART程序员时。我现在能够在调试模式下从智能片段进行调试并查看消息。
我有一个跟进问题。单击SPI闪存程序员中的Connect按钮,究竟是什么作用?单击“连接”按钮未下载UART程序员,直到按下电路板上的重置按钮。因此,SPI闪存程序员和电路板或580 FW之间不应该有任何握手。那么按下重置按钮确实是什么?我确实注意到SPI Flash程序员在重置按钮时打印出“重置检测到的”消息,然后下载UART程序员。在此之后,可以从SPI Flash程序员行使闪存读/写/擦除功能。
我问这个问题的原因是,我可以模仿我的自定义UI中的过程,以防我应该编码任何握手。SPI Flash程序员在按下电路板上的重置按钮时会返回何种内容以触发它以下载数据闪存?
谢谢,
——潘文凯
嗨kqtrinh,
智能片段工具请求击中复位按钮,以使580被重置,以便bootrom的代码将开始执行,然后智能段将赶上0×02标记的下载程序的UART部分在引导程序emmits(STX发射)。当智能跟踪代码段,它知道一个复位应用和uart_programmer被donwloaded到580。
谢谢mt_dialog.
嗨太,
它真的是0x02值的1字节从ROM代码发出吗?在按下重置按钮后,我尝试从UART行上的主机侧读取1个字节。每秒循环10次10次,仍然没有。BAUK率和物品是否需要在主机上同步,并且在此事务可以读取来自UART行之前的引导代码中的预期值?
谢谢,
——潘文凯
嗨kqtrinh,
在AN-B-001中描述了启动过程和580重置后传输的内容,是的,STX字符是580在扫描UART端口时发送的数据之一。请检查文档,因为启动程序的引脚是固定的,而且每个引脚对在不同的波特率下工作。如果你的外部MCU没有相同的波特率,它将无法跟踪STX字节。
谢谢mt_dialog.
嗨太,
所以我遵循AN-B-001文件表5的文件,特别是为从我的自定义Flash UI下载uart程序的握手协议。
- 我能够在随机继电器中获得0x02(有时我能在按下重置按钮后1秒后得到它。其他时候我几秒钟后才)
- I然后送到3个字节到ROM代码 - 与LSB和UART程序员字节流的MSB的SOH
- 在等待ACK = 0x06或NACK = 0x15的循环中旋转。我完全没有回来了(我开始想知道文件仍然有效)。所以因为这个,我现在被困在没有能够向UART程序员下载到处理闪存擦除/读/写的。
然而,因为这是我的UI,而不是SmartSnippets,我可以绕过下载UART程序员到580之前,我可以开始锻炼闪光灯功能。所以,我使用Keil的调试器来下载UART程序员,并让它运行。当时我能够检查我们的闪存擦除/读/你提供我在UI编写了和它的工作就像一个魅力写消息协议。
你认为你可以帮助我做腿部工作运行启动代码和SPI Flash程序员通过逻辑分析仪?
谢谢,
——潘文凯
顺便问一下,我使用57.6kbps的p0_4和p0_5以57.6kbps的讨论。此引脚配置与我用作基线的DSP应用程序FW中的相同。它也是Flash Programmer从SmartSnippet中下载所需的UART配置。
谢谢,
——潘文凯
嗨kqtrinh,
请在UART上附加下载Flash Programmer序列。
谢谢mt_dialog.
这个文件的格式是什么?似乎是二元的。如何看待它?
谢谢,
——潘文凯
嗨kqtrinh,
这是一个。logicdata文件,你可以用saleae Logic 1 2 3软件打开这个文件。
谢谢mt_dialog.
太,
感谢您的日志文件。我下载了Saleae软件,能够看到数据。AN-B-001文件正确地描述了协议。
现在我开始怀疑,如果我的板J4跳线配置是错误的(即:只能下载代码,因为我可以和不能收到反馈从板的串行线。)我必须咬紧牙关,用逻辑分析仪查看协议。
附加是我当前的580 J4配置的快照。中间的2个黄色电线是连接UART闪存编程的3针跳线,而P0_4跳线适用于UART串行控制台输出。
在您的帮助下,您能否告诉我在哪里放置测试导致捕获SPI闪存程序员与您发送给我的引导代码之间的协议流量?
谢谢,
——潘文凯
对不起,图片附呈。请检查我的J4配置的图片,看看您是否有建议,以防它是错误的。
嗨kqtrinh,
下载代码时的流量(UART_FLASH_PRIGHIGGR)在引脚P04和P05处,ATMEL处理器的RX和TX也充当JLINK。之后,如果您想观看SPI交易,您需要探测线索和MOSI(CLK和CS以解释数据)。默认情况下,智能片段的默认状态默认行为P05(MISO)/ P06(MOSI)/ P00(CLK)/ P03(CS)。板的配置似乎正常。
谢谢mt_dialog.
嗨太,
我得到了逻辑8,并试图用它来听SPI闪存编程器和580没有成功之间的协议流量。下面是我的步骤:
请看附件中测试引线下的电路板图像。
1.如图所示,对UTX和URX引脚使用逻辑8通道0和通道1线。将通道0和通道1的黑线接地到USB连接器上,如图所示
2.在逻辑申请SW中,为两个串行通道创建两个串行分析仪,并将其设置为576000波兰特
3.在SPI Flash程序员,单击连接按钮
4.单击Logic 8应用程序中的Start按钮以启动捕获
5.按下板上的重置按钮
6. UART程序员下载
有没有记录在逻辑8应用程序,你送我出了什么协议流量。任何帮助,将不胜感激。
谢谢,
——潘文凯
嗨kqtrinh,
我猜你想探测URX和UTX线以检查下载过程,从附件的图片中我可以看到你已经在P04上连接了两个分析仪探头(我无法从图片中理解)。您必须探测P04和P05(两个UART引脚)。我也认为576000是个打印错误。
将分析器的触发器设置在您所设置的其中一条线路上,以便在线路传输时开始捕捉,而且对分析器来说,一个接地就足够了。
谢谢mt_dialog.
嗨太,
所以我想我不确定p0_5那么。P0_4在电路板上标记,而无法看到P0_5。我猜测P0_5引脚是来自P0_4的一个。从图片中,您可以看到我在P0_4上有测试导线,并且在跳线下方从其右侧的另一个测试引线。我总是在印象中,从P0_4标签跨越PIN,是P0_5引脚。
如果你不介意,你能拍一张你的板和测试引脚的照片吗?
谢谢,
——潘文凯
嗨kqtrinh,
请查看正确的连接附件。
谢谢mt_dialog.