亲爱的对话支持团队:
我正在构建一个基于DA14583 SDK 5.0.4示例代码ble_app_peripheral的项目。
我们的项目使用SPI G-Sensor和DA14583内部SPI闪光,但DA14583只有一个SPI控制器。
所以我们只能同时访问其中一个SPI设备。我们使用G-Sensor的中断引脚通知DA14583读取采样数据。
代码看起来像这样(简单):
-----------代码A --------------
wkupct_register_callback(wkup_callback);
wkupct_enable_irq(…);
void 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 ----------------
void user_custs1_ctrl_wr_ind_handler(...){
if(param->值[0] == 0x01)(将数据写入SPI Flash)
}
我想问:“wkup_callback()函数或app_easy_timer_cb()函数(在代码A)会中断user_custs1_ctrl_wr_ind_handler()函数(在代码B)的执行吗?或者SDK API将确保这些回调函数或处理函数将完全执行而不被另一个回调函数或处理函数中断(中断)?简而言之,我是否面临竞争条件?我需要添加一些同步机制吗?
非常感谢。

嗨ops,
老实说,我不能完全理解你想完成什么。当为对端设备编写控制点特征时,将触发user_custs1_ctrl_wr_ind_handler()。一旦唤醒控制器检测到唤醒中断,就会触发WKUP回调函数。如果设置计时器,将触发app_easy_timer_cb()。你能给我提供更多的信息吗?你设置好计时器了吗?另外,为什么不使用来自SPI flash驱动程序的api呢?
谢谢,PM_Dialog
嗨,PM_Dialog;
感谢您的快速回复。
1.我确实使用SPI Flash驱动程序访问内部闪存。当写入控制点特性时,我可以将一些数据保存到闪存。这项工作很好。我的代码看起来像:
void user_custs1_ctrl_wr_ind_handler(...){
GPIO_ConfigurePin(FLASH_CS_PORT, FLASH_CS_PIN, OUTPUT, PID_SPI_EN, true);
gpio_configurepin(flash_clk_port,flash_clk_pin,输出,pid_spi_clk,false);
gpio_configurepin(flash_do_port,flash_do_pin,输出,pid_spi_do,false);
gpio_configurepin(flash_di_port,flash_di_pin,输入,pid_spi_di,false);
spi_init(&spi_flash_cs_pad,spi_mode_8bit,spi_rool_master,spi_clk_dle_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-Sensor,它会产生脉冲(DA14583的外部中断)。发生此事件时,我使用WKUP回调函数从G-Sensor的缓冲区VIS界面读出所有数据。这也很好。但是,我注意到错误发生在此WKUP回调函数中的错误。似乎我在WKUP回调函数时做了太多的作品,导致某种超时!这就是为什么我正在使用app_easy_timer()来安排WKUP回调函数的一枪App_easy_timer_cb()。通过这种方式,WKUP回调函数只是进行计时器计划工作,因此它不再导致timerout了。并且真实的工作留给了App_easy_timer_cb()函数。这个策略为我工作,但如果不是批判,请纠正我!
所以,app_easy_timer_cb()看起来像:
void app_easy_timer_cb(void){
spi_init(&spi_gsensor_cs_pad,spi_mode_8bit,spi_rool_master,spi_clk_idle_pol_low,spi_pha_mode_0,spi_mint_disable,spi_xtal_div_8);
...//从SPI接口读取G-Sensor数据
}
3.问题来自Flash和G传感器使用SPI接口,DA14583只有一个SPI控制器!当我访问闪光灯时,我必须确保
GPIO_ConfigurePin(FLASH_CS_PORT, FLASH_CS_PIN, OUTPUT, PID_SPI_EN, true);
gpio_configurepin(flash_clk_port,flash_clk_pin,输出,pid_spi_clk,false);
gpio_configurepin(flash_do_port,flash_do_pin,输出,pid_spi_do,false);
gpio_configurepin(flash_di_port,flash_di_pin,输入,pid_spi_di,false);
spi_init(&spi_flash_cs_pad,spi_mode_8bit,spi_rool_master,spi_clk_dle_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,输出,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_rool_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()停止(暂停)在Point A中执行。并开始Expection App_easy_timer_cb()函数。
执行app_easy_timer_cb()后,user_custs1_ctrl_wr_ind_handler()从A点恢复执行。
-------------------------------------------------------------------
如果发生这种情况,它将使flash写失败。
或者SDK将在user_custs1_ctrl_wr_ind_handler()完成执行后执行app_easy_timer_cb() ?
谢谢。
嗨ops,
感谢您的详细反馈。让我查一下,我会尽快给您答复。
谢谢,PM_Dialog
嗨,PM_Dialog;
很高兴知道你正在研究我的问题。我期待着你的回复。
非常感谢。
嗨ops,
很抱歉回复晚了。当特征被写入时,您必须停止SPI flash的传感器事务,然后重新启动事务。两个外设同时具有SPI是不可能的。
谢谢,PM_Dialog