亲爱的对话支持团队;
我正在建设一个基于DA14583 SDK 5.0.4示例代码BLE_APP_PERITERWAL的项目。
我们的项目使用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(1,app_easy_timer_cb);
}
void app_easy_timer_cb(){
(通过SPI接口访问G-Sensor以读出采样数据)
}
用户将通过BLE特性的WRITE操作发送命令,这将使系统将某些数据保存到内部SPI闪光灯。
我在user_custs1_ctrl_wr_ind_handler()函数下实现此要求。
代码如下所示(简化):
-----------代码B ------------------
void user_custs1_ctrl_wr_ind_handler(...){
if(param->值[0] == 0x01)(将数据写入SPI Flash)
}
我想问一下:“WKUP_CALLBALL()函数或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闪存驱动程序的API?
谢谢,PM_DIALOG.
嗨,pm_dialog;
谢谢你快速的回复。
1.我确实使用SPI Flash驱动程序访问内部闪存。当写入控制点特性时,我可以将一些数据保存到闪存。这项工作很好。我的代码看起来像:
void user_custs1_ctrl_wr_ind_handler(...){
gpio_configurepin(flash_cs_port,flash_cs_pin,输出,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);
//点A.
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,输出,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);
在叫做FUCNTION之前已经执行了。
spi_flash_write_data(&configdata [0],configaddress,sizeof(configdata));
以同样的方式,当我读取G-Sensor的数据时,我必须确保
gpio_configurepin(gsensor_cs_port,gsensor_cs_pin,输出,pid_spi_en,true);
gpio_configurepin(gsensor_clk_port,gsensor_clk_pin,输出,pid_spi_clk,false);
gpio_configurepin(gsensor_do_port,gsensor_do_pin,输出,pid_spi_do,false);
gpio_configurepin(gsensor_di_port,gsensor_di_pin,输入,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 alway连续生成数据,因此它将导致周期性地调用WKUP回调。(在我的情况下,app_easy_timer_cb()也将定期调用)
如果在编写控制点特征时,以及G-Sensor的缓冲区同时满足如何?
我想知道以下是否会发生以下情况?
---------------------------------------------------------------------------------
user_custs1_ctrl_wr_ind_handler()首先执行。
在此处理程序中,
GPIO_CONFIGUREPIN(...)是呼叫,然后呼叫SPI_INIT()呼叫,然后spi_flash_init()呼叫。
然后在SPI_FLASH_BLOCK_ERASE(...)函数呼叫之前(point 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()从point a恢复执行。
---------------------------------------------------------------------------------
如果发生这种情况,它将使闪存写入失败。
或者SDK将执行app_easy_timer_cb()user_custs1_ctrl_wr_ind_handler()完成执行后?
谢谢。
嗨ops,
感谢您的详细反馈。让我检查一下,我会尽快回复你。
谢谢,PM_DIALOG.
嗨,pm_dialog;
很高兴知道你正在研究我的问题。我期待着你的回复。
非常感谢。
嗨ops,
我为迟到的回应道歉。当写入特性时,您必须使用SPI闪存停止传感器事务,然后重新启动事务。两个外围设备同时具有SPI。不可能。
谢谢,PM_DIALOG.