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.

[参考译文] RM57L843:SPI DMA 环回模式

Guru**** 2543180 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/978247/rm57l843-spi-dma-loopback-mode

器件型号:RM57L843
主题中讨论的其他器件:HALCOGEN

您好!

我已经创建了新项目并按照 halcogen "mibspidma.c"中提到的步骤操作、但它不起作用、

我观察到在 TXDATA 上加载数据成功、但在 while (1)运行1秒以上后、RXDATA 缓冲区中没有数据、

如果我错过了 halcogen 的任何设置、请告诉我!

谢谢、

Vikas N.

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

    大家好、Vikas、

    MibSPI 示例使用了中断模式:传输完成。

    1. 在 MIBSPIx VIM 通道选项卡中启用 MIBSPIx 中断。 每个 MibSPI 有两个 VIM 通道:MibSPIx 高电平或 MibSPIx 低电平

    2.您需要启用中断:

      mibspiEnableGroupNotification (mibSPIx、TGX、Level);

      其中电平可以是0 (低电平优先级)或1 (高电平优先级)

      MibSPIx 高通道被启用、请为电平使用1  

    3.在代码中启用 IRQ 中断

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

    您好 、QJ Wang、

    我已经添加了您提到的步骤、请在此处找到代码、

    /*用户代码开始(0)*/
    *用户代码结束*/
    
    *包含文件*/
    
    #include "hL_sys_common.h"
    
    /*用户代码开始(1)*/
    #include "hL_mibspi.h"
    #include "hL_sys_dma.h"
    #include "hL_sys_core.h"
    
    //*示例数据模式配置
    #d_size 128
    
    void loadDataPattern (uint32 psize、uint16* pptr);
    void mibspiEnableInternalLoopback (mibspi_t * mibspi);
    void dmaConfigCtrlPacket (uint32 sadd、uint32 dadd、uint32 dsize);
    txmibdmaConfig (* mibspi32
    
    );tidrintranuint32 uintmuintmuint32 uintmuintmuat_size (uint32);
    /* sys ram 中的传输缓冲区*/
    uint16 RXDATA[D_SIZE]={0};/* sys ram 中的接收缓冲区*/
    #pragma SET_DATA_SECTION ()
    
    布尔值 bIsMibspiDataReceived_g=0;
    g_dmaCTRL g_dmaCTRLPKT1、g_dmaCTRLPPKT2; /* DMA 控制数据包配置堆栈*/*
    用户代码结束*/**
    
    @fn void main (void)
    *@简短应用程序主函数
    *@注意此函数默认为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    */
    
    /*用户代码开始(2)*/
    /*用户代码结束*/
    
    int main (void)
    {//
    *用户代码开始(3)*/
    _enable_IRQ_interrupt_();
    
    /*-在系统 RAM 中创建数据块,以...开始 //
    loadDataPattern (D_size、&TXDATA[0]);
    
    //-正在初始化 mibspi -启用 TG 0、长度127 (halcogen 文件)*/
    mibspiInit();
    mibspiEnableGroupNotification (mibspiREG1,0u、
    
    
    
    FTC);//启用 mibspi1接口的组通知*/ dspiEnableDMA、enableInterrupt 1、dta_tma (dchta_tma) DMA_INTA);
    
    /*-启用环回(这是在没有外部导线的情况下模拟数据传输*/
    mibspiEnableInternalLoopback (mibspiREG1);
    
    /*-配置 DMA 控制数据包*/
    g_dmaCTRLPPKT1.Sadd =(uint32) TXDATA;//源地址 */
    g_dmaCTRLPKT1.DADD =(uint32)&(mibspiRAM1->TX[0].data);//目标地址 */
    g_dmaCTRLPKT1.CHCTTRL = 0; /*通道控制 */
    g_dmaCTRLPKT1.FRCNT = 1; /*帧计数 */
    g_dmaCTRLPKT1.ELCNT = D_SIZE; /*元素计数 */
    g_dmaCTRLPKT1.ELDOFFSET = 4; /*元素目标偏移*/
    g_dmaCTRLPKT1.ELSOFFSET = 0; /*元素目标偏移*/
    g_dmaCTRLPKT1.FRDOFFSET = 0; /*帧目的偏移*/
    g_dmaCTRLPKT1.FRSOFFSET = 0; /*帧目标偏移*/
    g_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTB_WRITE;
    g_dmaCTRLPKT1.RDSIZE = ACCESS_16_BIT; /*读取大小 */
    g_dmaCTRLPKT1.WRSIZE = ACCESS_16_BIT; /*写入大小 */
    g_dmaCTRLPKT1.tType = frame_transfer;/*传输类型 */
    g_dmaCTRLPKT1.ADDMODERD = ADDR_INC1; 读取/*地址模式 */
    g_dmaCTRPKT1.ADDMODEWR = ADDR_OFFSET; /*地址模式写入 //
    g_dmaCTRLPKT1.AUTOINIT = AUTOINIT_ON; /*自动初始化 */
    
    g_dmaCTRLPPKT2.Sadd =(uint32)&(mibspiRAM1->rx[0].data);//源地址 */
    g_dmaCTRLPPKT2.DADD =(uint32) RXDATA;/*目的地址 */
    g_dmaCTRLPPKT2.CHCTRL = 0; /*通道控制 */
    g_dmaCTRLPPKT2.FRCNT = 1; /*帧计数 */
    g_dmaCTRLPPKT2.ELCNT = D_SIZE; /*元素计数 */
    g_dmaCTRLPPKT2.ELDOFFSET = 0; /*元素目标偏移*/
    g_dmaCTRLPPKT2.ELSOFFSET = 4; /*元素目标偏移*/
    g_dmaCTRLPPKT2.FRDOFFSET = 0; /*帧目的偏移*/
    g_dmaCTRLPPKT2.FRSOFFSET = 0; /*帧目标偏移*/
    g_dmaCTRLPPKT2.PORTASGN = PORTB_READ_PORTA_WRITE;
    g_dmaCTRLPPKT2.RDSIZE = ACCESS_16_BIT; /*读取大小 */
    g_dmaCTRLPPKT2.WRSIZE = ACCESS_16_BIT; /*写入大小 */
    g_dmaCTRLPPKT2.tType = frame_transfer;/*传输类型 */
    g_dmaCTRLPKT2.ADDMODERD = ADDR_OFFSET; 读取/*地址模式 */
    g_dmaCTRLPPKT2.ADDMODEWR = ADDR_INC1; /*地址模式写入 //
    g_dmaCTRLPPKT2.AUTOINIT = AUTOINIT_ON; /*自动初始化 支持多达
    
    32个控制数据包。 //
    
    //-设置 DMA 控制包*/
    dmaSetCtrlPacket (Dma_CH0,g_dmaCTRLPPKT2);
    dmaSetCtrlPacket (Dma_CH1,g_dmaCTRLPPKT1);
    
    //设置 DMA 通道以在 H/w 请求时触发*/
    dmaChChPacket (HW_CH0,g_dmaCTRLPPKT1);//配置 dmaSet0
    
    
    ,dmaTmaTma_dmaTdma_tma 通道以启用,dma1,dmaTmaTma_dmaTma_tma1,dma-tma 通道 //
    *-请参阅器件数据表 mibspi TX/Rx 的 DMA 请求源*/
    mibspidDmaConfig (mibspiREG1、0、1);
    
    dmaEnable();
    
    unsigned int loop;
    
    for (loop=0;loop<5000;loop++);
    
    //启动 mibspi 传输 TG 0*/ mibspiREG0
    ;mib+;mibspiRoop0;mib+;mibspiRoop0;mib+(mibspiDspiRoop+)
    
    
    
    
    
    while (1);/* loop forever */
    
    /*用户代码 end */
    
    返回0;
    }
    
    
    //用户代码开始(4)*/
    void mibspiEnableInternalLoopback (mibspibase_t * mibspi)
    {
    /*启用内部回送*/
    mibspi->GCR1 |= 1U << 16U;
    }
    // MIBSPI 中断通知*/
    void mibspiGroupNotification (mibspibase_t * mibspi、uint32 group)
    {
    
    if (mibspi == mibspiREG1)
    {
    bIsMibspiDataReceived = true;
    }
    
    }
    
    void mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel)
    {
    uint32 bufid = D_size - 1;
    uint32 icount = 0;
    
    /*设置发送和接收通道*/
    mibspi->DMACTRL[通道]|=(((rxchannel<<4)|txchannel)<< 16);
    
    /*启用发送和接收 DMA */
    mibspi->DMACTRL[通道]|= 0x8000C000;
    
    /*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/
    mibspi->DMACTRL[通道]|=(icount << 8)|(bufid<24);
    
    }
    
    
    void loadDataPattern (uint32 psize、uint16* pptr)
    {
    int i;
    for (i=0;i 
    

    Halcogen Seeting:  

    Mibspi1设置符合"example_mibspiDma.c"中的 Haclogen 帮助示例

    请告诉我或建议/提供回送模式中的任何代码示例- SPIDMA  

     

    谢谢、

    Vikas N

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

    QJ Wang、您好!

    我添加 了 mibspiEnableGroupNotification (mibspiREG1,0u、1U);并在 Halcogen 中启用 MIBSPIx 中断:高电平和低电平、

    找到代码和 Halcogen 设置、请告诉我是否错过了任何内容、或者是否有任何示例可供尝试、

     

    /*用户代码开始(0)*/ *用户代码结束*/ *包含文件*/ #include "hL_sys_common.h" /*用户代码开始(1)*/ #include "hL_mibspi.h" #include "hL_sys_dma.h" #include "hL_sys_core.h" //*示例数据模式配置 #d_size 128 void loadDataPattern (uint32 psize、uint16* pptr); void mibspiEnableInternalLoopback (mibspi_t * mibspi); void dmaConfigCtrlPacket (uint32 sadd、uint32 dadd、uint32 dsize); txmibdmaConfig (* mibspi32 );tidrintranuint32 uintmuintmuint32 uintmuintmuat_size (uint32); /* sys ram 中的传输缓冲区*/ uint16 RXDATA[D_SIZE]={0};/* sys ram 中的接收缓冲区*/ #pragma SET_DATA_SECTION () 布尔值 bIsMibspiDataReceived_g=0; g_dmaCTRL g_dmaCTRLPKT1、g_dmaCTRLPPKT2; /* DMA 控制数据包配置堆栈*/* 用户代码结束*/** @fn void main (void) *@简短应用程序主函数 *@注意此函数默认为空。 * *此函数在启动后调用。 *用户可以使用此函数来实现应用程序。 */ /*用户代码开始(2)*/ /*用户代码结束*/ int main (void) {// *用户代码开始(3)*/ _enable_IRQ_interrupt_(); /*-在系统 RAM 中创建数据块,以...开始 // loadDataPattern (D_size、&TXDATA[0]); //-正在初始化 mibspi -启用 TG 0、长度127 (halcogen 文件)*/ mibspiInit(); mibspiEnableGroupNotification (mibspiREG1,0u、 FTC);//启用 mibspi1接口的组通知*/ dspiEnableDMA、enableInterrupt 1、dta_tma (dchta_tma) DMA_INTA); /*-启用环回(这是在没有外部导线的情况下模拟数据传输*/ mibspiEnableInternalLoopback (mibspiREG1); /*-配置 DMA 控制数据包*/ g_dmaCTRLPPKT1.Sadd =(uint32) TXDATA;//源地址 */ g_dmaCTRLPKT1.DADD =(uint32)&(mibspiRAM1->TX[0].data);//目标地址 */ g_dmaCTRLPKT1.CHCTTRL = 0; /*通道控制 */ g_dmaCTRLPKT1.FRCNT = 1; /*帧计数 */ g_dmaCTRLPKT1.ELCNT = D_SIZE; /*元素计数 */ g_dmaCTRLPKT1.ELDOFFSET = 4; /*元素目标偏移*/ g_dmaCTRLPKT1.ELSOFFSET = 0; /*元素目标偏移*/ g_dmaCTRLPKT1.FRDOFFSET = 0; /*帧目的偏移*/ g_dmaCTRLPKT1.FRSOFFSET = 0; /*帧目标偏移*/ g_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTB_WRITE; g_dmaCTRLPKT1.RDSIZE = ACCESS_16_BIT; /*读取大小 */ g_dmaCTRLPKT1.WRSIZE = ACCESS_16_BIT; /*写入大小 */ g_dmaCTRLPKT1.tType = frame_transfer;/*传输类型 */ g_dmaCTRLPKT1.ADDMODERD = ADDR_INC1; 读取/*地址模式 */ g_dmaCTRPKT1.ADDMODEWR = ADDR_OFFSET; /*地址模式写入 // g_dmaCTRLPKT1.AUTOINIT = AUTOINIT_ON; /*自动初始化 */ g_dmaCTRLPPKT2.Sadd =(uint32)&(mibspiRAM1->rx[0].data);//源地址 */ g_dmaCTRLPPKT2.DADD =(uint32) RXDATA;/*目的地址 */ g_dmaCTRLPPKT2.CHCTRL = 0; /*通道控制 */ g_dmaCTRLPPKT2.FRCNT = 1; /*帧计数 */ g_dmaCTRLPPKT2.ELCNT = D_SIZE; /*元素计数 */ g_dmaCTRLPPKT2.ELDOFFSET = 0; /*元素目标偏移*/ g_dmaCTRLPPKT2.ELSOFFSET = 4; /*元素目标偏移*/ g_dmaCTRLPPKT2.FRDOFFSET = 0; /*帧目的偏移*/ g_dmaCTRLPPKT2.FRSOFFSET = 0; /*帧目标偏移*/ g_dmaCTRLPPKT2.PORTASGN = PORTB_READ_PORTA_WRITE; g_dmaCTRLPPKT2.RDSIZE = ACCESS_16_BIT; /*读取大小 */ g_dmaCTRLPPKT2.WRSIZE = ACCESS_16_BIT; /*写入大小 */ g_dmaCTRLPPKT2.tType = frame_transfer;/*传输类型 */ g_dmaCTRLPKT2.ADDMODERD = ADDR_OFFSET; 读取/*地址模式 */ g_dmaCTRLPPKT2.ADDMODEWR = ADDR_INC1; /*地址模式写入 // g_dmaCTRLPPKT2.AUTOINIT = AUTOINIT_ON; /*自动初始化 支持多达 32个控制数据包。 // //-设置 DMA 控制包*/ dmaSetCtrlPacket (Dma_CH0,g_dmaCTRLPPKT2); dmaSetCtrlPacket (Dma_CH1,g_dmaCTRLPPKT1); //设置 DMA 通道以在 H/w 请求时触发*/ dmaChChPacket (HW_CH0,g_dmaCTRLPPKT1);//配置 dmaSet0 ,dmaTmaTma_dmaTdma_tma 通道以启用,dma1,dmaTmaTma_dmaTma_tma1,dma-tma 通道 // *-请参阅器件数据表 mibspi TX/Rx 的 DMA 请求源*/ mibspidDmaConfig (mibspiREG1、0、1); dmaEnable(); unsigned int loop; for (loop=0;loop<5000;loop++); //启动 mibspi 传输 TG 0*/ mibspiREG0 ;mib+;mibspiRoop0;mib+;mibspiRoop0;mib+(mibspiDspiRoop+) while (1);/* loop forever */ /*用户代码 end */ 返回0; } //用户代码开始(4)*/ void mibspiEnableInternalLoopback (mibspibase_t * mibspi) { /*启用内部回送*/ mibspi->GCR1 |= 1U << 16U; } // MIBSPI 中断通知*/ void mibspiGroupNotification (mibspibase_t * mibspi、uint32 group) { if (mibspi == mibspiREG1) { bIsMibspiDataReceived = true; } } void mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel) { uint32 bufid = D_size - 1; uint32 icount = 0; /*设置发送和接收通道*/ mibspi->DMACTRL[通道]|=(((rxchannel<<4)|txchannel)<< 16); /*启用发送和接收 DMA */ mibspi->DMACTRL[通道]|= 0x8000C000; /*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/ mibspi->DMACTRL[通道]|=(icount << 8)|(bufid<24); } void loadDataPattern (uint32 psize、uint16* pptr) { int i; for (i=0;i

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

    QJ Wang、您好!

    我在 mibspiTransfer (mibspiREG1、0)之后的同一代码中添加了循环、如下所示:

    mibspiTransfer (mibspiREG1,0);
    while (!(mibspiIsTransferComplete (mibspiREG1、0)))

    };

     mibspiIsTransferComplete API 始终返回 false、

    谢谢、

    Vikas N.

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

    大家好、 Vikas、

    您是否使示例代码正常工作?