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); }
热门产品 :
CH32X035: 32位USB+USB PD单片机