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:SCI DMA接收器

Guru**** 2459240 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1093989/tms570lc4357-sci-dma-rx

部件号:TMS570LC4357

王工您好:

    我们现在用SCI3做串口收发,两个570芯片使用sci3进行通信,并使用DMA功能。

      

    配置如下:

   

   初始化代码:  

void dma_init()

/*Assign DMA Request SCI3 Receive to Channel 1*/(将DMA请求SCI3接收分配给信道1*/)
dmaReqAssign(DMA_CH1, DMA_SCI3_RX);

sciRxData = SCI3_RX_ADDR;

/*为通道1*/配置控制数据包
G_dmaCTRLPKT2.Sadd = sciRxData;/*源地址*/
G_dmaCTRPKT2.DADD =(UINT32_t) RX_DATA;/*目标地址ss */
G_dmaCTRLPKT2.CHCTRL = 0;/*信道控制*/
g_dmaCTRLPKT2.FRCNT = 5;/*帧数*/
G_dmaCTRLPKT2.ELCNT = 1;/*元素计数*/
g_dmaCTRLPKT2.ELDOFFSET =0;/*元素目标偏移*/
G_dmaCTRLPKT2.ELSOFFSET = 0;/*元素目标偏移*/
g_dmaCTRLPKT2.FRDOFFSET =0;/*帧目标偏移*/
g_dmaCTRLPKT2.FRSOFFSET =0;/*帧目标偏移*/
G_dmaCTRLPKT2.PORTAGN = PORTB_READ_Porta_WRITE;
G_dmaCTRLPKT2.RDSIZE = ACCESS_8_BIT;/*读取大小*/
g_dmaCTRLPKT2.WRSIZE = ACCESS_8_BIT;/* WRITE SIZE */
g_dmaCTRLPkt2.tType = frame_transfer;/* transfer type */
G_dmaCTRLPKT2.ADDMORD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT2.ADDMODEWR = ADDR_INC1;/*地址模式写入*/
G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF;/* autoinit */

/*设置通道0和1*/的控制数据包
dmaSetCtrlPacket(DMA_CH1, g_dmaCTRLPKT2);

/*将DMA通道0和1设置为在硬件请求时触发*/
dmaSetChEnable(DMA_CH1, DMA_HW);

/*启用DMA*/
dmaEnable();

/*启用SCI3接收DMA请求*/
sciREG3->SEINT || SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
}

接收函数为:

void sci_rcvData()

memset(pRcvData,0,size);
#IF 1.
while ((sciREG3->FLR和0x4U)== 0x4U)

}
#endif
/*- Disable所有中断*/
sciREG3->CLEARINT = SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;

memcpy (pRcvData,RX_data,size);
dbgPrintf ("CPU:%d DMA recv:%d %d %d %d %d\r\n",CPU_id,pRcvData[0],pRcvData[1],pRcvData[2],pRcvData[2],pRcvData[3],pRcvData[4]);

/*-清除BTC标志*/
dmaREG->BTCFLAG |= 1U << DMA_CH1;
/*-设置通道1的控制pkt */
dmaRAMREG->PCP[DMA_CH1].ITCOUNT =((UINT32_t) 5<16U)| 1U;
/*-设置通道1使能*/
dmaSetChEnable(DMA_CH1, DMA_HW);
/*-使能SCI3接收DMA请求*/
sciREG3->SEINT || SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
}

周期执行下列代码:

对于(i=0;i<5;i++)

数据[I]++;
IF (data[i]=200)
Data[i]=0;
}

sciSend (sciREG3,5,data);
sci_rcvData();

但是两个cpu接收的数据都不对,打印如下,请王工给看一下我哪里弄错了,谢谢。

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

    您好MingXi:

    MCU1 SCI3_RX是否连接到CPU2 SCI3_TX,MCU1 SCI3_TX是否连接到CPU2 SCI3_RX?

    g_dmaCTRLPKT2.sadd =4357 = sciRxData;/*源地址[/报价]

     代码中使用什么sciRxData? 对于TMS570LC43x (一种大型端子器件  ),源地址应为&(sciREG3->RD)+3,而不是&(sciREG3->RD)。

    </s>4357

    /*启用DMA*/
    dmaEnable();

    /*启用SCI3接收DMA请求*/
    sciREG3->SEINT || SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;

    [/引述]

    最好在启用SCI DMA后启用DMA。  如果在启用SCI_TX/RX_DMA之前启用DMA,则sciREG3->SEINT之间的延迟将使SCI获取错误的数据(或仅获取最后一个字节)。 DMA可在此处或在sciInit()之前启用。

    从CPU2和CPU1传输的数据是什么? CPU1接收到的数据是否正确,例如1091.1011011亿?

    sciSend(scREG3,5,data);</s>4357
    sci_rcvData();
    [/quote]

    如果使用DMA,则不需要调用 sciSend(sciREG3,5,data);和 sci_rcvData();来传输数据和接收数据?

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

    王工,上面那个问题我知道哪里不对了。我还有个问题想咨询一下,如下是我们DMA的接收函数,主要步奏是1.2。3.4。5.6,您看这六步的顺序是否合适,是否还需要增加别的操作,有没有哪步可以删除,可以不用执行?谢谢。

    void sci_rcvData()

    memset(pRcvData,0,size);

    while ((sciREG3->FLR & 0x4U)== 0x4U) /*- 1.串口总线是否空闲*/


    }

    while (dmaGetInterruptStatus (DMA_CH1,BTC)!= true)  /*- 2.DMA传输是否完成*/

    }


    sciREG3->CLEARINT = SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;/*- 3.Disable所有中断*/

    memcpy (pRcvData,RX_data,size);

    dmaREG->BTCFLAG |= 1U << DMA_CH1;/*-4.K ö 清除 BTC标识*/
    dmaSetChEnable(DMA_CH1, DMA_HW);/*- 5。 使能硬件请求*/
    sciREG3->SEINT |= SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;/*- 6. 使能SCI3接收DMA请求*/
    }

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

    您好Mingxi:

     sci_rcvData()在您的测试中是否工作?

    我认为顺序应该是:

    1 --> 3 --> 5 --> 6 --> 2 --> 4->memcpy(pRcvData,RX_data,size);

    如果使用DMA BTC中断,则可以忽略STEP,因为读取中断偏移将清除中断标志。

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

    王工您好:

       1)您能给我提供一个sci使用DMA接收函数嘛?

       2)如何判断DMA接收完成?

       3)dmaSetChEnable(DMA_CH1, DMA_HW);这个函数的作用是将数据复制到用户的接收缓RX DATA存中吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1)4.3557万)您能给我提供一个sci使用DMA接收函数嘛405.3567万您能给我提供一个sci使用DMA接收函数嘛?405.3567万?

    我将检查我是否有一个工作示例。

      24.3557万 2)405.3567万)如何判断DMA接收完成405.3567万如何判断DMA接收完成?

    您可以在BTC ISR中启用块传输完成(BTC)中断并设置标志。 BTC在最后一个帧的最后一个元素传输完毕后发出。

    3)4.3557万)这个函数的作用是将数据复制到用户的接收缓RX405.3567万这个函数的作用是将数据复制到用户的接收缓RX DATA存中吗405.3567万 DATA存中吗?dmaSetChEnable(DMA_CH1, dma_hw]

    此功能用于启用选定的DMA通道(DMA_CH1)以进行硬件触发。  有三种方法可以开始DMA传输:

    1. 硬件请求:DMA控制器最多可处理48条DMA请求线路。 硬件请求可以触发帧或块传输。
    2. 软件请求:写入SW信道启用集和状态 寄存器将触发传输。
    3. 由其他控制数据包触发:当控制数据包完成设定的 传输次数时,它可以触发另一个信道启动其传输。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Mingxi:

    附件是SCI的TXRX DMA示例:

    e2e.ti.com/.../TMS570LC43_5F00_SCI_5F00_TXRX_5F00_DMA.zip

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

    王工

        1)如何enable块传输完成(BTC)中断,并在BTC ISR中设置标志。

        2)如果没有enable块传输完成(BTC)中断,那么是不是就不需要关心BTC状态,上面代码中步奏4就不需要。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何enable4357如何enable块405.484万块传输405.484万传输完成(BTC)中断并在BTC中设置一个标记[/]。

    设置BTCINTENAS寄存器的位,调用以下API:

    dmaEnableInterrupt (DMA_CH1,BTC,DMA_INTA);

    为BTC中断启用VIM通道:

    ISR预定义用于信道40:

    2)4357)如果没有enable405.484万如果没有enable块405.484万块传输完成(BTC),那么是不是就不需要关心BTC状态,上面代码中步奏4就不需要。

    如果启用了BTC中断,则不需要执行步骤4。

    [/quote]