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.

6678 Keystore 官方代码,为什么UART只能发送接收到第一次的UART TX 数据,后来都发送不了了,RX接收数组里的数据不会更新



这是代码的运行结果,跟官方的一样

  • 您应该开启了loopback模式,您的第一次是什么意思?如果是循环发送,确保每次需要把发送TX BUFFER设置成新数据。

    或者设置不同的RX BUFFER测试下呢?

  • 你好,是这样的,我开启了 开启了loopback模式,代码我没变动。


    for(baudRate= DEFAULT_BAUD_RATE; baudRate<5000000; baudRate*=2)
    {
    KeyStone_UART_config(baudRate, bInternalLoopback, UART_USE_EDMA_TO_TX);

    /* Fill the Tx and Rx buffer with inversed data*/
    #if 1
    for(i=0; i<UART_TEST_BUF_BYTE_SIZE; i++)
    {
    UART_Test_Tx_Buf[i]= i+testData+'0';
    UART_Test_Rx_Buf[i]=0;
    }
    #else
    memset(UART_Test_Tx_Buf, testData, sizeof(UART_Test_Tx_Buf));
    memset(UART_Test_Rx_Buf, ~testData, sizeof(UART_Test_Rx_Buf));
    #endif

    /* Send the data through EDMA */

    KeyStone_UART_write(UART_Test_Tx_Buf, UART_TEST_BUF_BYTE_SIZE, TEST_UART_NUM);

    startCycle = TSCL;

    /* poll data from Rx side */
    rxCount= 0;
    correct= 0;
    while(1)
    {
    while(!(localUartRegs->LSR & CSL_UART_LSR_DR_MASK))//DATA IS not READY
    {
    //timeout if the time is more than 4 times of the expected time
    if(TSC_count_cycle_from(startCycle)>
    4*UART_TEST_BUF_BYTE_SIZE*10*(gDSP_Core_Speed_Hz/baudRate))
    {
    printf("UART%d timeout: Tx %d bytes, Rx %d bytes\n",
    TEST_UART_NUM, UART_TEST_BUF_BYTE_SIZE, rxCount);
    return;
    }
    }

    UART_Test_Rx_Buf[rxCount++] = localUartRegs->RBR;

    if(rxCount == UART_TEST_BUF_BYTE_SIZE)
    break;

    }
    // rxCount= KeyStone_UART_read(UART_Test_Rx_Buf,UART_TEST_BUF_BYTE_SIZE, TEST_UART_NUM);

    cycles = TSC_count_cycle_from(startCycle);

    //verfiy the receive data
    for(i = 0; i < rxCount; i++)
    {
    if(UART_Test_Rx_Buf[i] == UART_Test_Tx_Buf[i])
    {
    correct++; //count the number of correct data
    }
    }

    throughput = (unsigned long long)rxCount*8*gDSP_Core_Speed_Hz/
    ((unsigned long long)cycles*1000);

    printf("UART%d: Tx %d bytes, Rx %d bytes, %d correct bytes. Consumes %d cycles, throughput is %dKbps\n",
    TEST_UART_NUM, UART_TEST_BUF_BYTE_SIZE, rxCount, correct, cycles, throughput);

    testData++; //change test data

    我查看了TX 和RX两个定义的发送和接收的数组,只有在第一次循环 115200波特率时,TX和RX的内容一样,在第二次循环后,RX的数组里面的数据不变,而TX的一直在刷新,我 想问下怎么修改配置能实现,不断的发,能不断的接收呢?


  • 1)我看代码中是采用EDMA方式的,请查下EDMA搬移是否正常完成了?

    2)你手动把RX BUFFER中1个值改下,看是否会被新值覆盖呢?

    3) 第2次操作后,correct统计有没有在累加

  • 应该是正常完成了,在第一次循环的时候RX的内容跟TX发送的内容一模一样,第二次循环一开始,我把RX的值全赋值为零,循环后,RX的值都改变了,RX的值和第一次循环EDMATX发送的数据一模一样,也就是说,第二次循环后,EDMA发送到localUartRegs->RBR里的数据没有刷新,还是第一次的值,我想知道为什么呢?