嗨对话团队,
目前,我正在尝试打开基于DA14695的定制板。当我在RAM模式下调试应用程序(我的应用程序,或者SDK中的任何应用程序)时,一切都很好。但是当我试图加载它到QSPI Flash时,我得到了这个消息
cli_programmer 1.26
版权所有(c) 2015-2019 Dialog雷竞技电竞平台 Semiconductor
引导程序文件没有指定,使用内部uartboot.bin
上传引导装载程序/应用程序可执行文件...
可执行文件上传。
写地址:0x00002000偏移量:00000000块大小:0x00002000
在那之后,它就固定下来了。我创建了flash驱动程序,如您的教程中所述,为我的主机配置重建了uartboot和cli_programmer (DA1469X-00_Release_static_linux),您能验证附件中的驱动程序和.xml吗?
/***********************************************************************************************************************************************************中国组解放军军队军队军队军队军队军队军队军队军队军队军队军队军队军队军队军队军队军队军队的BSP中国军队军队军队军队军队军队的BSP P中国系统系统的一个系统的一个BSP P P P P P P P P P P P中国军队军队军队军队军队军队军队的系统的一个系统的一个中国系统的系统的一个存存务务务务务务务务务务务务务务务务系统。系统*********************************************************************上学上学上学上学上学上学上学上学上学上学上学上学上学中国组组解放军军军队军队军队军队军队军队军队军队军队军队军队军队军队军队军队军队军队军队军军军军军军军军军军军军军军军军军军军军军军军军************************************************************************************/#定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,包括,包括,包括“普通的QSPI。H”,包括,包括,包括,包括,包括“普通的QSPI。H”,定义,定义,定义,定义,定义,定义,定义,定义,定义,书写,写写(写)写(写)写)写(写)写(写)启用)易挥发的易易易挥发的0x50 0x50(易易挥发的0x50)的0x50;定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义AT25SL写(写)写(写)写(写)写)和禁用。禁用。禁用0x04。禁用。禁用。禁用。0x04。禁用。4 4。4。禁用。4。4。4。4。4。4。4。4。4。4。4。4。4。4。4。4。4。4。4。4。4_寄存器1 0x01#定义定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写,书写U擦除\程序\挂起0x75#定义AT25SL擦除程序恢复0x7A定义AT25SL深度断电0xB9定义AT25SL释放深度断电0xAB定义AT25SL读取设备ID 0x90定义AT25SL读取ID 0x9F定义AT25SL复位启用0x66定义AT25SL安全复位0x99定义AT25SL读取设备ID 0x90定义AT25SL读取ID 0x9F定义AT25SL复位安全退出定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,阅读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读,读u四元页面_程序0x33#定义定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,定义,测试,测试,设置,设置,设置,设置,设置,设置,设置,设置,设置,设置,设置,设置0x35#定义描述描述描述写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写写数据写写写写写写写读读读读读读读读读数据写写写写写写写写写数据写写写写写写写写数据写写写写数据写QPIQPI 0xQPI 0xQPI 0x0x0x0x0x0x00000QPI 0x0x0000000B B B。B。B。B。B。定义定义。定义。定义。定义。定义。定义。定义写写写写写写写写写写写写写写写写写写写写写写写写写状态写状态写状态写状态写状态写状态写状态写状态写状态写状态。写状态。状态。状态。状态。状态。状态。状态。状态。状态。状态。状态。_QPI 0xC7#定义定义:定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义,定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。定义。读设备设备。读设备。设备。ID。设备设备。ID。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。我方。简历。简历。简历。简历。你们们。简历。简历。简历。i 0xC1#定义定义:定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;若若若若若若若你们们禁用。禁用。禁用。若若若你们们。禁用。若若若若你们们。若若若你们们。。我。我。我。我。禁用。去年去年去年去年去年。我。去年去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。去年。。去年。#定义AT25SL四元页面程序QPI 0x33/*定义一个25SL(U)状态2.U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U定义AT25SL_通电_延时_US 10#if(dg_配置闪存_断电==1)/***\n简要说明从断电开始处理QSPI闪存激活的uCode.*/**未测试**延迟10usec*0x01//CMD\u NBYTES=0,CMD\u TX\u MD=0(单个),CMD\u VALID=1*0xA0//CMD\u WT\u CNT\u LS=160-->10000/62.5=160=10usec*0x00//CMD\u WT\u CNT\u MS=0*退出快速读取模式*0x09//CMD\u NBYTES=1,CMD\u TX\u MD=0(单个),CMD_VALID=1*0x00//CMD_WT_CNT_LS=0*0x00//CMD_WT_CNT_MS=0*0xFF//启用重置*(最多16个字)*/const uint32_t at25sl_ucode_wakeup[]={0x09000001 |((uint16)(at25sl_POWER up_up_DELAY_US*1000/62.5)&0xFFFF)<<8),0x00FF0000,}#elif(dg_configFLASH_POWER_DOWN==1)/***\n简要说明从断电开始处理QSPI闪存释放的uCode.//**未测试**0x09//CMD\u NBYTES=1,CMD\u TX\u MD=0(单个),CMD\u VALID=1*0x30//CMD\u WT\u CNT\u LS=3000/62.5=48//3usec*0x00//CMD u WT\u CNT\u MS=0*0xAB//Release Power Down*(最多16个字)*/const uint32在25sl\u-ucode唤醒时[={0xAB000009\124;((uint16\t)(at25sl-Release Power Down\u-Down\u-DELAY\ffu*1000/0x5)<62#else/***\简要说明从“连续读取模式”处理QSPI闪存退出的uCode.*/***未测试**0x25//CMD_NBYTES=4,CMD_TX_MD=2(四进制),CMD_VALID=1*0x00//CMD_WT_CNT_LS=0*0x00//CMD_WT_CNT_MS=0*0x55//0-1时钟(A23-16)*0x55//2-3时钟(A15-8)*0x55//4-5时钟(A7-0)*0x55//6-7时钟(M7-0):M5 4!='10'==>禁用“连续读取模式”*(最多16个字)*/const uint32_t at25sl_ucode_wakeup[]={0x55000025,0x00555555,};#endif static bool flash_at25sl_is_suspended(HW_QSPIC_ID id); static void flash_at25sl_initialize(HW_QSPIC_ID id); /** * \brief Enable volatile writes to Status Register bits * \details When this command is issued, any writes to any of the Status Registers of the Flash are * done as volatile writes. This command is valid only when the Write Status Register command * follows. * * \param[in] id QSPI controller id * * \note This function blocks until the Flash has processed the command. */ __STATIC_FORCEINLINE __UNUSED void flash_at25sl_wre_volatile(HW_QSPIC_ID id) { uint8_t cmd[] = { AT25SL_WRITE_ENABLE_FOR_VOLATILE }; flash_write(id, cmd, 1); /* Verify */ while (flash_is_busy(id)); } __STATIC_FORCEINLINE uint8_t flash_at25sl_read_status_register_2(HW_QSPIC_ID id) { __DBG_QSPI_VOLATILE__ uint8_t status; uint8_t cmd[] = { AT25SL_READ_STATUS_REGISTER2 }; flash_transact(id, cmd, 1, &status, 1); return status; } /** * \brief Write the Status Register 2 of the Flash * * \param[in] id QSPI controller id * \param[in] value The value to be written. * * \note This function blocks until the Flash has processed the command. No verification that the * value has been actually written is done though. It is up to the caller to decide whether * such verification is needed or not and execute it on its own. */ __STATIC_FORCEINLINE void flash_at25sl_write_status_register_2(HW_QSPIC_ID id, uint8_t value) { uint8_t cmd[] = { AT25SL_WRITE_STATUS_REGISTER2, value }; flash_write(id, cmd, 2); /* Wait for the Flash to process the command */ while (flash_is_busy(id)); } __STATIC_FORCEINLINE void flash_at25sl_enable_quad_mode(HW_QSPIC_ID id) { uint8_t status; status = flash_at25sl_read_status_register_2(id); if (!(status & AT25SL_STATUS2_QE_MASK)) { flash_write_enable(id); flash_at25sl_write_status_register_2(id, status | AT25SL_STATUS2_QE_MASK); } } __RETAINED_CODE static bool flash_at25sl_is_suspended(HW_QSPIC_ID id) { __DBG_QSPI_VOLATILE__ uint8_t status; status = flash_at25sl_read_status_register_2(id); return (status & AT25SL_STATUS2_SUS_MASK) != 0; } __RETAINED_CODE static void flash_at25sl_initialize(HW_QSPIC_ID id) { flash_at25sl_enable_quad_mode(id); } #endif /* _QSPI_ADESTO_H_ */ /** * \} * \} */
/ ** * \ addtogroup PLA_BSP_SYSTEM * \ {* \ addtogroup PLA_MEMORY * * \ {* / / ** **************************************************************************************** * * @file qspi_at25sl321.h * * @brief QSPI flash driver for the Adesto AT25SL321 * * Copyright (C) 2017-2019 Dialog Semiconductor. * This computer program includes Confidential, Proprietary Information * of Dialog Semiconductor. All Rights Reserved. * **************************************************************************************** */ #ifndef _QSPI_AT25SL321_H_ #define _QSPI_AT25SL321_H_ #ifndef ADESTO_ID #define ADESTO_ID 0x1F #endif // Device type using command 0x9F #define AT25SL321 0x15 #ifndef AT25SL321_32Mb_SIZE #define AT25SL321_32Mb_SIZE 0x16 #endif #include "qspi_common.h" #include "sdk_defs.h" #include "qspi_adesto.h" static void flash_at25sl321_sys_clock_cfg(HW_QSPIC_ID id, sys_clk_t sys_clk); static uint8_t flash_at25sl321_get_dummy_bytes(HW_QSPIC_ID id); static const qspi_flash_config_t flash_at25sl321_config = { .manufacturer_id = ADESTO_ID, .device_type = AT25SL321, .device_density = AT25SL321_32Mb_SIZE, .is_suspended = flash_at25sl_is_suspended, .initialize = flash_at25sl_initialize, .sys_clk_cfg = flash_at25sl321_sys_clock_cfg, .get_dummy_bytes = flash_at25sl321_get_dummy_bytes, .break_seq_size = HW_QSPI_BREAK_SEQ_SIZE_2B, .address_size = HW_QSPI_ADDR_SIZE_24, .page_program_opcode = AT25SL_PAGE_PROGRAM, .page_qpi_program_opcode = AT25SL_PAGE_PROGRAM_QPI, .quad_page_program_address = false, .fast_read_opcode = AT25SL_FAST_READ_QUAD_IO, .erase_opcode = AT25SL_BLOCK_ERASE_4KB, .erase_suspend_opcode = AT25SL_ERASE_PROGRAM_SUSPEND, .erase_resume_opcode = AT25SL_ERASE_PROGRAM_RESUME, .read_erase_progress_opcode = AT25SL_READ_STATUS_REGISTER1, .erase_in_progress_bit = FLASH_STATUS_BUSY_BIT, .erase_in_progress_bit_high_level = true, .send_once = 1, .extra_byte = 0xA0, .ucode_wakeup = {at25sl_ucode_wakeup, sizeof(at25sl_ucode_wakeup)}, .power_down_delay = AT25SL_POWER_DOWN_DELAY_US, .release_power_down_delay = AT25SL_RELEASE_POWER_DOWN_DELAY_US, .power_up_delay = AT25SL_POWER_UP_DELAY_US, .is_ram = false, .qpi_mode = false, .enter_qpi_opcode = AT25SL_ENABLE_QPI, .memory_size = MEMORY_SIZE_32Mb, }; __RETAINED_CODE static void flash_at25sl321_sys_clock_cfg(HW_QSPIC_ID id, sys_clk_t sys_clk) { } __RETAINED_CODE static uint8_t flash_at25sl321_get_dummy_bytes(HW_QSPIC_ID id) { return 1; } #endif /* _QSPI_W32Q32FW_H_ */ /** * \} * \} */
<配置名称= “MX25U3235F”> 为0x400000 flash_size> 0xa8a500eb flash_burstcmda_reg_value> 0x00000066 flash_burstcmdb_reg_value> 0×01 0×40 0×07 flash_write_config_command> 配置> <配置名称= “W25Q32FW”> 为0x400000 flash_size> 0xa82000eb flash_burstcmda_reg_value> 0x00000066 flash_burstcmdb_reg_value> 0X31 0×02 0×07 flash_write_config_command> 配置> <配置名称=”GD25LE32 “> 为0x400000 flash_size> 0xa82000eb flash_burstcmda_reg_value> 0x00000066 flash_burstcmdb_reg_value> 0×01 0×00 0×02 0×07 flash_write_config_command> 配置> <配置名称=” AT25SL321" >为0x400000 flash_size> 0xa8a000eb FLAsh_burstcmda_reg_value> 0x00000066 flash_burstcmdb_reg_value> 0×01 0×00 0×02 0×07 flash_write_config_command> 配置> flash_configurations>
<?xml version = " 1.0 " encoding = " utf - 8 " ?< / > < program_qspi > < product_id > DA1469x-00 product_id > < product_header > < active_fw_image_address > 0 x2000 < / active_fw_image_address > < update_fw_image_address > 0 x2000 < / update_fw_image_address > < flash_name > AT25SL321 < / flash_name > < flash_size > 0 x400000 < / flash_size > < flash_burstcmda_reg_value > 0 xa8a500eb < / flash_burstcmda_reg_value >0x66 0x1 0x0 0x2 0x7
设备:

嗨aectaan,
非常感谢您在我们的公共蓝牙论坛上提出的问题,以及您使用我们的BLE解决方案。我已经在团队内部升级了你的问题,所以我一有最新消息就会回复你。请问你们有基于DA14695的产品吗?
谢谢,PM_DIALOG.
嗨PM_Dialog,
是的,我们评估了DA14695 USB套件,决定用DA14695和SLG46826启动我们目前的项目
嗨aectaan,
感谢更新。正如我在以前的评论中提到的,我已经在内部升级您的问题。我会及时通知你的!
谢谢,PM_DIALOG.
嗨aectaan,
这是你的应用程序正确地从RAM,没有任何问题,运行正常行为。雷竞技安卓下载究其原因是因为闪存在固件从RAM只要没有成交数据从/到闪存中执行不使用。然而,当闪存操作正在对一个不正确初始化的闪存使用,它很可能会无法正常工作。请检查下面我的意见:
1] XML文件条目似乎是正确的,但我们不能保证它,因为我们不能测试它现在。一般来说,XML条目是用来写初始化闪存使用所需的正确的信息,在产品标题这样一个已经下载的固件能够正常开机重新初始化闪存。
2]我们发现,JEDEC_ID读取信息配置错误。
命令9Fh预期返回的字节数不正确。根据Flash datasheet,第12页命令9Fh返回Manufacturer ID (0x1F), Memory Type ID (0x42)和Capacity Type ID (0x16)。在25sl321.h文件中,设备ID(0x15)被用来代替内存类型ID(0x42)。这可能是因为Flash制造商似乎喜欢对同一件事情使用不同的措辞,这常常会给驱动程序开发者造成困惑。在Flash数据表的每个字段旁边,都提到了返回每个字节的指令。要做到这一点,需要做以下修改:
每当FLASH_AUTODETECT启动过程中使用,DA1469x设备会发出读JEDEC_ID 9FH命令到Flash。如果返回的信息匹配于在驱动器所定义的配置对象中使用的闪存的值和包含在驱动程序然后闪存被识别和正确的配置被加载。通过这种方式,闪光灯每驾驶员的规范初始化。如果返回的信息不匹配的任何包括驱动程序的信息,那么该设备将无法启动或操作。
通常,Uartboot默认使用FLASH_AUTODETECT,因此它将无法初始化和操作Flash。
3]根据数据表。我们还注意到使用了错误的Power Up Delay。
从开机到所需的设备准备好接收指令的时间为1-10ms。该延迟用于每DA1469x设备上,以及每一次的闪存器件具有上电供电时间。例如,如果在睡眠期间显影剂选择了闪存到断电时,它唤醒它必须被重新加电(例如,如果在配置文件dg_configFLASH_POWER_OFF被定义并设定为1)。
为了安全起见,强烈建议使用最大延迟。在驱动程序中使用的值是10,但是驱动程序期望延迟的单位是μsec而不是msec。因此,根据我们的回顾,我们认为#define AT25SL_POWER_UP_DELAY_US的正确值应该是10000。
4] flash_at25sl321_config结构的.quad_page_program_address项目应被设置为“真”。
地址在四模式发送,因此该字段的值应该是真实的反映。如果它被设置为“假”,那么它会尝试在单模发送地址,而不是这将导致写入错误的地址。
5]在flash_at25sl321_get_dummy_bytes()函数的返回值是1,根据数据表应该是2,除非在80兆赫运行时使用QPI模式并具有设定的寄存器。我们怀疑,返回值应为设备正常工作,以及为2的值被改变。
请尝试更改建议,让我知道,如果它现在的工作。您的反馈将超过欢迎!
谢谢,PM_DIALOG.
谢谢你,PM_Dialog!
您的建议帮助很大:在应用到我的驱动程序后,我可以擦除FLASH。在那之后,我发现并修正了我的司机的另一个错误。现在,它是有效的!
问候,叶戈尔。
喜叶戈尔,
感谢您接受我的答案,很高兴你得到它的工作。是否可以共享一下其他的修改已经在你的驱动程序做了什么?此外,从擦除步骤,不同的,你有没有尝试执行从Flash固件?
任何其他的输入/评论/将是非常欢迎的!
谢谢,PM_DIALOG.
是的,我试图从闪存执行固件,它的确定。
我连着.ZIP与整顿的qspi_at25sl321.h和flash_configurations.xml。我希望,这将是为其他客户很有帮助。
谢谢,Egor
喜叶戈尔,
反对感谢您的投入。如果您有任何其它问题,请提出一个新的论坛门票。
谢谢,PM_DIALOG.