学到更多常见问题解答教程

5个帖子/ 0新
最后一篇
杰曼伯特
离线
最后一次露面:3个月2周前
加入:2014-10-24 14:17
中断问题

你好对话框,

我们的应用程序在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行为?

设备:
PM_DIALOG.
离线
最后一次露面:9小时58分钟前
职员
加入:2018-02-08 11:03
嗨jameshiebert,

嗨jameshiebert,

你能分享你所实施的内容吗?您是否使用SPI驱动程序使用API​​?

谢谢,PM_DIALOG.

杰曼伯特
离线
最后一次露面:3个月2周前
加入:2014-10-24 14:17
对话,

对话,

感谢您及时的回复。以下一些代码段。

我们有一个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);
}
}

PM_DIALOG.
离线
最后一次露面:9小时58分钟前
职员
加入:2018-02-08 11:03
嗨jameshiebert,

嗨jameshiebert,

为延迟/让我检查它,我会尽快回复你。

谢谢,PM_DIALOG.

PM_DIALOG.
离线
最后一次露面:9小时58分钟前
职员
加入:2018-02-08 11:03
嗨jameshiebert,

嗨jameshiebert,

如果您连续使用SPI活动,那么您将获得一个中断,并且将触发SPI_Handler。如果我能够正确理解,则代码陷入了assert_error(spi_int_bit_set())。但是,如果已传输和接收数据,将发生SPI中断。

谢谢,PM_DIALOG.