你好
我有一个新的自定义PCB,下面的问题:UART工作(带有空闪存),但是当我尝试通过串行程序编程闪存时,我收到以下错误:
........................................................................................................................ .. ..程序QSPI .. ........................................................................................................................ . ........................................................................................................................ .. ..编程的形象 .. ........................................................................................................................版权所有(c) 2015-2019 Dialog Semiconductor Using雷竞技电竞平台 serial port COM5 at baud rate 57600。设置串口波特率为115200。连接到设备……上传引导加载程序/应用程序可执行文件...上载的可执行文件。设置串口波特率为57600。uartboot上传失败:无效的通知消息收到 . ........................................................................................................................ .错误:。 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项目下的get_boot_stage()函数 - > protocol_cmds.c文件 - > get_boot_stage(int超时)。
函数通过轮询UART检查执行是否已达到第二个引导加载程序阶段。如果没有收到答案,那么它返回“超时等待响应”,否则它试图通过UART读取,如果它已经出于第一阶段引导加载程序(ROM Bootloader),它会检查该版本以查看它是否被支持或返回“不支持”Bootloader版本“。如果达到时间限制,它将最终以默认状态返回err_prot_unknown_response,它触发了“收到的无效公告消息”的打印
谢谢,PM_DIALOG.
你好,
谢谢你的帮助。
我确实使用了正确的pin,其他条目是一个打印错误。相关部分的原理图已附呈。
我还比较了TX和RX跟踪,当下载到子板(工作)和我们的pcb(不工作)。在下载uartboot.bin之前,两块板子的行为完全相同。之后,pcb与dev-board相比较,发送响应失败。我还附加了痕迹和两级放大的缺陷区域。跟踪从子板中取出,但pcb跟踪看起来完全相同,直到这个丢失的响应(在此之后什么也没有发生)。
这能帮助你判断问题出在哪里吗?
)很抱歉照片质量很差。蓝色是计算机的TX,红色是DA14695的TX)
嗨Ethsiplab,
正如在以前的论坛帖子和电子邮件中所讨论的,似乎您无法从UART中读取正确的字节。最可能的原因可能是PCB问题。为此,我建议您检查PCB并检查UART痕迹。
请在SmartSnippets Studio项目目录中导入cliprogrammer和libprogrammer。libprogrammer是cliprogrammer项目的一部分。如果仔细查看libprogrammer项目的源代码,在program .c文件中,您会发现“收到的无效公告消息”错误对应于ERR_PROT_UNKNOWN_RESPONSE定义。这个错误只会在get_boot_stage.c()函数(位于protocol_cmds.c文件中)中发生。这个函数在当前引导阶段读取字节。但是,它不能读取正确的字节,它将在switch-case语句中进入默认值(err = ERR_PROT_UNKNOWN_RESPONSE;)。我也建议大家检查一下AN-B-069: DA1469x从串行接口启动应用程序笔记,以便更好地理解启动顺序。在5.1节中,您将看到UART字节序列应该是怎样的。
请在附件中找到从逻辑分析仪获取的UART捕获。我使用的是DA14695子板,TTL UART为3.0V。它使用默认的pxp_reporter、cliprogrammer和uartboot进行测试,没有做任何修改,就像提供的SDK一样。捕获是在编写子板时使用SmartSnippets Studio (program_qspi_serial脚本)。
此外,我并不完全确定是否有PCB中的任何组件,下降3V下的电压。所以,请您能测量UART信号中的电压电平吗?如果它不到3V,那么您可能会提供高于3V的电源电源。
谢谢,PM_DIALOG.
你好,
谢谢回复。电压不应该是一个问题。该水平在3V和电路板上,我在测试中,我们甚至没有将除MCU之外的部分和周围的所有必要部件放置(盖子,电感器,RAM,晶体)。
所以我一步一步地查看了源代码,并用示波器进行了验证:
这一切工作完全如表1和图2中描述的“DA1469x从串行接口启动。pdf”,我可以测量它与范围一点一点。只是后来董事会的TX线路变成了GND,再也不会发生什么事了。同时,主机将波特率设置为57600,并在get_boot_stage()(由protocol_cmd_upload_bootloader()调用)中等待另一个状态更新。它从来没有收到,然后触发错误消息打印在cli_programmer的主函数和整个进程被中止。
与此相比,子板的行为完全相同(与上面相同的字节值)。但是在收到主机的ACK(2.5。),板发送这个更新:0x02, 0x01, 0x00, 0x03在较低的波特率,然后触发下载到Flash。
结论:对我来说,它似乎是Bootloader被加载完全正常(如表1和图2所示的“da1469x从串行interfaces引导.pdf”),但它永远不会开始执行,并不开始初始化实际程序下载到闪存。引导加载程序是否有可能访问闪存或类似的东西?我正在使用mx25u3235fzni-10g闪光灯,它应该与子板上的一个相同,只是一个不同的包装。
问候,
让我们首先看看下载到RAM中的代码是否被执行。如果发生这种情况,那么我们应该能够确定代码在哪里失败。
我建议您构建uartboot.bin作为da1469x-00_debug,并且在编译后尝试调试 - > ram_da1469x。这样Cli_Programmer将尝试将UartBoot的调试版本下载到PCB的RAM中并执行代码。UartBoot的Main()函数的早期缺失的签名正在发生。默认情况下,调试应在Main()函数的开始时放置一个断点,但如果您想确保将其肯定放置,无论您认为这是合适的。
这样,我们将首先验证在下载到RAM后执行uartboot main(),然后我们可以确定在哪个函数中,执行失败。
一个典型的事务应该如下所示:
如Uartboot Main.c文件中所述。
如果我没有弄错的话,你似乎错过了交易的第一步,这让我怀疑代码是否被执行。如果是,检查init()是否失败,在那里我们应该开始检查是否它是没有找到或初始化的flash。
编辑:当调试uartboot时,请在qspi_automode_init()函数上放置一个断点,可以在{sdk_root}/sdk/bsp/memory/src/qspi_automode.c文件中找到。在到达main()之前,系统执行SystemInit(),它试图读取flash的JEDEC id,以便为特定的flash选择正确的配置,只要它有一个驱动程序。
要在特定功能上放置断点,请单击项目,然后在调试图标旁边找到箭头并选择调试配置。选择RAM_DA1469X。一旦单击“启动”选项卡,底部的“启动”选项卡,应该有一个选中选项“设置断点”,默认值为“main”。
我希望这个问题所在的地方缩小。
最好的问候,
GA_Dialog
你好
回复较晚,抱歉。我怀疑,我的闪光芯片被打破并更换了这一点,不幸的是没有解决问题。然而,令人惊讶的是,当我尝试在没有闪存的闪存芯片上编写程序时,错误是不同的。它显示在稍后与引导加载程序肯定运行的时间点(请参阅下面的控制台日志)。我还检查了范围,没有闪光灯,丢失的电路板的4字节响应即将到来。我在我的电路板上使用了MX25U3235FZNI-10G闪存芯片。
谢谢您提供的调试建议。虽然我已经将SWDIO和SWCLK路由到一个连接器,但我没有用于串行线调试的兼容调试适配器(您是否推荐一个产品,我找不到?)我希望使用DEV-Kit的主板作为调试适配器,但这不能工作。(拔插Daughterboard并将GND、VBAT、SWDIO (P0_10)、SWCLK (P0_11)外部连接时不工作)。
这里的控制台日志没有闪存的闪存芯片:
你好,
谢谢你的帮助!
我尝试了您在电话中向我推荐的方法:我用很短的电线将SWD连接到主板上,然后用地线将它们扭在一起。然而,它不工作,即使只是通过GDB服务器连接与低比特率。虽然插入子板时同样的事情也能工作(在这种情况下我可以测量SWD信号),但当试图通过电线而不是J1和J2连接器连接时,我不能测量SWDIO或SWCLK上的任何信号。是否有可能,当子板没有插入时,主板甚至不发起通信?是否有其他引脚(除了SWDIO, SWDCLK, GND和VBAT)我需要连接或拉到GND或…为了让这一切顺利?
我已经订购了一个J-Link Segger适配器,希望很快到来,但很高兴能够使用主板更早地跑步。
嗨Ethsiplab,
GA_Dialog告诉我,你今天的电话很短。请尝试GA_Dialog建议您的调试程序,然后更新票券,如果问题存在或如果您有任何其他后续问题。
谢谢,PM_DIALOG.
嗨PM_Dialog
谢谢你的建议。我很乐意遵循上面的程序。但是,目前我无法从Dev-kit主板到我的PCB(或Daugtherboard)建立SWD连接。我猜,这是能够做任何调试过程的预先遗传。这也是问题,电话是关于这个问题。Ga_Dialog对主板和设备之间的SWD连接提供了一些非常有价值的输入。
然而,正如我上面提到的,当通过电线连接子板或我的pcb到主板(使用主板作为调试适配器)时,没有通过SWD进行通信。因此我的问题是:是否有可能,当子板没有插入时,主板甚至不发起通信?是否有其他引脚(除了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.