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.

[参考译文] LP-CC1312R7:有关 TI CC1312R7 UART Rx 问题的咨询

Guru**** 2415390 points
Other Parts Discussed in Thread: CC1312R7, SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1528401/lp-cc1312r7-inquiries-regarding-ti-cc1312r7-uart-rx-issues

器件型号:LP-CC1312R7
主题中讨论的其他器件:CC1312R7SysConfig

工具/软件:

你(们)好
我对 TI CC1312R7 的 UART Rx 有疑问。

我们正在开发一个系统、每 100mS 从另一个系统的 Tx 传输 42 字节的数据、并从 TI CC1312R7 UART 接收数据。

顺便说一下、当从 CC1312R7 中的 UART Rx 读取 42 字节数据时、会混合数据。

我进行了检查、这是 32 个字节后数据混合的症状。

解决这个问题的方法是什么?

即使 SysConfig 将 Rx 振铃缓冲区大小修改为 256、这也是相同的现象。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter:

    您使用的是哪个 SDK 版本? 我记得我们之前在 SDK 中修复了类似的错误...

    此致、

    Arthur

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们使用的是 simplelink_cc13xx_cc26xx_sdk_7_41_00_17 版本

    然后、我按了错误的按钮。 此问题尚未解决。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter:

    我懂了。

    您是否可以使用 SDK 8.30 进行测试以查看问题是否仍然存在?

    此致、

    Arthur

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您说过、我使用了最新的 SDK 进行了测试。
    但数据混合的问题是相同的。

    以下代码摘录自您正在处理的代码的 UART 部分

    #define RX_PACKET_SIZE 42
    
    void uartStmRxCallback(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status)
    {
    
    if (status != UART2_STATUS_SUCCESS || count == 0) {
    printf("statis is not UART2_STATUS_SUCCESS and count: %d\n", count);
    return;
    }
    
    enqueuePacket(readUart2STMBuffer);
    
    UART2_read(handle, readUart2STMBuffer, RX_PACKET_SIZE, &bytesRead);
    }
    
    void *uartStmThread(void *arg0)
    {
    UART2_Params uartParams;
    uint32_t status = UART2_STATUS_SUCCESS;
    int32_t semStatus;
    
    semStatus = sem_init(&sem, 0, 0);
    if (semStatus != 0){
    /* Error creating semaphore */
    while (1) {}
    }
    
    /* Create a UART in CALLBACK read mode */
    UART2_Params_init(&uartParams);
    uartParams.baudRate = 230400; //115200; //230400; //230400; //256000;
    uartParams.readReturnMode = UART2_ReadReturnMode_FULL;
    uartParams.writeMode = UART2_Mode_NONBLOCKING;
    uartParams.readMode = UART2_Mode_CALLBACK;
    uartParams.readCallback = uartStmRxCallback;
    uartParams.parityType = UART2_Parity_NONE;
    uartParams.dataLength = UART2_DataLen_8;
    uartParams.stopBits = UART2_StopBits_1;
    
    uartSTM = UART2_open(CONFIG_UART2_1, &uartParams);
    if (uartSTM == NULL)
    {
    /* UART2_open() failed */
    printf("uartSTM Open Faile\n");
    while (1) {}
    } // if (uart == NULL)
    
    printf("\t[recvSTM Start]\n");
    
    uartStmLoop = 1;
    stmConnectFlag = 0;
    
    UARTHEADER pUartHeader;
    uint8_t readByte = 0;
    uint32_t readDataSize = sizeof(UARTHEADER);
    
    //UART2_read(uartSTM, &pUartHeader, readDataSize, &bytesRead);
    //sem_wait(&sem);
    UART2_read(uartSTM, readUart2STMBuffer, RX_PACKET_SIZE, &bytesRead);
    //UART2_read(uartSTM, &rxByte, 1, &bytesRead);
    
    /*while(!stmConnectFlag){ //Check STM
    printf("\t\t Checking STM Connection\n");
    pUartHeader.command = CMD_CONNECT;
    uartStmWrite(&pUartHeader, readDataSize);
    ClockP_usleep(1000000);
    if(stmConnectFlag) break;
    }
    ClockP_usleep(500000);
    
    while(!stmCaptureFlag){ //Check STM
    printf("\t\t Send AudioCapture Command\n");
    pUartHeader.command = CMD_AUDIOCAPTURE;
    uartStmWrite(&pUartHeader, readDataSize);
    ClockP_usleep(1000000);
    if(stmCaptureFlag) break;
    }*/
    uint32_t readTotalSize = 0;
    while(uartStmLoop){
    uint8_t localUart2STMBuffer[RX_PACKET_SIZE];
    dequeuePacket(localUart2STMBuffer);
    uint8_t *data = (uint8_t *)localUart2STMBuffer;
    for(int i = 0; i< RX_PACKET_SIZE; i++){
    printf("data[%02d]: 0x%02x(%3d)\n", i, data[i], data[i]);
    }
    /*for (int i = 0; i < RX_PACKET_SIZE; ++i) {
    parseByte(data[i]);
    }*/
    ClockP_usleep(4000);
    }
    
    return NULL;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter:

    您是否也可以共享 enqueuePacket 方法的实现?

    此致、

    Arthur

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    #define RX_PACKET_SIZE 42
    250

    typedef 结构{
    uint8_t data[RX_packet_size];
    }数据包;

    typedef 结构{
    数据包[packet_queue_size];
    易失性 uint8_t head;
    易失性 uint8_t tail;
    易失性 uint8_t 计数;
    } PacketQueue;
    静态 PacketQueue packetQueue;

    extern void audioDataPut (void * arg);

    bool enqueuePacket (const uint8_t *data){
    如果 (packetQueue.count >= packet_queue_size) 返回 false;

    memcpy (packetQueue.packet[packetQueue.head].data、data、RX_packet_size);
    packetQueue.head =(packetQueue.head + 1)% packet_queue_size;
    packetQueue.count++;
    返回 true;
    }

    bool dequeuePacket (uint8_t *outBuf){
    如果 (packetQueue.count == 0) 返回 false;

    memcpy (outBuf、packetQueu.packet[packetQueue.tail].data、RX_packet_size);
    packetQueue.tail =(packetQueue.tail + 1)% packet_queue_size;
    packetQueue.count--;
    返回 true;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter:  

    您是否可以提供重现问题的样品?

    这可能是由于编译器错误地优化代码中的某些内容...

    此致、

    Arthur