嗨
我有一个新的自定义PCB,下面的问题:UART工作(带有空闪存),但是当我尝试通过串行程序编程闪存时,我收到以下错误:
........................................................................................................................ .. ..程序QSPI .. ........................................................................................................................ . ........................................................................................................................ .. ..编程的形象 .. ........................................................................................................................版权所有(c) 2015-2019 Dialog Semiconductor使用串口COyabo国际娱乐M5,波特率57600。设置串口波特率为115200。连接到设备……上传引导加载程序/应用程序可执行文件…可执行文件上传。将串口波特率设置为57600. UartBoot上传失败:收到无效的通知消息。.................................................................................................................... ERROR: . cli_programmer.exe" has exited with code: 4294967190 . . call: "D:\smartsnippets_ws\SDK_10.0.6.88\binaries\cli_programmer.exe" --cfg C:\Users\mme\AppData\Local\Temp\tmpq9lxd8zg COM5 write_qspi 8192 C:\Users\mme\AppData\Local\Temp\tmp1y1fc9c7 ........................................................................................................................ . . ........................................................................................................................ .. .. FINISHED .. ........................................................................................................................
它说,收到了无效的通知消息。你有任何可能导致这种情况的经验吗?
我擦除闪存时也会发生同样的事。
我没有编辑CLI_Programmer oder的任何配置uartboot.bin。使用dev-kit子板它没有任何问题。
谢谢你的帮助!
设备:
嗨ethsiplab,
这种错误的最可能原因是UART没有正确读取。你能探讨UART信号并分享一个UART跟踪吗?此外,共享(如果可能)您的定制董事会的原理是非常有帮助的。如前一个论坛线程中提到,您应该使用P0_8(UART RX)和P0_9(UART TX)而不是P0_7,P0_9。您还可以在DA1469x数据表中找到表2:DA14691 / 5引脚描述。要这样做,请确保您使用正确的UART引脚?
请检查位于cli_programmer项目-> protocol_cmds.c file -> get_boot_stage(int timeout)下的get_boot_stage()函数。
函数通过轮询UART检查执行是否已达到第二个引导加载程序阶段。如果没有收到答案,那么它返回“超时等待响应”,否则它试图通过UART读取,如果它已经出于第一阶段引导加载程序(ROM Bootloader),它会检查该版本以查看它是否被支持或返回“不支持”Bootloader版本“。如果达到时间限制,它将最终以默认状态返回err_prot_unknown_response,它触发了“收到的无效公告消息”的打印
谢谢,PM_DIALOG.
你好,
谢谢您的帮助。
我用的别针是正确的,另一个输入是打错了。附上示意图的相关部分。
我还比较了TX和RX跟踪,当下载到子板(它工作)和pcb(它不工作)。在下载uartboot.bin之前,这两个板的行为完全相同。之后,与开发板相比,pcb无法发送响应。我还附加了跟踪和两层放大的缺陷区域。跟踪是从子板获取的,但pcb跟踪看起来完全相同,直到缺少响应(之后什么都没有发生)。
这能帮助你判断问题出在哪里吗?
(抱歉图片质量不好。蓝色是计算机的Tx,DA14695的红色TX)
嗨ethsiplab,
如前一个论坛帖子和通过电子邮件所讨论的,似乎您无法从UART读取正确的字节。最可能的原因可能是由于PCB问题。为此,我建议您查看PCB并检查UART迹线。
请在SmartSnippets Studio项目目录中导入cliprogrammer和libprogrammer。libprogrammer是cliprogrammer项目的一部分。如果你仔细查看libprogrammer项目的源代码,在programmer.c文件中,你会发现“invalid announcement message received”错误对应于ERR_PROT_UNKNOWN_RESPONSE定义。这个错误只会发生在get_boot_stage.c()函数中(位于协议cmds.c文件中)。这个函数在当前引导阶段读取字节。但是,它不能读取正确的字节,在switch-case语句中它将进入默认值(err = ERR_PROT_UNKNOWN_RESPONSE;)。我还建议你去看看AN-B-069: DA1469x从串行接口启动应用程序注意事项,以更好地理解启动顺序。在第5.1节中,您将发现UART字节序列应该是怎样的。
请查找附加来自逻辑分析仪的UART捕获。我正在使用3.0V的TTL UART使用我们的DA14695子板。它用默认的PXP_Reporter,Cpiprogrommer和Uartboot测试,没有任何修改,如SDK所示。捕获是在编程子板上编程SmartSnippets Studio(program_qspi_serial脚本)的编程。
另外,我不完全确定在你们的PCB中是否有任何组件将电压降至3V以下。那么,你能测量UART信号中的电压等级吗?如果它在3V以下,那么你可以给板提供一个大于3V的电源。
谢谢,PM_DIALOG.
你好,
谢谢您的回复。电压应该不是问题。电平是在3V和电路板上,我正在测试,我们甚至没有放置部件以外的MCU和所有必要的部分围绕它(帽,电感,ram,晶体)。
所以我通过逐步完成源代码,并使用示波器验证它:
这完全如表1所示的“DA1469X从串行接口启动的图2所描述的”。“,我可以按比特逐位测量它。这就是如此,之后,董事会TX线进入GND,没有任何事情再次发生。同时,主机将波特拉特设置为57600,等待Get_boot_stage()中的另一个状态更新(由protocol_cmd_upload_bootloader()调用))。它从未收到过,然后触发要在CLI_Programmer的主要功能中打印的错误消息以及要中止的整个过程。
与此相比,子板的行为完全相同(如上所述的字节值)。但是在从主机接收到ACK(2.5上方)后,电路板将此更新:0x02,0x01,0x00,0x03在较低的波特兰,然后将下载触发到闪存。
结论:对我来说,它似乎是Bootloader被加载完全正常(如表1和图2所示的“da1469x从串行interfaces引导.pdf”),但它永远不会开始执行,并不开始初始化实际程序下载到闪存。引导加载程序是否有可能访问闪存或类似的东西?我正在使用mx25u3235fzni-10g闪光灯,它应该与子板上的一个相同,只是一个不同的包装。
问候,
让我们首先看看下载到RAM的代码是否会被执行。如果发生这种情况,那么我们应该能够确定代码失败的地方。
我建议您将uartboot.bin编译为DA1469x-00_Debug,并在编译后尝试调试为-> RAM_DA1469x。通过这种方式cli_programmer将尝试将uartboot的调试版本下载到PCB的RAM中并执行代码。丢失的签名在uartboot的main()函数中很早就出现了。默认情况下,调试应该在main()函数的开始处放置一个断点,但如果您想要确定在您认为合适的地方放置一个断点。
通过这种方式,我们将首先验证uartboot main()在下载到RAM后是否执行了,然后我们可以确定在哪个函数中执行失败。
典型的事务应该如下所示:
如Uartboot Main.c文件中所述。
如果我没有弄错的话,你似乎缺少的是交易的第一步,这让我怀疑代码是否被执行了。如果是,检查它在init()上是否失败,我们应该开始检查它是否是未找到或初始化的flash。
编辑:当调试uartboot时,请在qspi_automode_init()函数上设置断点,该函数可以在{sdk_root}/sdk/bsp/memory/src/qspi_automode.c文件中找到。在到达main()之前,系统执行SystemInit(),它试图读取闪存的JEDEC id,以便为特定闪存选择正确的配置,只要它有一个驱动程序。
要在特定功能上放置断点,请单击项目,然后在调试图标旁边找到箭头并选择调试配置。选择RAM_DA1469X。一旦单击“启动”选项卡,底部的“启动”选项卡,应该有一个选中选项“设置断点”,默认值为“main”。
我希望这能缩小问题所在。
此致,
ga_dialog.
嗨
回复较晚,抱歉。我怀疑,我的闪光芯片被打破并更换了这一点,不幸的是没有解决问题。然而,令人惊讶的是,当我尝试在没有闪存的闪存芯片上编写程序时,错误是不同的。它显示在稍后与引导加载程序肯定运行的时间点(请参阅下面的控制台日志)。我还检查了范围,没有闪光灯,丢失的电路板的4字节响应即将到来。我在我的电路板上使用了MX25U3235FZNI-10G闪存芯片。
感谢您对调试的建议。虽然我已经将SWDIO和SWCLK路由到连接器,但我没有用于Serial Wire debug的兼容调试适配器(您是否推荐一个产品,我找不到一个?)我希望使用DEV-Kit的主板作为调试适配器,但这行不通。(当子板未插拔,GND, VBAT, SWDIO (P0_10), SWCLK (P0_11)外部连接时也不工作)。
这里的控制台日志没有焊接闪存芯片:
你好,
谢谢你的帮助!
我尝试了你在电话中建议我的方法:我用很短的电线将SWD连接到主板上,并分别用一根GND线将它们缠绕起来。然而,即使只是通过低比特率的GDB服务器连接,它也不能工作。当插入子板时(我可以测量SWD信号),在尝试通过电线而不是J1和J2连接器连接时,我无法测量SWDIO或SWCLK上的任何信号。是否有可能,主板甚至不发起通信时,子板没有插入?是否有其他PIN(除SWDIO,SWDCLK,GND和VBAT之外)我需要连接或拉到GND或...进行这项工作?
我已经订购了一个J-Link Segger适配器,希望很快到达,但它将很好地得到这与主板已经早些运行。
嗨ethsiplab,
作为GA_Dialog让我认识我,你今天有一个简短的电话。请尝试GA_Dialog建议您的调试过程,如果存在问题或有其他后续问题,请更新票证。
谢谢,PM_DIALOG.
嗨PM_DIALOG.
谢谢你的建议。我愿意按照上面的程序来做。然而,目前我无法从DEV-Kit主板建立到pcb(或子板)的SWD连接。我想这是能够进行任何调试过程的前提条件。这也是问题所在,那通电话是关于。GA_Dialog给出了一些关于主板和设备之间的swd连接的真正有价值的输入。
但是,正如我上面提到的那样,在将子板或PCB通过电线连接到主板时,没有SWD的通信(使用主板作为调试适配器)。因此,我的问题:当没有插入子板时,主板甚至没有启动通信吗?是否有其他PIN(除SWDIO,SWDCLK,GND和VBAT之外)我需要连接或拉到GND或...进行这项工作?
谢谢,
ethsiplab.
嗨ethsiplab,
我为我迟到的回复道歉。我还与Ga_Dialog在内部讨论过这个。如果您检查Pro母板原理图,您将找到一个名为“电压电平转换”的电路。该电路负责DA1469X和ATSAM3U2CA-CU之间的电平电压转换。在DA1469X的角度来看,M33_SWDIO / M33_SWCLK在1.8V上运行。然而,在ATSAM3U2CA-CU芯片中,SWDIO / SWCLK在3V上运行,因此需要双向电压转换。这是“电压电平转换”电路的操作。为了实现该电压转换,操作放大器(U1)应提供3伏。否则,无法建立DA1469x和ATSAM3U2CA-CU之间的连接。为此,如果您的定制板(或者当DA1469X子板从Pro-DK取消附加),要从Pro-DK中获取JTAG访问,您应该:
谢谢,PM_DIALOG.