当DA14580作为spi奴隶接收或发送时,我应该禁用系统睡眠吗?

⚠️
大家好. .谢谢你来参加论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,并包含在主对话网站中。所有的帖子和账号都已迁移。我们现在只接受新论坛的流量-请张贴任何新的线程在//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
9个帖子/ 0个新
最后发表
cgha
离线
最后看到:10个月前3天前
加入:2016-03-23 13:05
当DA14580作为spi奴隶接收或发送时,我应该禁用系统睡眠吗?

我想实现da14580作为spi奴隶,并使用额外的2引脚传输流控制,1引脚主从数据irq(M2S_irq_pin)和1引脚从主irq(S2M_sync_pin)。主或从可以在任何时候启动spi传输。当Master to slave irq断言时,它应该等待slave的S2M_sync_pin断言来指示slave已经准备好接收数据。

1.我应该调用arch_disable_sleep()时,我已经启动da14580 spi作为奴隶,并等待spi主人启动spi转移,并调用arch_set_extended_sleep()时,转移已经完成?

2.wkupct_enable_irq在任何时候都工作吗?分配给wakeup的引脚可以在任何时候(当系统处于睡眠、空闲、活动模式时)产生中断吗?因为当spi主控程序想要将数据传输到da14580(断言M2S_irq)时,它不知道da14580是处于活动模式还是休眠模式,但是当spi主控程序断言m2s_irq_pin时,从程序应该随时准备spi数据传输。

3.我是否应该启用EXTERNAL_WAKEUP预处理器,因为M2S_irq_pin将唤醒DA14580?

设备:
PM_Dialog
离线
最后看到:5天21小时前
工作人员
加入:2018-02-08 11:03
嗨cgha,

嗨cgha,

感谢您在网上的询价。老实说,我不完全确定你想要达到什么目的。据我所知,您想配置DA14580作为SPI奴隶,并通过M2S_irq_pin唤醒它?请注意,当设备处于睡眠模式时,所有外围设备块都是关闭的,因此芯片应该在活动模式下工作。如果您使用唤醒控制器是为了捕获M2S_irq,那么它将在任何时候工作。但是,如果你能为我提供更多关于你正在做的事情的信息,那将是非常有帮助的。

谢谢,PM_Dialog

cgha
离线
最后看到:10个月前3天前
加入:2016-03-23 13:05
是的,我想用M2S

是的,我想使用M2S_irq_pin唤醒DA14580时,spi主想通过spi发送数据(是否DA14580是在睡眠模式或活动模式),当DA14580准备好接收数据,它ack外部mcu与S2M_irq_pin活动,然后外部mcu发送数据。流程如下:

DA14580是广告或断开连接,没有广告或连接,应用程序运行时启用深度睡眠或外部睡眠:

1.SPI_MASTER(外部mcu)要发送数据,把M2S_irq_pin放高。

2.SPI_SLAVE(DA14580)通过M2S_irq_pin获得引脚中断

3.SPI_SLAVE初始化它自己为SPI_SLAVE,并用high ack S2M_irq_pin。

4.SPI_MASTER检查S2M_irq_pin,检测S2M_irq_pin高电平,然后将spi数据发送给DA14580。

5.当数据传输完成时,SPI_MASTER将M2S_irq_pin放低。

6.SPI_SLAVE把S2M_irq_pin放低。

cgha
离线
最后看到:10个月前3天前
加入:2016-03-23 13:05
现在我只能得到第一个

现在我只能得到第一个引脚中断和第一个数据包的数据,当spi主人想发送第二个数据包,da14580似乎不能得到引脚中断再次。

PM_Dialog
离线
最后看到:5天21小时前
工作人员
加入:2018-02-08 11:03
嗨cgha,

嗨cgha,

既然你发送了第二个中断,你能否在唤醒控制器回调函数中添加一个断点,以检查是否命中?关于配置唤醒引脚,请查看SDK>的ble_app_sleepmode示例。您是否使用相同的代码架构?

谢谢,PM_Dialog

cgha
离线
最后看到:10个月前3天前
加入:2016-03-23 13:05
不,它进不去

现在它可以进入回调。我应该调用int_enable函数后引脚得到高再次。但有时spi丢失了一些字节后,我发送了几十个包。SPI_Handler似乎不能足够快地获取字节。主速度约为250K bps。

void SPI_Handler(void) {if(packetLen ==13 && spiisinit) {//GLOBAL_INT_DISABLE();while(packetLen) {while(0xFF&GetBits16(SPI_CTRL_REG,SPI_INT_BIT)) {while(GetBits16(SPI_CTRL_REG,SPI_TXH)==1);SetWord16 (SPI_RX_TX_REG0 * p_spi_txdata + +);/ / p_spi_txdata + +;* p_spi_rxdata + + = 0 xff&getword16 (SPI_RX_TX_REG0);SetWord16 (SPI_CLEAR_INT_REG 0 x01);如果(packetLen) {packetLen——;if(packetLen == 0) {SPI_Transfer_IRQ_Off();newPacket = 1;rcvedCnt + +; } } } } //GLOBAL_INT_RESTORE(); } }

PM_Dialog
离线
最后看到:5天21小时前
工作人员
加入:2018-02-08 11:03
嗨cgha,

嗨cgha,

说实话,我无法理解您如何想在M2S_irq_pin中断检测时唤醒您的设备。你配置叫醒控制器了吗?只有唤醒控制器才能唤醒芯片。

谢谢,PM_Dialog

cgha
离线
最后看到:10个月前3天前
加入:2016-03-23 13:05
现在起作用了,所以我需要

现在唤醒工作,所以我需要调用arch_disable_sleep()当spi是转移?或者当spi传输时我应该保持ble开着?

PM_Dialog
离线
最后看到:5天21小时前
工作人员
加入:2018-02-08 11:03
嗨cgha,

嗨cgha,

arch_disable_sleep()禁用所有睡眠模式,因此系统只在活动/空闲模式下运行。DA14580有两种睡眠模式:

扩展睡眠模式:只有SystemRAM 42kB和RetentionRAM保持打开状态。

深度睡眠模式:只有RetentionRAM保持打开状态。OTP必须被烧毁,才能测量深度睡眠电流。

在两种休眠模式下,包括SPI块和RF块在内的所有外围块都是关闭的,所以我建议在与SPI块交互时保持设备处于主动模式。

谢谢,PM_Dialog