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.

TMS320F28062 UART串口问题

Other Parts Discussed in Thread: TMS320F28062, DRV8301, CONTROLSUITE

TMS320F28062 芯片,采用双串口工作,发送与接收都采用中断方式,。SCIA发送与接收可以正常工作,SCIB发送数据正常 ,问题是SCIB接收数据没有产生中断,请问一下,SCIB在初始化配置与SCIA有什么 不同,需要注意什么地方?

  • 先用示波器测下SCIB对应的RX引脚,看是否有数据发过来。

  • 数据有的,波形也是正常的

  • 那相应的gpio是否配成成uart功能呢

  • 配置了,所有配置参照SCIA配置的

    // GPIO_setMode(obj->gpioHandle,GPIO_Number_18,GPIO_18_Mode_SPICLKA);
    GPIO_setDirection(obj->gpioHandle,GPIO_Number_18,GPIO_Direction_Output);
    GPIO_setMode(obj->gpioHandle,GPIO_Number_18,GPIO_18_Mode_SCITXDB);


    // SPIA CS->Motor1_DRV8301
    // GPIO_setMode(obj->gpioHandle,GPIO_Number_19,GPIO_19_Mode_SPISTEA_NOT);

    GPIO_setPullup(obj->gpioHandle, GPIO_Number_19, GPIO_Pullup_Enable);
    GPIO_setQualification(obj->gpioHandle, GPIO_Number_19, GPIO_Qual_ASync);
    GPIO_setMode(obj->gpioHandle,GPIO_Number_19,GPIO_19_Mode_SCIRXDB);

  • 您中断函数是怎么写的呢?

    有使用FIFO功能?那是否有清标志   

        SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
        SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag

        PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack位

    例程:C:\ti\controlSUITE\device_support\f2806x\v151\F2806x_examples_ccsv5\scia_loopback_interrupts

  • 清标志的,问题是一次中断也没进。

    __interrupt void sciaRxFifoIsrB(void)
    {
    uint16_t rx2_status=0;
    test_c4 = 8 ;
    rece2_time=0;
    rx2_status=SCI_getDataBlocking(mySciB);
    /*
    if(rece2_size<(p_len-1))
    {
    if(r2_mark==0)
    {
    rdataA2[rece2_size] = (rx2_status<<8) & 0xff00 ;
    r2_mark=1;
    }
    else
    {
    rdataA2[rece2_size] = rdataA2[rece2_size] + rx2_status;
    rece2_size=rece2_size+1;
    r2_mark=0;
    }
    }
    */
    SCI_clearRxFifoOvf(mySciB); // Clear Overflow flag
    SCI_clearRxFifoInt(mySciB); // Clear Interrupt flag
    PIE_clearSCIInts(myPie);
    return;
    }

  • 这个是串口配置

    void mx_scib_Init(void)
    {
    mySciB = SCI_init((void *)SCIB_BASE_ADDR, sizeof(SCI_Obj));
    // 1 stop bit, No loopback
    // No parity,8 char bits,
    // async mode, idle-line protocol
    SCI_disableParity(mySciB); //Odd parity
    SCI_setNumStopBits(mySciB, SCI_NumStopBits_One); //One stop bit
    SCI_setCharLength(mySciB, SCI_CharLength_8_Bits);//8 bit

    // enable TX, RX, internal SCICLK,
    // Disable RX ERR, SLEEP, TXWAKE
    SCI_enableTx(mySciB); //enable TX,
    SCI_enableRx(mySciB); //enable RX,
    SCI_enableTxInt(mySciB); //enable TX interrupt
    SCI_enableRxInt(mySciB); //enable RX interrupt
    SCI_enableLoopBack(mySciB);
    SCI_setBaudRate(mySciB,SCI_BaudRate_9_6_kBaud);
    SCI_disableLoopBack(mySciB); // Enable loop back
    SCI_enable(mySciB);
    return;
    }

  • 检查下中断有无使能,确保确实打开了串口时钟。

  • 中断和时钟都开启了,数据发送是正常的,也进入了中断,就是接收不行,不进入中断