8 posts / 0 new
Last post
liufeng-blue
Offline
Last seen:9 months 6 days ago
Joined:2018-07-02 06:44
da14580在extend sleep模式下不工作

这边需要flash存储当前的设备名称、设备mac地址以及设备密钥,以便做修改,发现flash无法对变量进行存储,应该是我的使用方式不对,能告诉我如何在extend sleep模式下使用flash吗,另外我发现,在存储绑定信息当中,当flash无法工作的时候,我调用bond_db_store_ext()后,设备自动断开连接,应该是flash没有正常工作造成的吧,我把这句频闭后就能正常连接了。
flash初始化代码如下:
void spi_flash_peripheral_init(void)
{
spi_FLASH_CS_Pad.pin = SPI_CS_PIN;
spi_FLASH_CS_Pad.port = SPI_GPIO_PORT;
// Enable 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)
// {
// The device was not identified.
// The default parameters are used (SPI_FLASH_SIZE, SPI_FLASH_PAGE)
// Alternatively, an error can be asserted here.
spi_flash_init(SPI_FLASH_DEFAULT_SIZE, SPI_FLASH_DEFAULT_PAGE);
// }

spi_flash_release_from_power_down();

spi_cs_low();

spi_cs_high();
}
希望能尽快得到解决。
非常感谢。

Device:
CYibin
Offline
Last seen:6 months 1 week ago
Staff
Joined:2017-12-14 02:48
你好,

你好,

你的描述中包含太多情况的说明,我们先把这些情况缕清一下?

1、你的硬件环境是官方的开发板吗?如果不是,flash 型号是什么?

2、你的软件,能在官方开发板上正常运行吗?

3、不使能睡眠模式(extend sleep),当前 flash 可以读、写数据吗?

4、使能睡眠模式(extend sleep)之后,flash 是否还可以读写?

5、调用 bond_db_store_ext() 之后,设备自动断开连接,是设备死机了吗?蓝牙是否还有广播?

liufeng-blue
Offline
Last seen:9 months 6 days ago
Joined:2018-07-02 06:44
你好,CYibin

你好,CYibin
1、我使用的是自定义板子,flash信号为w25x10。

2、我使用官方的SDK5.0.4中的spi_flash例程 是能够对flash进行操作的。

3、我尝试不在睡眠模式下使用flash,发现也没有成功,应该是DSPS例程的原因,我使用DEMO板单独将flash添加在DSPS例程,将代码下在flash,初始化后清除所有flash数据,发现flash数据还在,应该是我没有正确的对flash进行操作。

可以告诉我是否在DSPS下flash被关闭了,如果是,能告诉我如何正确的在DSPS例程下对flash进行操作吗。

system_init();

spi_flash_peripheral_init();

spi_cs_low();

spi_cs_high();

// Erase flash
spi_flash_chip_erase()

void spi_flash_peripheral_init()
{
spi_FLASH_CS_Pad.pin = SPI_CS_PIN;
spi_FLASH_CS_Pad.port = SPI_GPIO_PORT;
// Enable 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)
//{
// The device was not identified.
// The default parameters are used (SPI_FLASH_SIZE, SPI_FLASH_PAGE)
// Alternatively, an error can be asserted here.
spi_flash_init(SPI_FLASH_SIZE, SPI_FLASH_PAGE);
//}
}

int8_t spi_flash_chip_erase(void)
{
uint8_t status;

if (spi_flash_set_write_enable() != ERR_OK) // send [Write Enable] instruction
return ERR_TIMEOUT;

spi_set_bitmode(SPI_MODE_8BIT);
spi_transaction(CHIP_ERASE); // Command for Chip Erase
status = spi_flash_wait_till_ready();

return status;
}

希望能尽快得到解决。
非常感谢。

CYibin
Offline
Last seen:6 months 1 week ago
Staff
Joined:2017-12-14 02:48
你好,

你好,

是否有引出 jtag 接口,通过单步调试,看 flash 操作卡在了哪一步?

liufeng-blue
Offline
Last seen:9 months 6 days ago
Joined:2018-07-02 06:44
我使用官方的板子进行调试

我使用官方的板子进行调试,发现一样在DSPS例程下无法使flash工作。
1、通过单步调试,我发现官方的spi_flash例程中,spi_flash_chip_erase()这句函数执行时间相较于DSPS例程短很多。
2,在需求方例程中,进入spi_flash_chip_erase()函数后,经常会卡在时间(GetBits16(SPI_CTRL_REG, SPI_INT_BIT) == 0); // polling to wait for spi transmission,通过单步break后,又能继续,执行很长一段时间后才能执行完spi_flash_chip_erase()。
3、spi_flash例程能够在执行完spi_flash_chip_erase()后将flash的内容全部删除,而DSPS例程毫无反应。

我在DSPS例程中添加了如下代码:

初始化flash IO口
void set_pad_functions(void) // set gpio port function mode
{

/*
* Configure application ports.
i.e.
GPIO_ConfigurePin( GPIO_PORT_0, GPIO_PIN_1, OUTPUT, PID_GPIO, false ); // Set P_01 as Generic purpose Output
*/
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);

#if (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(void)
{
sleep_mode_t sleep_mode;

//global initialise
system_init();

spi_flash_peripheral_init();

spi_cs_low();

spi_cs_high();

// Erase flash
spi_flash_chip_erase();

/*
************************************************************************************
* Platform initialization
************************************************************************************
*/
while(1)
{
do {
// schedule all pending events
schedule_while_ble_on();
}
while ((app_asynch_proc())); //grant control to the application, try to go to power down
//if the application returns GOTO_SLEEP
//((STREAMDATA_QUEUE)&& stream_queue_more_data())); //grant control to the streamer, try to go to power down
//if the application returns GOTO_SLEEP
//wait for interrupt and go to sleep if this is allowed
if (((!BLE_APP_PRESENT) && (check_gtl_state())) ||
(BLE_APP_PRESENT))
{
//Disable the interrupts
GLOBAL_INT_STOP();

app_asynch_sleep_proc();

// get the allowed sleep mode
// time from rwip_power_down() to WFI() must be kept as short as possible!!
sleep_mode = rwip_power_down();

if ((sleep_mode == mode_ext_sleep) || (sleep_mode == mode_deep_sleep)) {
//power down the radio and whatever is allowed
arch_goto_sleep(sleep_mode);

//wait for an interrupt to resume operation
WFI();

//resume operation
arch_resume_from_sleep();
}
else if (sleep_mode == mode_idle)
{
if (((!BLE_APP_PRESENT) && check_gtl_state()) ||
(BLE_APP_PRESENT))
//wait for an interrupt to resume operation
WFI();
}
// restore interrupts
GLOBAL_INT_START();
}

if (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

CYibin
Offline
Last seen:6 months 1 week ago
Staff
Joined:2017-12-14 02:48
你好,

你好,

关闭睡眠的方式不对,应该是 const static sleep_state_t app_default_sleep_mode = ARCH_SLEEP_OFF;

请尝试后回复结果

liufeng-blue
Offline
Last seen:9 months 6 days ago
Joined:2018-07-02 06:44
关闭了尝试也不行

关闭了尝试也不行,可以给我一个flash在DSPS例程下成功使用的案例嘛,flash型号为W25X10。

CYibin
Offline
Last seen:6 months 1 week ago
Staff
Joined:2017-12-14 02:48
不好意思,目前官方没有你所提的例程可供释放。若问题还没解决

不好意思,目前官方没有你所提的例程可供释放。若问题还没解决,你可向当地代理商寻求技术支持