这边需要闪存储当前的设备名称,设备mac地址以及设备密钥,以便做修改,发现flash无法对变量进行存储,应该是我的使用方式不对,能告诉我如何在延长睡眠模式下使用flash吗,另外我发现,在存储绑定信息当中,当闪光无法工作的时候,我调用bond_db_store_ext()后,设备自动断开连接,应该是flash没有正常工作造成的吧,我把这句频闭后就能正常连接了。
flash初始化代码如下:
空白spi_flash_peripheral_init(空白)
{
spi_FLASH_CS_Pad。销= SPI_CS_PIN;
spi_FLASH_CS_Pad。端口= SPI_GPIO_PORT;
//启用SPI & SPI FLASH
spi_init(&spi_FLASH_CS_Pad, SPI_MODE_8BIT, SPI_ROLE_MASTER, SPI_CLK_IDLE_POL_LOW, SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);
/ / detected_spi_flash_device_index = spi_flash_auto_detect ();
// if(detected_spi_flash_device_index == SPI_FLASH_AUTO_DETECT_NOT_DETECTED)
/ / {
//设备未被识别。
//使用默认参数(SPI_FLASH_SIZE, SPI_FLASH_PAGE)
//或者,错误可以在这里断言。
spi_flash_init (SPI_FLASH_DEFAULT_SIZE SPI_FLASH_DEFAULT_PAGE);
/ /}
spi_flash_release_from_power_down ();
spi_cs_low ();
spi_cs_high ();
}
希望能尽快得到解决。
非常感谢。
你好,
你的描述中包含太多情况的说明,我们先把这些情况缕清一下?
1、你的硬件环境是官方的开发板吗?如果不是,flash型号是什么?
2、你的软件,能在官方开发板上正常运行吗?
3,不使能睡眠模式(延长睡眠),当前闪光可以读、写数据吗?
4、使能睡眠模式(延长睡眠)之后,flash是否还可以读写吗?
5,调用bond_db_store_ext()之后,设备自动断开连接,是设备死机了吗?蓝牙是否还有广播?
你好,CYibin
1,我使用的是自定义板子,闪信号为w25x10。
2,我使用官方的SDK5.0.4中的spi_flash例程是能够对闪进行操作的。
3,我尝试不在睡眠模式下使用flash,发现也没有成功,应该是需求方例程的原因,我使用演示板单独将flash添加在需求方例程,将代码下在flash,初始化后清除所有flash数据,发现flash数据还在,应该是我没有正确的对闪进行操作。
可以告诉我是否在需求方下闪光被关闭了,如果是,能告诉我如何正确的在需求方例程下对闪进行操作吗。
system_init ();
spi_flash_peripheral_init ();
spi_cs_low ();
spi_cs_high ();
/ /擦除闪存
spi_flash_chip_erase ()
空白spi_flash_peripheral_init ()
{
spi_FLASH_CS_Pad。销= SPI_CS_PIN;
spi_FLASH_CS_Pad。端口= SPI_GPIO_PORT;
//启用SPI & SPI FLASH
spi_init(&spi_FLASH_CS_Pad, SPI_MODE_8BIT, SPI_ROLE_MASTER, SPI_CLK_IDLE_POL_LOW, SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);
detected_spi_flash_device_index = spi_flash_auto_detect ();
/ /如果(detected_spi_flash_device_index = = SPI_FLASH_AUTO_DETECT_NOT_DETECTED)
/ / {
//设备未被识别。
//使用默认参数(SPI_FLASH_SIZE, SPI_FLASH_PAGE)
//或者,错误可以在这里断言。
spi_flash_init (SPI_FLASH_SIZE SPI_FLASH_PAGE);
/ /}
}
int8_t spi_flash_chip_erase(空白)
{
uint8_t状态;
if (spi_flash_set_write_enable() != ERR_OK) // send [Write Enable]指令
返回ERR_TIMEOUT;
spi_set_bitmode (SPI_MODE_8BIT);
spi_transaction (CHIP_ERASE);//芯片擦除命令
状态= spi_flash_wait_till_ready ();
返回状态;
}
希望能尽快得到解决。
非常感谢。
你好,
是否有引出jtag接口,通过单步调试,看flash操作卡在了哪一步?
我使用官方的板子进行调试,发现一样在需求方例程下无法使flash工作。
1,通过单步调试,我发现官方的spi_flash例程中,spi_flash_chip_erase()这句函数执行时间相较于需求方例程短很多。
2,在需求方例程中,进入spi_flash_chip_erase()函数后,经常会卡在时(GetBits16 (SPI_CTRL_REG SPI_INT_BIT) = = 0);/ /轮询等spi传输,通过单步打破后,又能继续,执行很长一段时间后才能执行完spi_flash_chip_erase()。
3, spi_flash例程能够在执行完spi_flash_chip_erase()后将flash的内容全部删除,而需求方例程毫无反应。
我在需求方例程中添加了如下代码:
初始化flash IO口
Void set_pad_functions(Void) //设置gpio端口功能模式
{
/*
*配置应用端口。
即。
GPIO_ConfigurePin(GPIO_PORT_0, GPIO_PIN_1, OUTPUT, PID_GPIO, false);//设置P_01为通用目的输出
*/
GPIO_ConfigurePin(GPIO_UART1_TX_PORT, GPIO_UART1_TX_PIN, OUTPUT, PID_UART1_TX, false);
GPIO_ConfigurePin(GPIO_UART1_RX_PORT, GPIO_UART1_RX_PIN, INPUT_PULLUP, PID_UART1_RX, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_CS_PIN, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(SPI_GPIO_PORT, SPI_DI_PIN, INPUT, PID_SPI_DI, false);
#如果(UART_HW_FLOW_ENABLED)
GPIO_ConfigurePin(GPIO_UART1_RTS_PORT, GPIO_UART1_RTS_PIN, OUTPUT, PID_UART1_RTSN, false);
GPIO_ConfigurePin(GPIO_UART1_CTS_PORT, GPIO_UART1_CTS_PIN, INPUT_PULLUP, PID_UART1_CTSN, false);
# endif / / UART_HW_FLOW_ENABLED
# ifdef CFG_PRINTF_UART2
GPIO_ConfigurePin(GPIO_UART2_TX_PORT, GPIO_UART2_TX_PIN, OUTPUT, PID_UART2_TX, false);
GPIO_ConfigurePin(GPIO_UART2_RX_PORT, GPIO_UART2_RX_PIN, INPUT, PID_UART2_RX, false);
# endif
}
主函数
int main_func(空白)
{
sleep_mode_t sleep_mode;
/ /全局初始化
system_init ();
spi_flash_peripheral_init ();
spi_cs_low ();
spi_cs_high ();
/ /擦除闪存
spi_flash_chip_erase ();
/*
************************************************************************************
*平台初始化
************************************************************************************
*/
而(1)
{
{做
//调度所有挂起的事件
schedule_while_ble_on ();
}
而((app_asynch_proc ()));//授予控制给应用程序,尝试去断电
//如果应用返回GOTO_SLEEP
/ / ((STREAMDATA_QUEUE) & & stream_queue_more_data ()));//将控制权授予streamer,尝试去power down
//如果应用返回GOTO_SLEEP
//如果允许的话,等待中断并进入睡眠状态
如果(((! BLE_APP_PRESENT) & & (check_gtl_state ())) | |
(BLE_APP_PRESENT))
{
/ /禁用中断
GLOBAL_INT_STOP ();
app_asynch_sleep_proc ();
//获取允许的睡眠模式
//从rwip_power_down()到WFI()的时间必须尽可能短!!
sleep_mode = rwip_power_down ();
If (sleep_mode == mode_ext_sleep) || (sleep_mode == mode_deep_sleep);
//关掉收音机和任何允许的东西
arch_goto_sleep (sleep_mode);
//等待中断恢复操作
注射用水();
/ /恢复操作
arch_resume_from_sleep ();
}
Else if (sleep_mode == mode_idle)
{
if (((!BLE_APP_PRESENT) && check_gtl_state()) ||
(BLE_APP_PRESENT))
//等待中断恢复操作
注射用水();
}
/ /恢复中断
GLOBAL_INT_START ();
}
如果(USE_WDOG)
wdg_reload (WATCHDOG_DEFAULT_PERIOD);
}
}
关闭睡眠
# undef CFG_MEM_MAP_EXT_SLEEP
# undef CFG_MEM_MAP_DEEP_SLEEP
关闭开门狗
# undef CFG_WDOG
关闭调试模式
# undef CFG_DEVELOPMENT_DEBUG
你好,
关闭睡眠的方式不对,应该是const静态sleep_state_t app_default_sleep_mode = ARCH_SLEEP_OFF;
请尝试后回复结果
关闭了尝试也不行,可以给我一个flash在需求方例程下成功使用的案例嘛,闪光型号为W25X10。
不好意思,目前官方没有你所提的例程可供释放。若问题还没解决,你可向当地代理商寻求技术支持