自定义闪存驱动程序DA14695

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
9个员额/0个新员额
最后一篇
艾克塔安
离线
最后一次露面:6个月3周前
加入:2019-10-02 07:06
自定义闪存驱动程序DA14695

嗨,对话小组,

目前,我正在尝试根据DA14695培养我的定制板。当我在RAM模式(我的应用程序或来自SDK的任何应用程序中的应用程序时,一切都很好。但是当我试图将它加载到QSPI闪存时,我收到了这条消息

cli_programmer 1.26.
版权所有(c)2015-2019对话半导体雷竞技电竞平台

未指定引导加载程序文件,使用内部uartboot.bin

正在上载引导加载程序/应用程序可执行文件。。。
可执行文件已上载。

写入地址:0x00002000偏移量:0x00000000块大小:0x00002000

之后,它卡住了。我创建了Flash驱动程序,如您的教程中所述,重建UartBoot和CLI_Programmer为我的主机配置(DA1469X-00_RELEASE_STORATIC_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\U BSP\U系统*********\addtogroup PLA\U内存*********/**************************************************************************************************************************************************************************************************************雷竞技电竞平台**********************文件qspi at25sl321.h@Adesto(SLC)321 2017版权所有的简要驱动程序此计算机程序包含Dialog Semiconductor的机密专有信息*。保留所有权利。*********************************************************************************************************************************************************************************************************************/#本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查的结果是,本次调查是,本次调查的是,本次调查的结果是,本次调查是,本次调查是,本次调查的目的是,本次调查的目的是,本次调查的目的是,本次调查是,本次调查的目的是,本次调查的是,本次调查是,本“QSPI_ADESTO.H”静态无效闪存at25sl321系统时钟cfg(硬件系统时钟ID,系统时钟系统时钟);静态uint8闪存at25sl321获取虚拟字节(HW QSPIC ID);静态常量qspi_flash_config_t flash_at25sl321_config={.manufacturer_id=ADESTO_id、.device_type=at25sl321、.device_density=at25sl321_32Mb_SIZE、.is_suspended=flash_at25sl_暂停、.initialize=flash_at25sl_初始化、.sys_clk_cfg=flash_at25sl321_系统时钟_cfg、.get_伪字节=flash_at25sl321;伪字节,.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_程序_地址=false、.fast_读取操作码=AT25SL_快速读取_四IO、.erase_代码=AT25SL_块擦除,.erase\u suspend\u opcode=AT25SL\u erase\u PROGRAM\u suspend、.erase\u resume\u opcode=AT25SL\u erase\u progress\u opcode=AT25SL\u read\u STATUS\u REGISTER1、.erase\u in\u progress\u bit=FLASH\u STATUS\u BUSY\u位、.erase\u in\u progress\u位\u高唤醒级别=true、.send\u once\u=1、.extra\u字节=0xA0、.ucode\u\u=AT25SL\u-de\u-up={\u,sizeof(at25sl\U ucode\U wakeup)}、.power\U down\U delay=at25sl\U power\U delay\U、.release\U down\U delay=at25sl\U power\U down\U delay\U.US、.power\U delay\U=at25sl\U power\U up\U delay\U.US、.is\U ram=false、.qpi模式=false、.RENTER\qpi操作码=at25sl\U ENABLE\U ENABLE\U qpi、.memory\U size=memory\U size=memory\U size\U大小__保留代码静态无效闪存at25sl321系统时钟cfg(HW_QSPIC_ID,sys_clk_t sys_clk){}保留代码静态无效闪存at25sl321系统时钟cfg(HW_QSPIC_ID){返回1;}#endif/*\u QSPI\u W32Q32FW\u H.*/***\}*/
0x4000000xa8a500eb0x000000660x01 0x40 0x07<0x4000000xa82000eb0x000000660x4000000xa82000eb0x000000660x01 0x00 0x02 0x070x4000000xa8a000eb0x000000660x01 0x00 0x02 0x07
<?XML Version =“1.0”编码=“UTF-8”?>   da1469x-00    0x2000   0x2000   AT25SL321  为0x400000   0xa8a500eb   0x66  为0x1为0x0 0X2 0x7的  

设备:
PM_对话框
离线
最后一次露面:1天18小时前
职员
加入:2018-02-08 11:03
嗨,艾克塔安,

嗨,艾克塔安,

非常感谢您在我们的公共蓝牙论坛上的问题以及使用我们的BLE解决方案。我已经在团队内部升级了你的问题,所以我会尽快恢复给你,因为我有任何更新。我可以问你是否有基于DA14695的产品?

谢谢,下午好

艾克塔安
离线
最后一次露面:6个月3周前
加入:2019-10-02 07:06
你好,下午对话,

你好,下午对话,

是的,我们评估了DA14695 USB套件,并决定使用DA14695和SLG46826开始我们的当前项目

PM_对话框
离线
最后一次露面:1天18小时前
职员
加入:2018-02-08 11:03
嗨,艾克塔安,

嗨,艾克塔安,

谢谢你的更新。正如我在之前的评论中提到的,我已经在内部升级了您的问题。我会让你不断更新!

谢谢,下午好

PM_对话框
离线
最后一次露面:1天18小时前
职员
加入:2018-02-08 11:03
嗨,艾克塔安,

嗨,艾克塔安,

这是应用程序从RAM正常运行且没有任何问题的正常行为。原因是当固件从雷竞技安卓下载RAM执行时,只要闪存之间没有数据事务,就不使用闪存。但是,当在未正确初始化的闪存上使用闪存操作时,它很可能无法正常工作。请查看以下我的评论:

1] XML文件条目似乎是正确的,但我们不能保证它,因为我们现在无法测试它。通常,XML条目用于在产品标题中写入初始化所用闪存所需的正确信息,以便已下载的固件在引导时正确重新初始化闪存。

2] 我们发现JEDEC_ID读取信息配置不正确。

预期的命令9FH预期的字节不正确。根据Flash数据表,第12页命令9FH返回制造商ID(0x1F),内存类型ID(0x42)和容量类型ID(0x16)。在文件at25sl321.h中,使用设备ID(0x15)而不是存储器类型ID(0x42)。这可能源于闪光制造商似乎喜欢对同样的措辞使用不同的措辞,经常对驾驶员开发商造成混淆。在每个字段旁边的Flash数据表中,提到了每个字节返回的指令。为此,应执行以下操作:

---#定义AT25SL321 0x15++#定义AT25SL321 0x42

无论何时在引导期间使用FLASH_AUTODETECT,DA1469x设备都会向FLASH发出Read JEDEC_ID 9Fh命令。如果返回的信息与驱动程序中定义的配置对象中使用的闪存值匹配,并且包含驱动程序,则会识别闪存并加载正确的配置。通过这种方式,根据驾驶员的规格初始化闪存。如果返回的信息与包含的驱动程序的任何信息不匹配,则设备将无法引导或操作。

通常,UartBoot默认使用Flash_AutoDetect,因此它将无法初始化和操作闪存。

3]根据数据表。我们还注意到使用了不正确的电源延迟。

从上电到设备准备好接收命令所需的时间为1-10ms。每次DA1469x设备通电以及每次闪存设备必须通电时,都会使用此延迟。例如,如果在睡眠期间,开发人员选择在闪存唤醒时关闭其电源,则必须重新通电(例如,如果在配置文件dg_configFLASH_POWER_off中定义并设置为1)。

它强烈推荐使用最大延迟只是安全。使用的值是驱动程序中的10个,但驱动程序期望稍微延迟μEC而不是MSEC。因此,根据我们的评论,我们认为#define at25sl_power_up_delay_us的正确值应该是10000。

--- #define at25sl_power_up_delay_us 10 +++ #define at25sl_power_up_delay_us 10000

4] flash_at25sl321_配置结构的.quad_page_program_address项应设置为“true”。

地址以四元模式发送,因此此字段的值应为true以反映该情况。如果设置为“false”,则它将尝试以单一模式发送地址,这将导致写入错误的地址。

---.quad_page_program_address=false,++.quad_page_program_address=true,

5] 在flash_at25sl321_get_dummy_bytes()函数中,返回值为1。根据数据表,除非在使用QPI模式并设置寄存器时在80 MHz下运行,否则返回值应为2。我们怀疑应该将返回值更改为2,以便设备正常工作。

请尝试建议的更改,并让我知道它是否正在工作。欢迎您的反馈!

谢谢,下午好

艾克塔安
离线
最后一次露面:6个月3周前
加入:2019-10-02 07:06
谢谢你,PM_Dialog!

谢谢你,PM_Dialog!

您的建议非常有助于:将它们应用于我的司机后,我就是能够删除闪存。之后,我发现并修复了我的司机中的另一个错误。现在,它有效!

你好,伊戈尔。

PM_对话框
离线
最后一次露面:1天18小时前
职员
加入:2018-02-08 11:03
嗨,伊戈尔,

嗨,伊戈尔,

谢谢你接受我的回答,很高兴你能让它工作。是否可以分享您在驱动程序中所做的其他修改?此外,除了擦除过程外,您是否尝试从闪存执行固件?

任何其他投入/评论/会非常欢迎!

谢谢,下午好

艾克塔安
离线
最后一次露面:6个月3周前
加入:2019-10-02 07:06
是的,我试图执行

是的,我试着从flash执行固件,没问题。

我附加了修改过的qspi_at25sl321.h和flash_configurations.xml的.zip。我希望它能对其他客户有所帮助。

谢谢,Egor.

PM_对话框
离线
最后一次露面:1天18小时前
职员
加入:2018-02-08 11:03
嗨,伊戈尔,

嗨,伊戈尔,

谢谢你的投入。如果您有任何其他问题,请提出新的论坛门票。

谢谢,下午好