c2000 SCIa与PC端通信,接收标志RXDY一直为零,RX wake已经置1

c2000 SCIa与PC端通信,接收标志RXDY一直为零,RX wake已经置1

此问题尚无答案
All Replies
  • 秀才151分

    是否是配置有问题?用的C2000 launchpad TMS320F28027开发板

    读到数据才进行发送

    串口灯闪,PC端有数据发出,但是mcu收不到,接收标志RXDY一直为零,而RX wake已经置1

    独立测试发送是,发送正常

    而测试读数据时却收不到,这是为什么呢?请各位大神帮忙看下,本人新手,现在被搞糊涂了。。。

    #include "DSP28x_Project.h" // Device Headerfile and Examples Include File
    #include <stdio.h>
    #include <file.h>

    #include "f2802x_common/include/adc.h"
    #include "f2802x_common/include/clk.h"
    #include "f2802x_common/include/flash.h"
    #include "f2802x_common/include/gpio.h"
    #include "f2802x_common/include/pie.h"
    #include "f2802x_common/include/pll.h"
    #include "f2802x_common/include/sci.h"
    #include "f2802x_common/include/wdog.h"

    void scia_init(void);
    uint16_t sciaTx_Ready(void);//发送标志判断函数
    uint16_t sciaRx_Ready(void);
    void msdelay(Uint16 n);//延时函数

    uint16_t sdataA; // Send data for SCI-A
    uint16_t rdataA; // Received data for SCI-A
    uint16_t Rx_flag=0;//数据读取标志,待读取0/已读取1(1可发送)

    ADC_Handle myAdc;
    CLK_Handle myClk;
    FLASH_Handle myFlash;
    GPIO_Handle myGpio;
    PIE_Handle myPie;
    SCI_Handle mySci;

    void main(void)
    {
    // uint16_t i,j;

    CPU_Handle myCpu;
    PLL_Handle myPll;
    WDOG_Handle myWDog;

    // Initialize all the handles needed for this application
    myAdc = ADC_init((void *)ADC_BASE_ADDR, sizeof(ADC_Obj));
    myClk = CLK_init((void *)CLK_BASE_ADDR, sizeof(CLK_Obj));
    myCpu = CPU_init((void *)NULL, sizeof(CPU_Obj));
    myFlash = FLASH_init((void *)FLASH_BASE_ADDR, sizeof(FLASH_Obj));
    myGpio = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
    myPie = PIE_init((void *)PIE_BASE_ADDR, sizeof(PIE_Obj));
    myPll = PLL_init((void *)PLL_BASE_ADDR, sizeof(PLL_Obj));
    mySci = SCI_init((void *)SCIA_BASE_ADDR, sizeof(SCI_Obj));
    myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));

    // Perform basic system initialization
    WDOG_disable(myWDog);
    CLK_enableAdcClock(myClk);
    (*Device_cal)();

    //Select the internal oscillator 1 as the clock source
    CLK_setOscSrc(myClk, CLK_OscSrc_Internal);

    // Setup the PLL for x10 /2 which will yield 50Mhz = 10Mhz * 10 / 2
    PLL_setup(myPll, PLL_Multiplier_12, PLL_DivideSelect_ClkIn_by_2);

    // Initialize GPIO
    GPIO_setPullUp(myGpio, GPIO_Number_28, GPIO_PullUp_Enable);
    GPIO_setPullUp(myGpio, GPIO_Number_29, GPIO_PullUp_Disable);
    GPIO_setQualification(myGpio, GPIO_Number_28, GPIO_Qual_ASync);
    GPIO_setMode(myGpio, GPIO_Number_28, GPIO_28_Mode_SCIRXDA);
    GPIO_setMode(myGpio, GPIO_Number_29, GPIO_29_Mode_SCITXDA);

     scia_init();        // Init SCI-A

    for(;;)
    {

    if((sciaTx_Ready() == 1)&&(Rx_flag == 1))
    {
    SCI_putDataBlocking(mySci, rdataA); // Send data
    Rx_flag = 0;
    msdelay(1000);
    msdelay(1000);
    }

    if(sciaRx_Ready() == 1)
    {
    rdataA = SCI_getData(mySci);
    Rx_flag = 1;
    }
    }
    }

    void scia_init()
    {
    CLK_enableSciaClock(myClk);

    // 1 stop bit, No loopback
    // No parity,8 char bits,
    // async mode, idle-line protocol
    SCI_disableParity(mySci);
    SCI_setNumStopBits(mySci, SCI_NumStopBits_One);
    SCI_setCharLength(mySci, SCI_CharLength_8_Bits);

    // enable TX, RX, internal SCICLK,
    // Disable RX ERR, SLEEP, TXWAKE
    SCI_enableTx(mySci);
    SCI_enableRx(mySci);
    SCI_enableTxInt(mySci);
    SCI_enableRxInt(mySci);
    //SCI_disableRxInt(mySci);

    /* SCI_enableLoopBack(mySci);*/

    // SCI BRR = LSPCLK/(SCI BAUDx8) - 1
    #if (CPU_FRQ_60MHZ)
    SCI_setBaudRate(mySci, (SCI_BaudRate_e)194);
    #elif (CPU_FRQ_50MHZ)
    SCI_setBaudRate(mySci, SCI_BaudRate_9_6_kBaud);
    #elif (CPU_FRQ_40MHZ)
    SCI_setBaudRate(mySci, (SCI_BaudRate_e)129);
    #endif

    SCI_enable(mySci);

    return;
    }

    uint16_t sciaTx_Ready(void)
    {
    uint16_t i;

    if(SciaRegs.SCICTL2.bit.TXRDY == 1)

    {
    i = 1;
    //返回 1 说明发送器已经准备就绪,可以接收新的数据进行发送
    }
    else
    {
    i = 0;
    }

    return(i);
    }

    uint16_t sciaRx_Ready(void)
    {
    uint16_t i;

    if(SciaRegs.SCIRXST.bit.RXRDY == 1)
    {
    i = 1;

    //返回 1 说明发送器已经准备就绪,可以接收新的数据进行发送
    }
    else
    {

    i = 0;
    }

    return(i);

    }

    //延时函数
    void msdelay(Uint16 n)
    {
    int i,j;
    for(i=n;i>0;i--)
    {
    for(j=0;j<1000;j++);
    }
    }

  • 探花12190分

    用示波器测下rx引脚的电平信号 ,或者复位一下看是否正常?

  • 秀才151分

    十六进制发送,串口发送12时,管脚信号如图所示

  • 秀才151分

    Hi,Han

    十六进制发送,在串口发送数字12时,rx引脚信号如图

  • 探花12190分

    desheng yang,

    从这我为看出哪里有问题,我的建议是你先将发送函数注释掉,先调试接受数据,通过寄存器看RXRDY,以及buffer中是否有数据填充过来,另外从pc端发送数据时,注意设置串口助手的波特率,奇偶校验等。

  • 秀才151分

    波特率等两边都设置一样的,而且可以发,单独设置为接收,也收不到,是管脚坏了吗?

  • 探花12190分

    应该不会,发出来的数据正确吗?

  • 秀才151分

    发出的数据正确的,因此我也找不不到原因

  • 探花12190分

    那更换下芯片测试,看是否是管脚的问题。

  • 秀才151分

    好的,Thanks Han. 我有空再试试