亲爱的对话支持团队;
我正在构建一个基于DA14583 SDK 5.0.4样例代码ble_app_peripheral的项目。
我们的项目与SPI G-Sensor和DA14583内部SPI Flash一起工作,但DA14583只有一个SPI控制器。
所以我们只能同时访问这些SPI设备中的一个。我们使用G-Sensor的中断引脚通知DA14583读取采样数据。
代码看起来像这样(简化):
-----------代码A --------------
wkupct_register_callback (wkup_callback);
wkupct_enable_irq(…);
空白wkup_callback () {
app_easy_timer_cb app_easy_timer(1日);
}
空白app_easy_timer_cb () {
(通过SPI接口访问G-Sensor读取采样数据)
}
用户通过ble特性的写操作发送命令,使系统将一些数据保存到内部SPI Flash中。
我在user_custs1_ctrl_wr_ind_handler()函数中实现了这个需求。
代码看起来像这样(简化):
-----------代码B ----------------
空白user_custs1_ctrl_wr_ind_handler(…){
if (param->value[0] == 0x01)(写入数据到SPI Flash)
}
我想问:“wkup_callback()函数或app_easy_timer_cb()函数(在代码A)中断执行user_custs1_ctrl_wr_ind_handler()函数(在代码B)?或者SDK API将确保这些回调函数或处理函数将完全执行,而不中断(中断)另一个回调或处理函数?简而言之,我是否面临竞争条件?我需要添加一些同步机制吗?
非常感谢。

嗨,运维,
老实说,我不能完全理解你想要完成什么。当为对等设备写入控制点特征时,user_custs1_ctrl_wr_ind_handler()将被触发。唤醒控制器一旦检测到唤醒中断,就会触发WKUP回调函数。如果设置了计时器,app_easy_timer_cb()将被触发。你能给我提供更多的信息吗?你设置好计时器了吗?另外,为什么不使用SPI闪存驱动程序中的api呢?
谢谢,PM_Dialog
嗨,PM_Dialog;
谢谢你的快速回复。
1.我确实使用SPI闪存驱动器访问内部闪存。在编写控制点特性时,可以将一些数据保存到flash中。这个工作很好。我的代码如下:
空白user_custs1_ctrl_wr_ind_handler(…){
GPIO_ConfigurePin(FLASH_CS_PORT, FLASH_CS_PIN, OUTPUT, PID_SPI_EN, true);
gpio_configurein (FLASH_CLK_PORT, FLASH_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(FLASH_DO_PORT, FLASH_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(FLASH_DI_PORT, FLASH_DI_PIN, INPUT, PID_SPI_DI, false);
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);
spi_flash_init (SPI_FLASH_SIZE SPI_FLASH_PAGE);
/ /点
spi_flash_block_erase (ConfigAddress SECTOR_ERASE);
spi_flash_write_data (&configData[0], ConfigAddress, sizeof(configData));
...
}
2.我有一个g传感器,它会产生一个脉冲(DA14583的外部中断),当它的缓冲区是满的。当这个事件发生时,我使用WKUP回调函数从G-Sensor的buffer vis SPI接口读取所有数据。这也很好。但是,有时我注意到在这个WKUP回调函数中会发生错误。似乎我在WKUP回调函数上做了太多的工作,导致某些类型的超时!这就是为什么我使用app_easy_timer()在WKUP回调函数中调度一次app_easy_timer_cb()。这样,WKUP回调函数只做定时器调度工作,不会再引起超时。真正的工作留给app_easy_timer_cb()函数。这个策略对我有用,但如果不合适,纠正我!
因此,app_easy_timer_cb()如下所示:
空白app_easy_timer_cb (void) {
spi_init(&spi_GSensor_CS_Pad, SPI_MODE_8BIT, SPI_ROLE_MASTER, SPI_CLK_IDLE_POL_LOW, SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);
...//从SPI接口读取G-Sensor数据
}
3.问题来自Flash和G-Sensor都使用SPI接口,而DA14583只有一个SPI控制器!当我访问Flash时,我必须确保
GPIO_ConfigurePin(FLASH_CS_PORT, FLASH_CS_PIN, OUTPUT, PID_SPI_EN, true);
gpio_configurein (FLASH_CLK_PORT, FLASH_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(FLASH_DO_PORT, FLASH_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(FLASH_DI_PORT, FLASH_DI_PIN, INPUT, PID_SPI_DI, false);
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);
spi_flash_init (SPI_FLASH_SIZE SPI_FLASH_PAGE);
在调用下面函数之前已执行。
spi_flash_write_data (&configData[0], ConfigAddress, sizeof(configData));
同样地,当我读取G-Sensor的数据时,我必须确保
GPIO_ConfigurePin(GSensor_CS_PORT, GSensor_CS_PIN, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin(GSensor_CLK_PORT, GSensor_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
GPIO_ConfigurePin(GSensor_DO_PORT, GSensor_DO_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(GSensor_DI_PORT, GSensor_DI_PIN, INPUT, PID_SPI_DI, false);
spi_init(&spi_GSensor_CS_Pad, SPI_MODE_8BIT, SPI_ROLE_MASTER, SPI_CLK_IDLE_POL_LOW, SPI_PHA_MODE_0, SPI_MINT_DISABLE, SPI_XTAL_DIV_8);
已执行。
由于G-Sensor总是连续地生成数据,它将导致定时调用WKUP回调。(在我的例子中,app_easy_timer_cb()也将被定期调用)
如果在写入控制点特性的同时G-Sensor的缓冲区满了呢?
我想知道是否会发生以下情况?
------------------------------------------------------------------
首先执行user_custs1_ctrl_wr_ind_handler()。
在这个处理函数中,
调用GPIO_ConfigurePin(…),然后调用spi_init(),然后调用spi_flash_init()。
然后在调用spi_flash_block_erase(…)函数之前(点A),触发app_easy_timer_cb()。
因此,user_custs1_ctrl_wr_ind_handler()停止(暂停)在点a执行,并开始执行app_easy_timer_cb()函数。
在app_easy_timer_cb()执行之后,user_custs1_ctrl_wr_ind_handler()从A点恢复执行。
-------------------------------------------------------------------
如果发生这种情况,它将使闪存写入失败。
或者SDK会在user_custs1_ctrl_wr_ind_handler()完成执行后执行app_easy_timer_cb() ?
谢谢。
嗨,运维,
谢谢你的详细反馈。让我查一下,我会尽快给你答复。
谢谢,PM_Dialog
嗨,PM_Dialog;
很高兴知道你在研究我的问题。期待您的回复。
非常感谢。
嗨,运维,
很抱歉回复晚了。当写入特征时,您必须停止带有SPI闪光的传感器事务,然后重新启动事务。两个外设同时具有SPI是不可能的。
谢谢,PM_Dialog