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.

[参考译文] CC3220SF-LAUNCHXL:如何通过UART1从外部设备正确接收数据并存储到缓冲区

Guru**** 2551110 points
Other Parts Discussed in Thread: CC3220SF-LAUNCHXL

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1098039/cc3220sf-launchxl-how-to-properly-receive-data-and-store-to-buffer-from-external-device-via-uart1

部件号:CC3220SF-LAUNCHXL

我试图做一些相对简单的事情,但肯定是遗漏了一些东西。  

我有一个CC3220SF-LAUNCHXL项目,该项目建立在亚马逊FreeRTOS上(与SimpleLink SDKv 2.10 .00.04 一起运行),并通过UART连接到外部调制解调器。 CC3220的调制解调器上的线绕引脚16和17被配置 为UART1。 我有一个连接的内窥镜,可以清楚地看到CC3220正在将AT命令正确地传输到调制解调器(开始时,我只是将“ATE0”发送到调制解调器),并且调制解调器正在响应“\r\nOK\r\n",这是我的问题开始的地方。

对于UART1,我已启用FIFO并将级别设置为1/8 (2字节),我可以在UARTA1DR (数据)寄存器中看到至少正在接收字符(出现'O'和'K')。 但是,当我的中断触发时,我尝试使用UART_CONTROL和 UART_CMD_GETRXCOUNT,它返回0表示可用字节数。 如果我试图调用UART_READ,并且将size参数设置为1 (读取一个字节),则回调可能永远不会执行,因为由于某种原因事务从未完成。

我在查找类似的示例时遇到了问题,例如此设置。 一般而言,通过UART与外部设备通信的预期设置/流程是什么?

这是我的UART配置功能。 大部分的实际功能都没有填好,现在我只是想接收一个字符/字符串并将其存储到缓冲区,但不清楚如何正确地执行此操作。 回调函数与中断应执行什么操作? 我应该只使用中断还是回调?

/ *-----------------------------------------------------------*/

static CellularCommInterfaceError_t prxOpenCellularUart(void)
{
CellularCommInterfaceError_t xRetVal = IOT_COMM_INTERFACE_SUCCESS;
UART_Params xUartParams = {0};

UART_Params_init(&xUartParams);

// Read config
xUartParams.readMode = UART_MODE_CALLBACK;
xUartParams.readTimeout = UART_WAIT_FOREVER;
xUartParams.readCallback = uart_rx_cb;
xUartParams.readReturnMode = UART_RETURN_NEWLINE;
xUartParams.readDataMode = UART_DATA_TEXT;
xUartParams.readEcho = UART_ECHO_OFF;

// Write config
xUartParams.writeMode = UART_MODE_BLOCKING;
xUartParams.writeTimeout = UART_WAIT_FOREVER;
xUartParams.writeCallback = NULL;
xUartParams.writeDataMode = UART_DATA_TEXT;

// Protocol config
xUartParams.baudRate = CELLULAR_BAUD_RATE;
xUartParams.dataLength = UART_LEN_8;
xUartParams.stopBits = UART_STOP_ONE;
xUartParams.parityType = UART_PAR_NONE;
xUartParams.custom = NULL;

/* RX is enabled by default */
xCellularUartHandle = UART_open(CELLULAR_UART_INDEX,
&xUartParams);

// Set 6mA drive strength and Pull-Up Resistor for Tx pin
PinConfigSet(CELLULAR_UART_TX_PIN,
PIN_STRENGTH_6MA,
PIN_TYPE_STD_PU);

if(NULL == xCellularUartHandle)
{
xRetVal = IOT_COMM_INTERFACE_DRIVER_ERROR;
}
else
{
UARTDisable(CELLULAR_UART_BASE);

// Set up UART Rx Interrupt
// Disable Rx
UART_control(xCellularUartHandle,
UART_CMD_RXDISABLE,
NULL);

// Enable FIFOs
UARTFIFOEnable(CELLULAR_UART_BASE);

// Set Rx trigger level to 1/8 (2 bytes)
UARTFIFOLevelSet(CELLULAR_UART_BASE,
UART_FIFO_TX1_8,
UART_FIFO_RX2_8);

// // Disable all interrupt sources
UARTIntDisable(CELLULAR_UART_BASE,
0xFFFFFFFF);

// Enable receive interrupt
UARTIntEnable(CELLULAR_UART_BASE,
UART_INT_RX);

// Hook up interrupt handler
UARTIntRegister(CELLULAR_UART_BASE,
prvProcessUartInt);

// Clear interrupt flags
UARTIntClear(CELLULAR_UART_BASE,
UART_INT_RX);

UART_control(xCellularUartHandle,
UART_CMD_RXENABLE,
NULL);

UARTEnable(CELLULAR_UART_BASE);
}

return xRetVal;
}

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

    您好Daniel:

    我已将此主题分配给主题专家,并将很快为您提供答案。

    巴西,

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

    虽然我仍然对更多的解释感兴趣,但我还是能够让它发挥作用。

    无需更改我的设置功能,我就可以使用以下中断处理程序从调制解调器持续接收数据:

    static void prvProcessUartInt(void) {
    
        uint16_t uart_int_status = UARTIntStatus(CELLULAR_UART_BASE, false);
        
        // Receive Data
        if(uart_int_status & UART_INT_RX)
        {
            UARTIntClear(CELLULAR_UART_BASE, UART_INT_RX);
            
            while(UARTCharsAvail(CELLULAR_UART_BASE))
            {
                pucRxBuffer[read_count] = UARTCharGetNonBlocking(CELLULAR_UART_BASE);
                read_count++;
            }
        }
    
    }

    我很肯定这不是一个理想的处理方法,但它使我能够取得进展。 这里的区别是我使用了driverlib函数UARTCharsAvail()和UARTCharGetNonBlocking(),它们只是较低的级别。 在完全相同的上下文中,UART_READ和UART_CONTROL命令代码 UART_CMD_GETRXCOUNT不能完成我尝试的任何操作。 我认为我仍在做一些错误的事情,但同时我不相信额外的驱动程序功能不会像读取UART FIFO中的数据那样简单地使事情变得过于复杂。

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

    您好Daniel:

    Simplelink SDK v 2.10 非常旧,不再受支持。 因此,很难确切地说出问题是什么。  如果您想更好地了解更高级别的驱动程序,我建议您安装最新的SDK。  

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

    我确实希望这最终至少与问题有重大关系。 我确实尝试更新到最新的驱动程序,但在让我的Amazon FreeRTOS项目构建时遇到了无数问题(此处单独发布: https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/109.5969万/cc3220sf-launchxl-attempting-to-upgrade-amazon-freertos-project-simplelink-drivers-from-v2_10_00_04-to-v6_10_00_05)3220)。 在发布该帖子之后,我还尝试更新 到4.30 v.00.06 ,但遇到了相同的构建问题。 这是一罐蠕虫,我不打算将其解开,因为还有其他原因。

    无论SDK版本如何, 是否有一个示例项目,用于使用UART驱动程序与外部设备进行接口的理想/预期方式? 我发现现有的示例UART项目 由于 是CC3220的本地组件,而且它们的一般简单性很差。

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

    除了每个SDK版本提供的示例之外,我没有发现其他示例。