你好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的行为?
设备:
嗨,杰米谢伯特,
你能分享一下你实施了什么吗?你在使用SPI驱动程序的API吗?
谢谢,下午好
对话框,
谢谢你的快速回复。下面是一些代码段。
我们有一个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);
}
}
嗨,杰米谢伯特,
抱歉耽搁了/让我查一下,我会尽快答复你的。
谢谢,下午好
嗨,杰米谢伯特,
如果您连续有SPI活动,那么您将得到一个中断,SPI\u处理程序将被启动。如果我能够正确理解,代码就会陷入ASSERT\u ERROR(spi\u int\u bit\u set())中。但是,如果数据已被发送和接收,则会发生SPI中断。
谢谢,下午好