IRQ stay high and invalid interruption

My problem is,that i send poll message call the follow function(my project is based on libdw1000 https://github.com/bitcraze/libdw1000)
void dwNewTransmit(dwDevice_t* dev) {
dwIdle(dev);
memset(dev->sysctrl, 0, LEN_SYS_CTRL);
dwClearTransmitStatus(dev);
dev->deviceMode = TX_MODE;
}
My program executes to dwIdle
void dwIdle(dwDevice_t* dev)
{
memset(dev->sysctrl, 0, LEN_SYS_CTRL);
dev->sysctrl[0] |= 1<<TRXOFF_BIT;
dev->deviceMode = IDLE_MODE;
dwSpiWrite(dev, SYS_CTRL, NO_SUB, dev->sysctrl, LEN_SYS_CTRL);
}
the function dwSpiWrite call spi interface
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t pData, uint16_t Size, uint32_t Timeout)
{
/
Process Locked */
__HAL_LOCK(hspi);


/* Process Unlocked */
__HAL_UNLOCK(hspi);
}
My program is interrupted by interruption between __HAL_LOCK and __HAL_UNLOCK
void dwHandleInterrupt(dwDevice_t *dev)
{
dwReadSystemEventStatusRegister(dev);

}
dwReadSystemEventStatusRegister can not read status from status register,because the spi has been locked, meanwhile the IRQ stay high
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch (GPIO_Pin) {
case DWM_IRQ_PIN:
do{
dwHandleInterrupt(dev);
} while(checkIrq() != 0); //while IRS line active (ARM can only do edge sensitive interrupts)
HAL_NVIC_ClearPendingIRQ(DWM_IRQn);
break;
case GPIO_PIN_12:
//instance_notify_DW1000_inIDLE(1);
break;
default:
break;
}
}
My program can’t jump out of the loop because the IRQ stay high,but there is no interruption,the current systatus register is 0x000280000f
the systatus register is 0x0002806f03 before this scene happened