⚠️
你好。。谢谢你来参加论坛。令人兴奋的消息!我们现在正在移动到我们的新论坛平台,将提供更好的功能,并包含在主对话网站的过程。所有帖子和账号都已迁移。我们现在只接受新论坛上的流量-请在//www.xmece.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
5个职位/0个新职位
最后一篇文章
杰米谢伯特
离线
最后一次见到:5个月2周前
已加入:2014-10-24 14:17
打断问题

你好Dialog,

我们的应用程序运行在带有sdk5.0.4的DA14581上。它有一个SPI ISR,它执行以下操作:

1作为健全性检查,请通过SPI\u CTRL\u REG;查看SPI中断是否实际处于挂起状态,如果不是,请记录错误。
2从SPI\u RX\u TX\u REG1和SPI\u RX\u TX\u REG0读取一个单词。
三。通过SPI\ U Clear\ U INT\ U REG清除挂起的SPI中断。
4处理收到的字。
5返回。

中断优先级由NVIC\u SetPriority(最高)设置为0。我们不改变SPI中断的优先级。

该ISR已经发射了数千次,但从未检测到第1步错误。最近我们遇到了一个案例,在步骤1中检测到的错误确实发生了,我们正在尝试找出原因(除了内存损坏)。

SPI中断可能在SPI ISR执行时再次发生(这也可能是不好的,但由于其他原因),但由于此中断的优先级从未更改,因此中断不应嵌套。

我们还有没有其他的想法或者NVIC的行为?

设备:
PM\U对话框
离线
最后一次见到:8小时10分钟前
工作人员
已加入:2018-02-08 11:03
嗨,杰米谢伯特,

嗨,杰米谢伯特,

你能分享一下你实施了什么吗?你在使用SPI驱动程序的API吗?

谢谢,下午好

杰米谢伯特
离线
最后一次见到:5个月2周前
已加入:2014-10-24 14:17
对话框,

对话框,

谢谢你的快速回复。下面是一些代码段。

我们有一个2芯片系统,有一个定制的ASIC通过SPI与DA14581通信。其中一些代码实现了两个芯片之间的握手。

SPI\u处理程序是我们的SPI ISR,用于输入字。触发的ASSERT\u错误是ASSERT\u ERROR(spi\u int\u bit\u set())。spi\u int\u bit\u clear()仅在此ISR中调用,从未直接调用spi\u处理程序。

在将自动测试放入循环之后,我们又多次看到这个问题。

__内联bool spi\u int\u bit\u set(void)
{
return((GetWord16(SPI\u CTRL\u REG)&SPI\u INT\u BIT)>0x0000);
}

__内联void deassert \u rf \u rdyn(void)
{
//将RF\ RDYN GPIO线拉高(断开RF\ RDYN线)
//ASIC射频附件中断在下降沿上升
SetWord16(射频同步设置数据寄存器,射频同步掩码);
}

__INLINE uint32\u t spi\u rxtxreg\u read(空)
{
uint32_t rd_word=(uint32_t)GetWord16(SPI_RX_TX_REG1);//读取单词的高位

rd_word=(rd_word<<16)+(uint32_t)GetWord16(SPI_RX_TX_REG0);//读取单词的低位部分

返回rd\U字;
}

__内联void spi\u int\u bit\u clear(void)
{
设置字16(SPI\ U CLEAR\ U INT\ U REG,0x0001);
}

void SPI\u处理程序(void)
{
uint32接收字;

断言错误(SPIRecvState!=接收SPI空闲);
ASSERT_ERROR(spi_int_bit_set());

//之后尽快解除射频连接线
//SPI字传输完成(由SPI中断位指示)
//允许足够的时间处于解除评估状态
迪塞特·鲁尔丁(deassert_rf_rdyn();

recvWord=spi_rxtxreg_read();//从spi读取字

spi_int_bit_clear();//清除spi中断位

//<>>

如果(SPIRecvState==RECV\u SPI\u DATA)
{
//需要延迟来产生足够宽的脉冲,以便ASIC触发中断
适用范围(RF\RDYN\u MIN\u PULSE\u WIDTH\u IN\u US);

//从解除断言状态断言RF_ATTN行。
//这将导致ASIC侧的射频连接线降低。
断言\u rf \u rdyn();
}
否则//SPIRecvState==RECV\u SPI\u IDLE
{
//将睡眠模式设置回默认值
arch_restore_sleep_mode();

//重新配置MISO线作为传输结束时的输入下拉,以节省功耗
GPIO\ U配置引脚(GPIO\ U SPI\ U端口、GPIO\ U SPI\ U DO\ U引脚、INPUT\ U下拉、PID\ U GPIO、false);
}
}

PM\U对话框
离线
最后一次见到:8小时10分钟前
工作人员
已加入:2018-02-08 11:03
嗨,杰米谢伯特,

嗨,杰米谢伯特,

抱歉耽搁了/让我查一下,我会尽快答复你的。

谢谢,下午好

PM\U对话框
离线
最后一次见到:8小时10分钟前
工作人员
已加入:2018-02-08 11:03
嗨,杰米谢伯特,

嗨,杰米谢伯特,

如果您连续有SPI活动,那么您将得到一个中断,SPI\u处理程序将被启动。如果我能够正确理解,代码就会陷入ASSERT\u ERROR(spi\u int\u bit\u set())中。但是,如果数据已被发送和接收,则会发生SPI中断。

谢谢,下午好