你好对话框,
我们的应用程序在DA14581上运行SDK 5.0.4。它有一个SPI ISR,这有以下内容:
1.作为Sanity检查,看看SPI中断是否实际上是待命的,通过SPI_CTRL_REG;如果不是,则记录错误。
2.从SPI_RX_TX_REG1和SPI_RX_TX_REG0读取单词。
3.通过SPI_CLEAR_INT_REG清除挂起的SPI中断。
4.处理收到的单词。
5.返回。
NVIC_SetProirity(最高)将中断优先级设置为0。我们不会改变SPI中断的优先级。
如果曾经检测到STEP 1错误,则此ISR已触发了数千次。最近我们有一个案例,其中发生了在步骤1中检测到的错误,我们正在尝试弄清楚如何(内存损坏)。
在SPI ISR正在执行时,可以再次发生SPI中断(这也是坏的但是出于其他原因)但是由于这种中断的优先级永远不会改变,因此中断不应嵌套。
我们可能缺少的任何其他想法或NVIC行为?
设备:
嗨jameshiebert,
你能分享你所实施的内容吗?您是否使用SPI驱动程序使用API?
谢谢,PM_DIALOG.
对话,
感谢您及时的回复。以下一些代码段。
我们有一个2芯片系统,通过SPI与DA14581通信定制ASIC。其中一些代码实现了2个芯片之间的握手。
SPI_Handler是我们的SPI ISR。触发的assert_error是assert_error(spi_int_bit_set())。spi_int_bit_clear()仅在此ISR中调用,并且永远不会直接调用SPI_Handler。
在将自动化测试放入循环之后,我们已经看到了额外的几次问题。
__inline bool spi_int_bit_set(void)
{
返回((getword16(spi_ctrl_reg)&spi_int_bit)> 0x0000);
}
__inline void deassert_rf_rdyn(void)
{
//拉出RF_RDYN GPIO线路高(DEASSERT RF_RDYN线)
// ASIC RF_ATTN中断在下降沿提出
setword16(rf_rdyn_set_data_reg,rf_rdyn_mask);
}
__inline uint32_t spi_rxtxreg_read(void)
{
uint32_t rd_word =(uint32_t)getword16(spi_rx_tx_reg1);//阅读单词的高部分
rd_word =(rd_word << 16)+(uint32_t)getword16(spi_rx_tx_reg0);//读取单词的低部分
返回rd_word;
}
__inline void spi_int_it_clear(void)
{
setword16(spi_clear_int_reg,0x0001);
}
void spi_handler(void)
{
uint32_t recvword;
assert_error(spirecvstate!= recv_spi_idle);
assert_error(spi_int_bit_set());
// DEASSERT RF_ATTN线尽快
//完成SPI字传输(如SPI中断位指示)
//以允许足够的时间在置于置品状态下
deassert_rf_rdyn();
recvword = spi_rxtxreg_read();//从spi读取单词
spi_int_bit_clear();//清除SPI中断位
// <<<进程recvword这里>>>
if(spirecvstate == recv_spi_data)
{
//为ASIC创建足够的脉冲来触发中断时需要延迟
apputildelayinus(rf_rdyn_min_pulse_width_in_us);
// assert rf_attn从脱索状态的行。
//这将导致rf_attn线在待降低的ASIC侧。
assert_rf_rdyn();
}
else // spirecvstate == recv_spi_idle
{
//将睡眠模式设置为默认值
ARCH_RESTORE_SLEEP_MODE();
//将MISO线重新配置为转移结束时输入下拉以节省功耗
gpio_configurepin(gpio_spi_port,gpio_spi_do_pin,input_pulldown,pid_gpio,false);
}
}
嗨jameshiebert,
为延迟/让我检查它,我会尽快回复你。
谢谢,PM_DIALOG.
嗨jameshiebert,
如果您连续使用SPI活动,那么您将获得一个中断,并且将触发SPI_Handler。如果我能够正确理解,则代码陷入了assert_error(spi_int_bit_set())。但是,如果已传输和接收数据,将发生SPI中断。
谢谢,PM_DIALOG.