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的SCI1串口DMA接收问题

Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN, TMS570LS1227

用非DMA方式中断接收数据能进SCI1接收中断,配置为DMA方式后就不行了,下面是我的SCI1和DMA配置代码

void Init_SCI1(void)
{
    sciREG1->GCR0 = 0U;
    sciREG1->GCR0 = 1U;

    /** - Disable all interrupts */
    sciREG1->CLEARINT    = 0xFFFFFFFFU;
    sciREG1->CLEARINTLVL = 0xFFFFFFFFU;

    /** - global control 1 */
    sciREG1->GCR1 =  (uint32)((uint32)1U << 25U)  /* enable transmit */
                  | (uint32)((uint32)1U << 24U)  /* enable receive */
                  | (uint32)((uint32)0U << 10U)  //多缓冲模式
                  | (uint32)((uint32)1U << 5U)   /* internal clock (device has no clock pin) */
                  | (uint32)((uint32)(2U-1U) << 4U)  /* number of stop bits */
                  | (uint32)((uint32)0U << 3U)  /* even parity, otherwise odd */
                  | (uint32)((uint32)0U << 2U)  /* enable parity */
                  | (uint32)((uint32)0U << 1U);  /* 同步模式*/

    /** - set baudrate */
    sciREG1->BRS = 74;//487U;  /* baudrate */

    /** - transmission length */
    sciREG1->FORMAT = 7;  /* length */

    /** - set SCI1 pins functional mode */
    sciREG1->PIO0 = (uint32)((uint32)1U << 2U)  /* tx pin */
                 | (uint32)((uint32)1U << 1U); /* rx pin */

    /** - set SCI1 pins default output value */
    sciREG1->PIO3 = (uint32)((uint32)0U << 2U)  /* tx pin */
                 | (uint32)((uint32)0U << 1U); /* rx pin */

    /** - set SCI1 pins output direction */
    sciREG1->PIO1 = (uint32)((uint32)0U << 2U)  /* tx pin */
                 | (uint32)((uint32)0U << 1U); /* rx pin */

    /** - set SCI1 pins open drain enable */
    sciREG1->PIO6 = (uint32)((uint32)0U << 2U)  /* tx pin */
                 | (uint32)((uint32)0U << 1U); /* rx pin */

    /** - set SCI1 pins pullup/pulldown enable */
    sciREG1->PIO7 = (uint32)((uint32)0U << 2U)  /* tx pin */
                 | (uint32)((uint32)0U << 1U); /* rx pin */

    /** - set SCI1 pins pullup/pulldown select */
    sciREG1->PIO8 = (uint32)((uint32)1U << 2U)  /* tx pin */
                 | (uint32)((uint32)1U << 1U);  /* rx pin */

    /** - set interrupt level */
    sciREG1->SETINTLVL = (uint32)((uint32)0U << 26U)  /* Framing error */
                      | (uint32)((uint32)0U << 25U)  /* Overrun error */
                      | (uint32)((uint32)0U << 24U)  /* Parity error */
                      | (uint32)((uint32)1U << 9U)  /* Receive */
                      | (uint32)((uint32)0U << 8U)  /* Transmit */
                      | (uint32)((uint32)0U << 1U)  /* Wakeup */
                      | (uint32)((uint32)0U << 0U);  /* Break detect */

    /** - set interrupt enable */
    sciREG1->SETINT = (uint32)((uint32)0U << 26U)  /* Framing error */
                   | (uint32)((uint32)0U << 25U)  /* Overrun error */
                   | (uint32)((uint32)0U << 24U)  /* Parity error */
                   | (uint32)((uint32)1U << 18U)//SET RX DMA ALL
                   | (uint32)((uint32)1U << 17U)//SET RX DMA
                   | (uint32)((uint32)1U << 9U)  /* Receive */
                   | (uint32)((uint32)0U << 1U)  /* Wakeup */
                   | (uint32)((uint32)0U << 0U);  /* Break detect */

    /** - initialize global transfer variables */
    g_sciTransfer_t[0U].mode   = (uint32)0U << 8U;
    g_sciTransfer_t[0U].tx_length = 0U;
    g_sciTransfer_t[0U].rx_length = 0U;


    /** - Finaly start SCI1 */
    sciREG1->GCR1 |= 0x80U;
}

void Init_DMA_Channl0(unsigned char *source_address)
{
    struct dmaCTRLPKT DMA_CTRL;
    //dmaEnableECC();//使能ECC校验
    DMA_CTRL.SADD      = (uint32)(&(sciREG1->RD)) + dest_addr_offfset;//初始化源地址
    DMA_CTRL.DADD      = (uint32)(source_address);//初始化目标地址
    DMA_CTRL.FRCNT     = 0;
    DMA_CTRL.ELCNT     = 10;//每10个字节为一个数据包
    DMA_CTRL.CHCTRL    = 0;//选择通道0
    DMA_CTRL.RDSIZE    = ACCESS_8_BIT;//接收一个字节为一个最小单位
    DMA_CTRL.WRSIZE    = ACCESS_8_BIT;//发送一个字节为一个最小单位
    DMA_CTRL.TTYPE     = FRAME_TRANSFER;//一个请求触发一个帧传送
    DMA_CTRL.ADDMODERD = ADDR_FIXED;//源地址模式为固定
    DMA_CTRL.ADDMODEWR = ADDR_INC1;//目标地址为增量方式
    DMA_CTRL.AUTOINIT  = AUTOINIT_OFF;
    DMA_CTRL.PORTASGN  = PORTB_READ_PORTA_WRITE;//端口分配外设读,内存写
    dmaSetCtrlPacket(DMA_CH0, DMA_CTRL);
    dmaEnableInterrupt(DMA_CH0,FTC,DMA_INTB);
    dmaReqAssign(DMA_CH0,DMA_REQ28);//SCI1接收位于Line28
    dmaSetPriority(DMA_CH0,HIGHPRIORITY);
    vimChannelMap(33,33, &DMA_Channl0_ISR);
    vimEnableInterrupt(33, SYS_FIQ);//快速中断模式
}

vimREG->FIRQPR1 = (uint32)((uint32)SYS_IRQ << 0U)//channel_32
                    | (uint32)((uint32)SYS_FIQ << 1U)//DMA0配置为快速中断模式
                    | (uint32)((uint32)SYS_IRQ << 2U)//channel_34
                    | (uint32)((uint32)SYS_IRQ << 3U)//channel_35
                    | (uint32)((uint32)SYS_IRQ << 4U)//channel_36

vimREG->REQMASKSET1 = (uint32)((uint32)0U << 0U)
                        | (uint32)((uint32)1U << 1U)//使能DMA中断
                        | (uint32)((uint32)0U << 2U)
                        | (uint32)((uint32)0U << 3U)
                        | (uint32)((uint32)0U << 4U)

另外,DMA配置的是硬件请求模式,中断向量表也是初始化了的,大家帮我看看会是哪里问题,谢谢