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.

3137的SCI的DMA发送问题

Other Parts Discussed in Thread: HALCOGEN, TMS570LS3137

程序是参考HALCOGEN的spiDMA的例子写的,SCI初始化已经设置了TX_DMA_EN,和multiBuffer 模式,未设置发送中断(设置了也试过),Debug查看DMA的Pend寄存器发现为0,感觉没有DMA的请求产生,我查看DataSheet上面说只要TXRDY为1或实际发送字节数达到设置的字节数就可以产生DMA请求,debug下查看TXRDY已为1。单独向ScilinREG->TDx[0]赋值可以引发发送操作.

main

{

dmaEnable();

dmaReqAssign(0,0);

dmaConfigCtrlPacket((uint32)(TX_DATA),(uint32)(&(ScilinREG->TDx[0],D_SIZE);

dmaSetCtrlPacket(DMA_CH0,g_dmaCTRLPKT);

dmaSetChEnable(DMA_CH0,DMA_HW);

sciInit();

}

void dmaConfigCtrlPacket(uint32 sadd,uint32  dadd,uint32 dszie)

{

dmaCTRLPKT.SADD=sadd;

dmaCTRLPKT.DADD=dadd;

dmaCTRLPKT.FRCNT=1;

dmaCTRLPKT.ELCNT=sadd;

dmaCTRLPKT.ELDOFFSET=0;

dmaCTRLPKT.ELSOFFSET=0;

dmaCTRLPKT.FRDOFFSET=0;

dmaCTRLPKT.FRSOFFSET=0;

dmaCTRLPKT.PORTASGN=4;

dmaCTRLPKT.RDSIZE=ACCESS_8BIT;

dmaCTRLPKT.WRSIZE=ACCESS_8BIT;

dmaCTRLPKT.TYPE=FRAME_TRANSFER;

dmaCTRLPKT.ADDMODERD=ADDR_FIXED;

dmaCTRLPKT.ADDMODEWR=ADDR_FIXED;

dmaCTRLPKT.AUTOINIT=AUTOINIT_ON;

}

 

}

 

  • Xiaofeng,

        你好,首先非常感谢你选择我们的Hercules产品。

    对于你遇到的问题,我有以下几点建议,仅供参考:

    1. 首先向问一下你需要发送的数据时一个数组还是说单个的数。这个直接影响你在配置DMA模块时,源地址和address mode的配置。这个你可以参考我们Halcogen自带的关于MIBSPI+DMA的例子。这个例子你可以在HALCOGEN的安装路径下找到。

    2. DMA的配置函数里面,ELEMENT的数据大小应该是等于你需要发送的数据的个数。

    3. 如果你发送的是数组,同时采用的是一个Frame,已经多个Element的形式,你在设置element offset时,需要注意。

    谢谢!

    Ken 

  • 我发现我看的datasheet 是TMS570LS31X21X_Technical_Reference_manual 中没有提及DMA Request Line Connect ,我以为设置了硬件的地址CPU就可以自动对应了,我后来参看了TMS570LS3137的datasheet ,这个datasheet介绍很简单,但是提及了DMA Request Line Connect,

    上述文档未提及DMA channel的硬件初始连接设置;

    是否有较为完整的3137的datasheet

    还有使用SCI的multiBuf的模式我修改了Reg_Sci.h中的sciBase的结构体成一致的,但是每次HALCodeGen 会将其改回,使用/*Use Code Start 0*/ 这种方式也没有用,是否有好的方法

  • Xiaofeng,

      你好,

        1. 对于你说的关于DMA channel 硬件连接的问题,你可以在3137的datasheet里面关于DMA的章节里找到关于DMA request line connection的一张表格(page 95),SCI DMA的request line分别是 30和31。

        2. 对于SCI的multibuffer 模式,我们比较少用到,所以HALCOGEN现在的版本暂时还不支持。如果你通过手动添加的话,很有可能是不太好用的。同时为了更好的帮助你解决遇到的问题,如果可以的话,你能不能把你的工程文件上传,这样我们可以很方便的帮你找到问题所在。

    谢谢,

    Ken

  • Xiaofeng,

       刚做了例程,经测试能够在RM49L952上运行,仅供参考:

    sciInit();
    load_data();
    /* - DMA Configuration */

    /* Enable DMA */
    dmaEnable();

    /* assigning dma request: channel-0 with request line - 1 - TX*/
    /* DMA Request 29 is for LIN ( SCI2) Transmit */
    /* Refer Data sheet - Default DMA Request Map section */
    dmaReqAssign(DMA_CH0,29);

    /* - configuring dma control packets */
    g_dmaCTRLPKT.SADD = (uint32)(&TX_DATA); /* source address */
    g_dmaCTRLPKT.DADD = (uint32)(&scilinREG->TD); /* destination address */
    g_dmaCTRLPKT.CHCTRL = 0; /* channel control */
    g_dmaCTRLPKT.FRCNT = D_SIZE; /* frame count */
    g_dmaCTRLPKT.ELCNT = 1; /* element count */
    g_dmaCTRLPKT.ELDOFFSET = 0; /* element destination offset - is required? */
    g_dmaCTRLPKT.ELSOFFSET = 0; /* element source offset - is required? */
    g_dmaCTRLPKT.FRDOFFSET = 0; /* frame detination offset - is required? */
    g_dmaCTRLPKT.FRSOFFSET = 0; /* frame source offset - is required? */
    g_dmaCTRLPKT.PORTASGN = 4; /* port b */
    g_dmaCTRLPKT.RDSIZE = ACCESS_8_BIT; /* read size */
    g_dmaCTRLPKT.WRSIZE = ACCESS_8_BIT; /* write size */
    g_dmaCTRLPKT.TTYPE = FRAME_TRANSFER ; /* transfer type */
    g_dmaCTRLPKT.ADDMODERD = ADDR_INC1; /* address mode read */
    g_dmaCTRLPKT.ADDMODEWR = ADDR_FIXED; /* address mode write */
    g_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF; /* autoinit (loop) */
    dmaSetCtrlPacket(DMA_CH0,g_dmaCTRLPKT);
    /* - setting dma control packets for transmit */
    dmaSetCtrlPacket(DMA_CH0,g_dmaCTRLPKT);

    /* - setting the dma channel to trigger on h/w request */
    dmaSetChEnable(DMA_CH0, DMA_HW);

    /* Enable TX DMA */
    scilinREG->SETINT = (1 << 16);

    如果有任何问题,请提出,我们在一起探讨。

    谢谢

    Ken

  • 不好意思,我上次回复时问题已经解决,没有表达清楚。我只是抱怨一下为什么
    要看两个DataSheet,互相对比!!有没有讲的比较全的datasheet。

  • HI XiaoFeng,

    你说两个Datasheet是有点误解了。MCU文档有Datasheet和TRM(Uers Guide)两部分。

    Datasheet主要是介绍芯片的基本信息、参数等。

    TRM是用户使用手册,是介绍MCU如何使用。

    两个文档都是全的,因为是不同的用途。

    Regards,

    Jay

  • 你好 

    我原来使用的是multibuf模式,已经OK,按照你的代码改为scilinReg->TD的单字节就是不行,

    从寄存器来看,Frame的传输DMAFLAG已经置位,且DMA的读地址已经加1,就是scilinReg->TD还是为0.串口无数据,

    是否可以将工程打包给我参考,是否SCIinit中有不同