我正在尝试将~1KB 形式的 MibSpi2和3传输到 RAM 的两个位置、当这些传输同时发生时、将无法在 RAM 中写入数据。
两个传输包含多个帧、我希望这两个传输能够同时运行。
如果两个传输都没有时间重叠、那么一切都正常、但是如果它们重叠、那么具有较高目标地址的传输将无法写入。
RAM 区域不重叠。
是否可以同时以交错方式运行两个传输、或者我是否必须确保它们不会重叠执行?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我正在尝试将~1KB 形式的 MibSpi2和3传输到 RAM 的两个位置、当这些传输同时发生时、将无法在 RAM 中写入数据。
两个传输包含多个帧、我希望这两个传输能够同时运行。
如果两个传输都没有时间重叠、那么一切都正常、但是如果它们重叠、那么具有较高目标地址的传输将无法写入。
RAM 区域不重叠。
是否可以同时以交错方式运行两个传输、或者我是否必须确保它们不会重叠执行?
两个配置结构 dmaConfig0.mibspiDmaLine = 1; dmaConfig0.rxChannel = DMA_CH4; dmaConfig0.rxRequest = dma_REQ34; dmaConfig0.txChannel = DMA_CH5; dmaConfig0.txRequest = dma_REQ35; dmaConfig1.mibspiDmaLine = 0; dmaConfig1.rxChannel = dma_ch6; dmaConfig1.rxRequest = dma_REQ12; dmaConfig1.txChannel = dma_ch7; dmaConfig1.txRequest = dma_REQ13;
DMA 控制数据包初始化:
此->txDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine]。添加=(uintptr_t) DummyBuffer; this->txDmaCtrlPacket[this->dmaConfig->mibspiDmaLine]。dADD =(uintptr_t)&(this->mibspiram->TX[this->tgBufferStart[0]).data; 此->txDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。ADDMODERD = ADDR_FIXED; this->rxDmaCtrlPacket[this->dmaConfig->mibspiDmaLine]。sadd =(uintptr_t)&(this->mibspiram->rx[this->tgBufferStart[0]).data; 此-> rxDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。dADD =(uintptr_t) rxBuffer; 此-> rxDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。ADDMODEWR = ADDR_INC1; 此->txDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine]。CHCTRL = 0; 此->txDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine].FRCNT = segmentCount; this->txDmaCtrlPacket[this->dmaConfig->mibspiDmaLine]。ELCNT = this->tgBufferLength [0]; 此->txDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine].ELDOFFSET = 4; 此->txDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine].ELSOFFSET = 0; 此->txDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine].FRDOFFSET = 0; 此->txDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine].FRSOFFSET = 0; 此->txDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。PORTASGN = PORta_read_PORTB_write; 此-> txDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。RDSIZE = ACCESS_16_BIT; 此->txDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。WRSIZE = ACCESS_16_BIT; this->txDmaCtrlPacket[this->dmaConfig->mibspiDmaLine].tType = frame_transfer; 此->txDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。ADDMODEWR = ADDR_OFFSET; 此->txDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。AUTOINIT = AUTOINIT_ON; dmaSetCtrlPacket (此->dmaConfig->txChannel、此->txDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine]); dmaReqAssign (this -> dmaConfig->txChannel、this -> dmaConfig->txRequest); dmaSetChEnable (此-> dmaConfig->txChannel、DMA_HW); 此-> rxDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。CHCTRL = 0; 此->rxDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine].FRCNT = segmentCount; this->rxDmaCtrlPacket[this->dmaConfig->mibspiDmaLine]。ELCNT = this->tgBufferLength [0]; 此-> rxDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。ELDOFFSET = 0; 此->rxDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine].ELSOFFSET = 4; 此->rxDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine].FRDOFFSET = 0; 此->rxDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine].FRSOFFSET = 0; 此-> rxDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。PORTASGN = PORTB_READ_PORTA_WRITE; 此-> rxDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。RDSIZE = ACCESS_16_BIT; 此-> rxDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。WRSIZE = ACCESS_16_BIT; this->rxDmaCtrlPacket[this->dmaConfig->mibspiDmaLine].tType = frame_transfer; 此-> rxDmaCtrlPacket[this -> dmaConfig->mibspiDmaLine]。ADDMODERD = ADDR_OFFSET; 此->rxDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine]。AUTOINIT = AUTOINIT_ON; dmaSetCtrlPacket (此->dmaConfig->rxChannel、此->rxDmaCtrlPacket[this ->dmaConfig->mibspiDmaLine]); dmaReqAssign (this -> dmaConfig->rxChannel、this -> dmaConfig->rxRequest); dmaSetChEnable (此-> dmaConfig->rxChannel、DMA_HW);
从中断中触发 DMA 传输:
uint32 bufid = the->tgBufferEnd[0]; uint32 icount = 0; 此->mibspiInterface->DMACTRL[THS->dmaConfig->mibspiDmaLine]= 0; 此->mibspiInterface->DMACTRL[THS->dmaConfig->mibspiDmaLine]|=((此->dmaConfig->rxChannel & DMACTRL_RXDMAMAP_MASK)<< DMACTRL_RXDMAMAP_OFFSET); 此->mibspiInterface->DMACTRL[this -> dmaConfig->mibspiDmaLine]|=((this -> dmaConfig->txChannel & DMACTRL_TXDMAMAP_MASK)<< DMACTRL_TXDMAMAP_OFFSET); 此->mibspiInterface->DMACTRL[THS->dmaConfig->mibspiDmaLine]|= DMACTRL_RXDMAENA; 此->mibspiInterface->DMACTRL[THS->dmaConfig->mibspiDmaLine]|= DMACTRL_TXDMAENA; 此->mibspiInterface->DMACTRL[THS->dmaConfig->mibspiDmaLine]|= DMACTRL_OneShot; 此->mibspiInterface->DMACTRL[THS->dmaConfig->mibspiDmaLine]|=((icount & DMACTRL_ICOUNT_MASK)<< DMACTRL_ICOUNT_OFFSET); 此->mibspiInterface->DMACTRL[THS->dmaConfig->mibspiDmaLine]|=((bufid & DMACTRL_BUFID_MASK)<< DMACTRL_BUFID_OFFSET); 此->mibspiInterface->DMACNTLEN = 1; 此->mibspiInterface->DMACOUNT[this ->dmaConfig->mibspiDmaLine]=(segmentsNeed-1)<< 16);