我们需要编写一个类似于SmartSnippets的spi flash编程的spi flash程序员。
原因是我们想要一个Flash编程UI,它可以自动化一些事情,而不需要用户知道Flash每个区域的偏移地址,除了DA应用程序FW之外,还应该存储哪些数据。对于SS,用户必须知道偏移地址位置,才能为FW消费闪存特定数据段。
那么,,
1.在我们的自定义UI中编写SPI Flash编程SS的子集需要什么?
2.SS SPI闪存编程和jtag_程序员之间的协议是什么?
谢谢
——潘文凯
设备:

嗨,克特林,
1.flash_programmer项目接受一系列命令(你可以在programder .c文件中找到这些命令),所以当你按下连接按钮(和程序员fw下载
将这些命令通过UART或via JTAG发送到您的580)Smart Snippets UI。所以在“它需要什么”的问题中,你需要定义更多的命令
flash_编程器并实现相应的功能。
2.闪存编程器的协议没有文档记录,UART和JTAG的协议大不相同。通常,设备使用请求/响应方案交换数据。UART下的智能代码段发送的消息遵循以下结构。
因为这不是记录和没有一个可用的应用程序注意在创建工具(作为)写一个自定义应用程序的最好方法是调查两个设备之间的通信通过逻辑分析仪来捕获和复制在您的应用程序的命令。
谢谢你的对话
谢谢太。
在programming .c中,看起来USE_UART标志在项目中的任何地方都没有定义。这个标志是否与您所说的UART模式相对应?
在SS Studio中,当点击SmartSnippets工具箱图标按钮来启动它时,它会显示一个对话框供用户选择UART或JTAG模式。我的理解是,为了能够flash新的FW到SPI flash,用户必须选择JTAG模式,并跳过J4头作为SPI,以便SS可以读/写/擦除SPI flash。我可以选择UART模式和运行SPI Flash程序员写新的FW,而J4头跳作为SPI?
我已经测试了这两种情况,只有JTAG/SPI J4头选择适合我。至于UART/SPI J4报头选择,我收到一条消息“请按主板上的HW重置按钮开始下载过程”,然后我按下按钮,它说检测到重置。之后,所有与SPI闪存相关的按钮(功能)均灰显。
我之所以提出这个问题,是因为我试图理解什么是有效的,并将在自定义Flash UI中模拟它。如果JTAG模式是唯一可以访问SPI闪存的模式,SS如何在用户选择JTAG无线电时检测JTAG连接?为了清晰起见,我附上一张快照图片。
谢谢
——潘文凯
嗨,克特林,
是的,USE_UART标志将程序员设置为UART模式(您可以从Keil的下拉框更改该选项,以便为programmer_uart而不是programmer_jtag构建程序)。
打开SS时出现的对话框用于选择要编程的设备和SS之间的通用接口,而不仅仅是闪存。因此,您可以选择UART模式来编程闪存,但这需要额外的跳线配置,您必须在SPI配置中设置跳线,还需要P04引脚跳线,并将P05与UART引脚和SPI引脚(三向跳线)连接。
谢谢你的对话
太,
谢谢你的解释。
在SS Studio中,我刚刚意识到SS会在选择JTAG时自动选择jtag_programmer.bin,选择UART时自动选择flash_programmer.bin。因此,当选择UART时,USE_UART标志将变为true。
我的问题是,当选择JTAG单选按钮时,会选中一个数字为480056116的复选框。学生如何从何处获取/读取此数字?这是我的自定义UI需要做的部分。你能帮我看看SS源代码,让我知道它是如何找到JTAG连接的吗?JTAG模式是我们希望为自己的定制硬件提供支持的模式。
谢谢
——潘文凯
太,
如果你不介意,你能给ACTION_WRITE和ACTION_ERASE的协议格式,就像你给ACTION_READ的一样吗?这就是我的自定义UI所需要的。
谢谢
——潘文凯
太,
是计算字节流的CRC32从还是仅仅从数据?
谢谢
——潘文凯
太,
是从操作码(8位)|地址(32位)|长度(16位)|数据计算字节流的CRC32还是仅从数据计算?
谢谢
——潘文凯
嗨,克特林,
我没有Smart Snippets的源代码,但我怀疑SS使用segger工具和J-lInk指挥官来检查这一点。
UART请求和响应的写和擦除操作的协议如下。
CRC仅为消息部分计算,这意味着OpCode - Address - Length - Data
谢谢你的对话
嗨太,
您一直提到上面的flash读/写/擦除请求的格式是针对UART连接的,对JTAG连接来说不是同样的吗?如果没有,那么能否也提供JTAG的flash功能?
谢谢
——潘文凯
太,
ERASE的格式看起来是错误的。我说,因为flash_programmer不需要知道地址和长度的字节在flash中被擦除?协议消息不包含这些。你能澄清一下吗?在我的DA应用FW中,我为不同的数据定义了flash中的其他区域,因此它们需要被更新或删除。
谢谢
——潘文凯
嗨,克特林,
在JTAG模式下,功能有点不同(该工具直接以固定地址访问580的内存,以便与580通信),程序员定义了基本内存和命令的相应偏移量以及数据的目标内存,因此该协议与uart有点不同。例如,JTAG的读闪存用于基本_内存地址和目标_内存地址:
用于写在JTAG上
对于擦除JTAG:
我之所以提到UART,是因为我认为连接分析仪和跟踪两个设备(580和Smart Snippets工具)之间的通信更容易,因为正如我提到的allready,没有任何文档,所以我正在做完全相同的事情,以便报告协议。在UART行中,我看不到擦除过程的其他标题,您可以连接分析仪并验证它,但智能代码段向SPI发出擦除命令,它不会写入0xFF以擦除它。我想您想要的是SPI_ERASE_块命令/响应,而不是SPI_ERASE,即:
谢谢你的对话
嗨太,
非常感谢你为我做了这些肮脏的工作来获取读/写/擦除的消息协议。我非常感谢你的支持。
所以,按照你的指导方针来生成发送到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 (pher_setup .h)
port_sel = UART_PIN_PAIR;
# endif
嗨,克特林,
是的,你可以把程序员加载到580中。您可以连接到智能代码段(打开智能代码段,转到flash programmer选项卡,点击connect按钮以激活智能代码段)。然后打开flash_程序员项目,编译并下载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对由标准波特率分配)。
谢谢你的对话
太,
谢谢你的信息。所以在Keil中,我将优化选项设置为0表示不进行优化,这样我就可以逐步通过代码并设置断点。当我选择这个选项并重新编译代码时,我得到了以下错误:
*** Using Compiler 'V5.06 update 3 (build 300)', folder: 'C: Development\Embedded\Keil\ARM\ARMCC\Bin'
构建目标“程序员”jtag
编译crc32.c。。。
编译system_CMSDK.c……
编译外围设备.c。。。
编译otpc.c。。。
编译uart.c……
编译i2c_eeprom.c……
编译spi_flash.c……
编译spi.c……
编译gpio.c……
编译程序员c。。。
链接。。。
.\Out\u jtag\jtag\u programmer.axf:错误:L6406E:执行区域中没有与.spi.o(.text)匹配的任何选择器的空间。
.\Out\u jtag\jtag\u programmer.axf:错误:L6406E:执行区域中没有与.o peripherals.o(.text)匹配的任何选择器的空间。
\ Out_jtag \ jtag_programmer。axf:错误:L6406E:执行区域没有空间与。any选择器匹配otpc.o(.text)。
.\Out\u jtag\jtag\u programmer.axf:错误:L6406E:执行区域中没有与.u 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\u jtag\jtag\u programmer.axf:错误:L6406E:执行区域中没有与.memcpya.o(.text)匹配的任何选择器的空间。
\ Out_jtag \ jtag_programmer。axf:错误:L6406E:执行区域没有空间与。any选择器匹配memset .o(.text)。
.\Out\u jtag\jtag\u programmer.axf:错误:L6406E:执行区域中没有与.startup\u cmsdk\u 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
我该如何克服这个问题?
谢谢
——潘文凯
嗨,克特林,
使用-O1优化和灰色断点的原因是您正在构建jtag_programmer而不是uart_programmer。如前所述,您不能在jtag上运行jtag_programmer(调试数据和实际数据是在同一个接口上传输的)。因此,从下拉框从programmer_jtag切换到programmer_uart,您将能够运行和调试代码。如果你要使用-O0,你也会得到一个错误。
程序员并不表示“状态”的弗兰克-威廉姆斯这样的大小(当你意识到当减少优化你的水平增加的代码将运行在单片机)所以你生产太多的数据和当前的弗兰克-威廉姆斯不是构建对于这种使用(程序员本身很小但加载弗兰克-威廉姆斯的缓冲区聪明的片段,这是作为一个整体形象,所以弗兰克-威廉姆斯占地面积从sysram到0 0 x20000000 x2200抵消增加优化时,生成的代码超过限制,当链接器试图将保存那数据的缓冲区地址0 x20002200会失败)。如果您坚持在-O0优化中编译代码,您可以尝试将偏移量增加到0x20002800,但我不能预测这方面的任何问题,如果有任何问题,从一些快速测试中,我可以看到工具运行正常。
谢谢你的对话
谢谢你的指导。我现在可以使用-O1构建。然后我得到了这个错误:
*** Using Compiler 'V5.06 update 3 (build 300)', folder: 'C: Development\Embedded\Keil\ARM\ARMCC\Bin'
重建目标“程序员\u uart”
组装startup_CMSDK_CM0.s……
编译system_CMSDK.c……
编译crc32.c。。。
编译外围设备.c。。。
编译otpc.c。。。
编译uart.c……
编译i2c_eeprom.c……
编译spi_flash.c……
编译spi.c……
编译gpio.c……
编译程序员c。。。
链接。。。
程序大小:代码=6584 RO数据=240 RW数据=1040 ZI数据=33608
FromELF:创建hex文件…
生成后-用户命令#1:fromelf--bincombined--output=“.\Out\uart\flash\u programmer.bin”。\Out\uart\flash\u 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信息:已选择设备“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
序列号: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 Info: ROMTbl 0 [0]: FFF0F000, CID: B105E00D, PID: 000BB008 SCS
*JLink Info:ROMTbl 0[1]:FFF02000,CID:B105E00D,PID:000BB00A DWT
*JLink Info:ROMTbl 0[2]:FFF03000,CID:B105E00D,PID:000BB00B FPB
ROMTableAddr=0xE00FF000
目标信息:
------------
设备:ARMCM0
VTarget = 3.300 v
引脚状态:
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完成
嗨,克特林,
转到“目标选项”,选择“实用工具”选项卡,在该选项卡中选择“使用外部工具进行Flash编程”。
谢谢你的对话
嗨太,
感谢您的指导,帮助我调试UART程序员。我现在能够在调试模式下调试并查看来自智能代码段的消息。
我有一个后续问题。在SPI Flash编程器中单击“连接”按钮时,这到底是做什么的?点击连接按钮直到按下电路板上的重置按钮,才下载uart编程器。因此,SPI闪存程序员和主板之间不应该有任何握手或580 FW发生。那么按下重置按钮到底是做什么的呢?我注意到SPI Flash程序员在按下重置按钮时打印出一条“Reset Detected”(重置检测)消息,然后UART程序员将被下载。在此之后,可以从SPI闪存编程器执行闪存读/写/擦除功能。
我问这个问题的原因是,我可以在我的自定义UI中完全模拟这个过程,以防有任何我应该编写的握手。按下电路板上的重置按钮触发SPI闪存程序员下载数据闪存时,SPI闪存程序员得到了什么回报?
谢谢
——潘文凯
嗨,克特林,
Smart Snippets工具请求按下复位按钮,以便对580进行复位,使引导程序代码开始执行,然后Smart Snippets将捕获引导加载程序在下载过程的UART部分(STX传输)期间发出的0x02标记。当Smart Snippets跟踪它时,它知道应用了重置并将uart_programmer下载到580。
谢谢你的对话
嗨太,
它真的是从ROM代码发出的0x02值的1字节吗?在按下重置按钮后,我尝试从UART线路的主机端读取1个字节,但没有得到任何结果。每秒钟循环10次,但仍然一无所获。波特率和其他数据是否需要在主机上同步?在从UART线路读取此事务之前,启动代码中预期的内容是什么?
谢谢
——潘文凯
嗨,克特林,
在AN-B-001中描述了启动过程和580重置后传输的内容,是的,STX字符是580在扫描UART端口时发送的数据之一。请检查文档,因为启动程序的引脚是固定的,而且每个引脚对在不同的波特率下工作。如果你的外部MCU没有相同的波特率,它将无法跟踪STX字节。
谢谢你的对话
嗨太,
所以我遵循AN-B-001文件表5的文件,特别是为从我的自定义Flash UI下载uart程序的握手协议。
-我能够在随机继电器中获得0x02(有时我能够在按下重置按钮后1秒后获得它。其他时间我在几秒钟后获得它)
-然后我发送3个字节的ROM代码-与LSB和MSB的UART程序员字节流的SOH
-在循环中旋转,等待ACK=0x06或NACK=0x15返回。我什么也没得到(我开始怀疑文件是否仍然有效)。因此,我现在无法继续使用UART程序员下载来处理闪存擦除/读/写。
但是,因为这是我的UI而不是SmartSnippets,所以在开始使用flash函数之前,我可以绕过将UART程序员下载到580。因此,我使用Keil调试器下载UART程序并让它运行。然后我可以检查你提供的Flash擦除/读/写消息协议,我在我的UI中编写的,它工作得很好。
你认为你可以帮助我做腿部工作运行启动代码和SPI Flash程序员通过逻辑分析仪?
谢谢
——潘文凯
顺便说一句,我正在以57.6Kbps的波特率使用P0_4和P0_5,因为该引脚配置与我用作基线的DSPS应用程序FW中的相同。它也是flash程序员从SmartSnippets下载所需的UART配置。
谢谢
——潘文凯
嗨,克特林,
请参阅随附的通过UART下载flash编程器序列。
谢谢你的对话
这个文件的格式是什么?似乎是二元的。如何看待它?
谢谢
——潘文凯
嗨,克特林,
这是一个。logicdata文件,你可以用saleae Logic 1 2 3软件打开这个文件。
谢谢你的对话
太,
感谢您的日志文件。我下载了Saleae软件,能够看到数据。AN-B-001文件正确地描述了协议。
现在我开始怀疑,如果我的板J4跳线配置是错误的(即:只能下载代码,因为我可以和不能收到反馈从板的串行线。)我必须咬紧牙关,用逻辑分析仪查看协议。
附件是我当前580 J4配置的快照。中间的2根黄线是连接UART闪存编程的3针跳线,而P0E4跳线则用于UART串行控制台输出。
在您的帮助下,您能告诉我在哪里放置测试引线以捕获SPI Flash程序员和您发送给我的引导代码之间的协议通信吗?
谢谢
——潘文凯
对不起,图片附呈。请examine the picture of my J4 config to see if you have suggestions in case it's wrong.
嗨,克特林,
下载代码时的流量(UART_flash_programmer)位于引脚P04和P05, ATMEL处理器的RX和TX也充当jlink。之后,如果您希望观察SPI事务,您需要探测MISO和MOSI线(为了让分析器解释数据,CLK和CS)。默认情况下,智能片段的默认行是P05 (MISO) / P06 (MOSI) / P00 (CLK) / P03 (CS)。单板的配置似乎没问题。
谢谢你的对话
嗨太,
我得到了逻辑8,并试图使用它来侦听SPI Flash程序员和580之间的协议流量没有成功。以下是我的步骤:
请看附件中测试引线下的电路板图像。
1.如图所示,对UTX和URX引脚使用逻辑8通道0和通道1线。将通道0和通道1的黑线接地到USB连接器上,如图所示
2.在逻辑应用软件中,为两个串行通道创建两个串行分析仪,并将它们都设置为576000波特率
3.在SPI Flash程序员,单击连接按钮
4.单击Logic 8应用程序中的Start按钮以启动捕获
5.按下电路板上的重置按钮
6.下载UART编程器
在你发给我的逻辑8应用程序中没有记录协议流量。任何帮助都将不胜感激。
谢谢
——潘文凯
嗨,克特林,
我猜你想探测URX和UTX线以检查下载过程,从附件的图片中我可以看到你已经在P04上连接了两个分析仪探头(我无法从图片中理解)。您必须探测P04和P05(两个UART引脚)。我也认为576000是个打印错误。
将分析器的触发器设置在您所设置的其中一条线路上,以便在线路传输时开始捕捉,而且对分析器来说,一个接地就足够了。
谢谢你的对话
嗨太,
所以我想我不确定P0_5在哪里。P0_4标记在板上,而P0_5不可见。我猜P0_5引脚是P0_4的对面。从图中,您可以看到,我的测试引线位于P0_4上,另一条测试引线位于跳线正下方的引脚上。我一直认为,从P0_4标签上穿过的引脚就是P0_5引脚。
如果你不介意,你能拍一张你的板和测试引脚的照片吗?
谢谢
——潘文凯
嗨,克特林,
请查看附件是否有正确的连接
谢谢你的对话