CH579的SPI0 Slave模式使用DMA和中断,一直进中断。

CH579的SPI0 Slave模式使用DMA和中断,只要一开始传输数据就一直进中断,哪怕把spi的引脚断开也不能使它停止。

麻烦大家看看,以下代码问题在哪?

void SPI_SlaveDMARecv( PUINT8 pbuf, UINT16 len)
{
    R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR;  				//fifo用于输入
    R16_SPI0_DMA_BEG = (UINT32)pbuf;                                    //DMA首地址
    R16_SPI0_DMA_END = (UINT32)(pbuf + len);                            //DMA尾地址
    R16_SPI0_TOTAL_CNT=len;                                             //DMA缓冲区地址
    R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END|RB_SPI_IF_DMA_END;	        //清除中断标志   传输全部完成    DMA完成
    R8_SPI0_INTER_EN	= RB_SPI_IE_DMA_END | RB_SPI_IE_CNT_END;	//设置中断源    传输全部完成    DMA完成
    R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE;				//DMA使能
    NVIC_EnableIRQ(SPI0_IRQn);                                          //SPI0中断使能
}


void SPI0_IRQHandler (void)
{
	if (R8_SPI0_INT_FLAG & RB_SPI_IF_CNT_END)
	{
		R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END;			//清除传输全部完成中断标志
		PRINT("SPI:RB_SPI_IF_CNT_END\r\n");
	}
		if (R8_SPI0_INT_FLAG & RB_SPI_IF_DMA_END)
	{
		R8_SPI0_INT_FLAG = RB_SPI_IF_DMA_END;			//清除DMA完成中断标志
		PRINT("SPI:RB_SPI_IF_DMA_END\r\n");
	}
}


void SPI0_Init(void)
{
	
	GPIOA_ModeCfg(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_ModeIN_PU);
        SPI0_SlaveInit(); 
	SPI_SlaveDMARecv(spi_buffer,SPI_BUFFER_SIZE);
  
}



把工程贴出来我帮你看看吧。


icon_rar.gifPeripheral.zip

您好,我是直接在EVT的Peripheral例子上改的,覆盖 EVT\EXAM\BLE 下的同名目录即可编译。谢谢~~j_0002.gif


哪位技术GG能帮忙看下吗j_0056.gif


只有登录才能回复,可以选择微信账号登录