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.

[参考译文] TMS570LC4357:TMS570LC4357:从 Mibspi 2和3同步 DMA 传输到 RAM

Guru**** 2457950 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/955383/tms570lc4357-tms570lc4357-simultaneous-dma-transfers-form-mibspi-2-and-3-to-ram

器件型号:TMS570LC4357

我正在尝试将~1KB 形式的 MibSpi2和3传输到 RAM 的两个位置、当这些传输同时发生时、将无法在 RAM 中写入数据。

两个传输包含多个帧、我希望这两个传输能够同时运行。

如果两个传输都没有时间重叠、那么一切都正常、但是如果它们重叠、那么具有较高目标地址的传输将无法写入。

RAM 区域不重叠。  

是否可以同时以交错方式运行两个传输、或者我是否必须确保它们不会重叠执行?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Georg、

    DMA 支持两种优先级方案:固定和旋转。  

    已修复:DMA 通道编号越低、其优先级就越高。 这是 DMA 使用的默认方案。

    轮换:使用循环方案

    因此、对具有较低优先级通道的 DMA 传输进行仲裁、并在具有较高优先级的通道完成后开始传输。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复、  

    我将尝试更改优先级方案、但我不理解为什么在我的案例中目标地址是决定传输是否失败的因素。

    我更改了首先启动的通道和 mibspi、在 RAM 中的较高地址总是失败的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    整个较高地址是否处于有效存储器范围内(<0x08080000)? 较高地址是否位于具有受限写入权限的专用 MPU 区域中?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于这两个问题、如果 DMA 不能及时重叠、那么 DMA 将对这两个地址都起作用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Georg、

    好的、如何使两个 DMA 通道的传输重叠? MibSPI2和 MibSPI3是否由同一触发源触发?   

    "目标地址较高、无法写入。" --没有数据被写入较高的地址,对吧? 您是否获得了数据中止?  

    您能否与我们分享您的代码、以便我们可以在工作台上对其进行测试?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有两个 GIO 中断、每个 MibSpi 一个、在这些中断中、我决定需要读取多少帧、而不是触发 DMA 传输以获得正确的帧量。 如果这两个中断足够接近、则 DMA 传输会重叠。 为了进行调试、我手动触发这些中断以强制重叠。

    是的、没有数据 Witten 发送到较高地址。 我不会获取数据中止。

    我将检查如何共享代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    两个配置结构
    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); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Georg、我将查看您的代码。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现了我的错误、我写入的数据结构缺少一些填充字节、因此较高的数据结构被到较低地址的传输覆盖。

    感谢您的支持。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    知道问题已解决。 谢谢