跳过主要内容

定制闪存驱动器DA14695

da1469x.

1年前

定制闪存驱动器DA14695

发布的aectaan0点 8回复
0旋转

嗨对话小组,

目前,我试图把,我的定制电路板的基础上,DA14695。当我在调试模式RAM(我的应用程序,或任何从SDK的应用程序)应用程序的一切都很好。但是,当我试图将其加载到QSPI闪存,我得到这个消息

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

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

上传引导加载程序/应用程序可执行文件...
可执行文件上传。

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

在此之后,它stucks。我创造了闪存驱动器,在您的教程中所描述,重建了uartboot和cli_programmer我的主机配置(DA1469X-00_Release_static_linux)能否请您核实连接驱动器和.xml?

/ ** * \ addtogroup pla_bsp_system * \ {* \ addtogroup pla_memory * * * {* / / ** ******************************************************************************************************** * * @file qspi_adesto.h * * @brief qspi flash驱动程序for adesto flashes  - 常见代码* **************************************************************************************** * / #ifndef _qspi_adesto_h_ #define _qspi_adesto_h_ #define adesto_id 0x1f #include“qspi_common.h”#define at25sl_write_enable 0x06 #define at25sl_write_enable_for_volatile 0x50 #define at25sl_write_disable0×04的#define AT25SL_READ_STATUS_REGISTER1 0x05中的#define AT25SL_READ_STATUS_REGISTER2 0x35的#define AT25SL_WRITE_STATUS_REGISTER1 0×01的#define AT25SL_WRITE_STATUS_REGISTER2 0X31的#define AT25SL_READ_DATA×03的#define AT25SL_FAST_READ_DATA 0x0B中的#define AT25SL_PAGE_PROGRAM 0×02的#define AT25SL_ENABLE_QPI 0x38的#define AT25SL_BLOCK_ERASE_4KB为0x20的#define AT25SL_BLOCK_ERASE_32KB 0×52的#define AT25SL_BLOCK_ERASE_64KB 0xD8的#define AT25SL_CHIP_ERASE 0xC7#悼念NE AT25SL_ERASE_PROGRAM_SUSPEND 0x75的#define AT25SL_ERASE_PROGRAM_RESUME 0x7A的#define AT25SL_DEEP_POWER_DOWN 0xB9的#define AT25SL_RELEASE_DEEP_POWER_DOWN是0xAB的#define AT25SL_READ_DEVICE_ID 0×90#定义AT25SL_READ_JEDEC_ID 0x9F的#define AT25SL_RESET_ENABLE 0x66的#define AT25SL_RESET 0x99的#define AT25SL_ENTER_SECURED_OTP 0xB1的#define AT25SL_EXIT_SECURED_OTP 0xC1的#define AT25SL_READ_SECURITY_REG 0x2B访问的#define AT25SL_WRITE_SECURITY_REG值为0x2F的#define AT25SL_READ_SFDP_REG0x5A的#define AT25SL_FAST_READ_DUAL_OUTPUT 0x3B的#define AT25SL_FAST_READ_DUAL_IO为0xBB的#define AT25SL_READ_DEVICE_ID_DUAL 0x92的#define AT25SL_FAST_READ_QUAD_OUTPUT 0x6B的#define AT25SL_FAST_READ_QUAD_IO将0xEB的#define AT25SL_QUAD_PAGE_PROGRAM 0x33的#define AT25SL_READ_QUAD_DEVICE_ID 0x94之间的#define AT25SL_WORD_READ_QUAD_IO 0xE7的#define AT25SL_SET_BURST_WITH_WRAP 0x77的#define AT25SL_WRITE_ENABLE_QPI 0×06的#define AT25SL_WRITE_ENABLE_FOR_VOLATILE_QPI为0x50的#define AT25SL_WRITE_DISABLE_QPI 0×04#define at25sl_read_status_register1_qpi 0x05#悼念ne AT25SL_READ_STATUS_REGISTER2_QPI 0x35 #define AT25SL_WRITE_STATUS_REGISTER1_QPI 0x01 #define AT25SL_WRITE_STATUS_REGISTER2_QPI 0x31 #define AT25SL_FAST_READ_DATA_QPI 0x0B #define AT25SL_PAGE_PROGRAM_QPI 0x02 #define AT25SL_BLOCK_ERASE_4KB_QPI 0x20 #define AT25SL_BLOCK_ERASE_32KB_QPI 0x52 #define AT25SL_BLOCK_ERASE_64KB_QPI 0xD8 #define AT25SL_CHIP_ERASE_QPI 0xC7 #define AT25SL_ERASE_PROGRAM_SUSPEND_QPI 0x75 #define AT25SL_ERASE_PROGRAM_RESUME_QPI 0x7A #define AT25SL_DEEP_POWER_DOWN_QPI 0xB9 #define AT25SL_RELEASE_DEEP_POWER_DOWN_QPI 0xAB #define AT25SL_READ_DEVICE_ID_QPI 0x90 #define AT25SL_READ_JEDEC_ID_QPI 0x9F #define AT25SL_ENTER_SECURITY_QPI 0xB1 #define AT25SL_EXIT_SECURITY_QPI 0xC1 #define AT25SL_READ_SECURITY_REG_QPI 0x2B #define AT25SL_WRITE_SECURITY_REG_QPI 0x2F #define AT25SL_FAST_READ_QUAD_IO_QPI 0xEB #define AT25SL_RESET_ENABLE_QPI 0x66 #define AT25SL_RESET_QPI 0x99 #define AT25SL_DISABLE_QPI 0xFF #define AT25SL_BURST_READ_WITH_WRAP_QPI 0x0C #define AT25SL_SET_READ_PARAMETER_QPI 0xC0 #define AT25SL_QUAD_PAGE_PROGRAM_QPI 0x33 /* Suspend */ #define AT25SL_STATUS2_SUS_BIT 7 #define AT25SL_STATUS2_SUS_MASK (1 << AT25SL_STATUS2_SUS_BIT) /* QPI Enable */ #define AT25SL_STATUS2_QE_BIT 1 #define AT25SL_STATUS2_QE_MASK (1 << AT25SL_STATUS2_QE_BIT) // Flash power up/down timings #define AT25SL_POWER_DOWN_DELAY_US 3 #define AT25SL_RELEASE_POWER_DOWN_DELAY_US 3 #define AT25SL_POWER_UP_DELAY_US 10 #if (dg_configFLASH_POWER_OFF == 1) /** * \brief uCode for handling the QSPI FLASH activation from power off. */ /* * Not tested * * Delay 10usec * 0x01 // CMD_NBYTES = 0, CMD_TX_MD = 0 (Single), CMD_VALID = 1 * 0xA0 // CMD_WT_CNT_LS = 160 --> 10000 / 62.5 = 160 = 10usec * 0x00 // CMD_WT_CNT_MS = 0 * Exit from Fast Read mode * 0x09 // CMD_NBYTES = 1, CMD_TX_MD = 0 (Single), CMD_VALID = 1 * 0x00 // CMD_WT_CNT_LS = 0 * 0x00 // CMD_WT_CNT_MS = 0 * 0xFF // Enable Reset * (up to 16 words) */ const uint32_t at25sl_ucode_wakeup[] = { 0x09000001 | (((uint16_t)(AT25SL_POWER_UP_DELAY_US*1000/62.5) & 0xFFFF) << 8), 0x00FF0000, }; #elif (dg_configFLASH_POWER_DOWN == 1) /** * \brief uCode for handling the QSPI FLASH release from power-down. */ /* * Not tested * * 0x09 // CMD_NBYTES = 1, CMD_TX_MD = 0 (Single), CMD_VALID = 1 * 0x30 // CMD_WT_CNT_LS = 3000 / 62.5 = 48 // 3usec * 0x00 // CMD_WT_CNT_MS = 0 * 0xAB // Release Power Down * (up to 16 words) */ const uint32_t at25sl_ucode_wakeup[] = { 0xAB000009 | (((uint16_t)(AT25SL_RELEASE_POWER_DOWN_DELAY_US*1000/62.5) & 0xFFFF) << 8), }; #else /** * \brief uCode for handling the QSPI FLASH exit from the "Continuous Read Mode". */ /* * Not tested * * 0x25 // CMD_NBYTES = 4, CMD_TX_MD = 2 (Quad), CMD_VALID = 1 * 0x00 // CMD_WT_CNT_LS = 0 * 0x00 // CMD_WT_CNT_MS = 0 * 0x55 // Clocks 0-1 (A23-16) * 0x55 // Clocks 2-3 (A15-8) * 0x55 // Clocks 4-5 (A7-0) * 0x55 // Clocks 6-7 (M7-0) : M5-4 != '10' ==> Disable "Continuous Read Mode" * (up to 16 words) */ 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驱动程序,用于at25sl321 * *版权所有(c)2017-2019对话半导体。雷竞技电竞平台*此计算机程序包括对话半导体的机密,专有信息*。雷竞技电竞平台版权所有。* **************************************************************************************** * / #ifndef _qspi_at25sl321_h_ #define _qspi_at25sl321_h_ #ifndef adesto_id使用命令0x9F的#define AT25SL321为0x15的#ifndef AT25SL321_32Mb_SIZE的#define AT25SL321_32Mb_SIZE 0x16 #ENDIF的#include “qspi_common.h” 的#include “sdk_defs.h” 的#include的#define ADESTO_ID 0x1F的#ENDIF //设备类型 “qspi_adesto.h” 静态无效flash_at25sl321_sys_clock_cfg(hw_qspic_id id,sys_clk_t sys_clk);静态uint8_t flash_at25sl321_get_dummy_bytes(hw_qspic_id ID);静态常量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 =假,.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 =真,.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   0xa8a500eb   0x00000066   0×01 0×40 0×07   <配置名称= “W25Q32FW”> 为0x400000   0xa82000eb   0x00000066   0X31 0×02 0×07   <配置名称=”GD25LE32 “> 为0x400000   0xa82000eb   0x00000066   0×01 0×00 0×02 0×07   <配置名称=” AT25SL321" >为0x400000   0xa8a000eb   0x00000066   0×01 0×00 0×02 0×07   
<?XML版本= “1.0” 编码= “UTF-8”?>   DA1469x-00   为0x2000  为0x2000   AT25SL321  为0x400000   0xa8a500eb   0x66  为0x1为0x0 0X2 0x7的  

1年前

PM_DIALOG.

嗨aectaan,

非常感谢我们的公共论坛,蓝牙和使用我们的解决方案BLE您的问题。我已经升级了您的问题,内部的团队,所以我只要我对此有什么更新回复给你。我能问你是否有基于DA14695的产品?

谢谢,PM_DIALOG.

1年前

aectaan 0点

嗨PM_Dialog,

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

1年前

PM_DIALOG.

嗨aectaan,

谢谢你的最新消息。正如我在之前的评论中提到的,我已经在内部升级了你的问题。我会与你保持联系!

谢谢,PM_DIALOG.

接受答案!

1年前

PM_DIALOG.

嗨aectaan,

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

XML文件条目似乎是正确的,但我们不能保证它,因为我们现在不能测试它。通常,XML条目用于在Product Header中编写初始化所使用的Flash所需的适当信息,以便已经下载的固件将在引导时正确地重新初始化Flash。

2]我们发现JEDEC_ID读取信息配置错误。

预计到命令9FH返回的字节是不正确的。根据闪存数据表,第12页命令9FH返回制造商ID(0x1F的),存储器类型ID(的0x42)和容量类型ID(0x16)。在文件at25sl321.h设备ID(0×15)来代替所述存储器类型ID(的0x42)。这可能是一个事实,即闪存厂商似乎喜欢用不同的措词同样的事情经常造成混乱到驱动程序开发人员造成的。在Flash数据表旁边的每个领域,每个字节由返回指令,被提及。要做到这一点,后续的变化要做到:

#define AT25SL321 0x15 +++ #define AT25SL321 0x42

每当在引导过程中使用FLASH_AUTODETECT时,DA1469x设备将向Flash发出Read JEDEC_ID 9Fh命令。如果返回的信息与驱动程序中定义的配置对象中使用的Flash值匹配,并且包含了驱动程序,那么Flash就会被识别并加载正确的配置。这样,Flash根据驱动程序的规格进行初始化。如果返回的信息与包含的驱动程序的任何信息都不匹配,则设备将无法启动或操作。

在一般情况下,Uartboot使用FLASH_AUTODETECT默认情况下,因此将无法初始化和操作的Flash。

3根据数据表。我们还注意到一个不正确的上电延时使用。

从上电到设备准备接收命令所需的时间为1-10ms。每次DA1469x设备上电以及每次Flash设备上电时都使用此延迟。例如,如果在睡眠期间,开发人员选择了Flash关机,当它醒来时,它将不得不重新启动(例如,如果在配置文件dg_configFLASH_POWER_OFF被定义并设置为1)。

它使用的最大延迟只是为了安全起见,强烈建议。使用的值是10的驱动器,但驱动器期待在毫秒在微秒的延迟,而不是。因此,根据我们的审阅,我们认为中的#define AT25SL_POWER_UP_DELAY_US正确的值应为10000来代替。

---的#define AT25SL_POWER_UP_DELAY_US 10 +++的#define AT25SL_POWER_UP_DELAY_US 10000

flash_at25sl321_config结构中的。quad_page_program_address项应该设置为" true "。

地址是以Quad模式发送的,因此该字段的值应该为真以反映这一点。如果它被设置为“false”,那么它将尝试以单一模式发送地址,而不是导致写入错误的地址。

--- .quad_page_program_address =假,+++ .quad_page_program_address = TRUE,

5]在flash_at25sl321_get_dummy_bytes()函数中,返回值为1。根据数据表,它应该是2,除非在80 MHz下运行,而使用QPI模式,并设置了寄存器。我们怀疑返回值应该被改变,以使设备正常工作,以及值2。

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

谢谢,PM_DIALOG.

1年前

aectaan 0点

谢谢你,PM_Dialog!

你的建议大大有助于:把它们应用到我的驱动程序后,我成为无法抹去的FLASH。在那之后,我发现在我的司机解决另一个错误。现在,它的作品!

问候,Egor。

1年前

PM_DIALOG.

嗨Egor,

谢谢你接受我的回答,很高兴你能让它工作。有没有可能分享你对你的驱动做了哪些其他修改?另外,除了擦除程序之外,你有没有尝试从Flash执行固件?

任何其他输入/评论/会更受欢迎!

谢谢,PM_DIALOG.

1年前

aectaan 0点

是的,我试过用flash执行固件,没问题。

我附加了.zip与reworked qspi_at25sl321.h和flash_configurations.xml。我希望,这对其他客户有帮助。

谢谢,叶戈尔

附件 尺寸
qspi_at25sl321.zip 2.14 KB

1年前

PM_DIALOG.

嗨Egor,

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

谢谢,PM_DIALOG.