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.

[参考译文] LAUNCHCC3220MODASF:关于 UART 多处理器格式通信

Guru**** 2581345 points
Other Parts Discussed in Thread: CC3220S

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/987281/launchcc3220modasf-about-uart-multiprocessor-format-communication

器件型号:LAUNCHCC3220MODASF
主题中讨论的其他器件:CC3220S

大家好、

我想以"多处理器格式"使用 UART。
(数据的第一个字节通过奇偶校验位1发送。
随后的数据在奇偶校验位设置为0的情况下被发送。)

Code Composer Studio 版本:10.2.0.00009
SimpleLink CC32xx SDK (4.40.00.07)

因此、我将程序从"C:\ ti\ simplelink_cc32xx_sdk_4_40_00_07\ examples \ RTOS \ CC3220S_LAUNCHXL \ drivers \ uartecho"更改为并对其进行了测试。

 *  ======== uartecho.c ========
 */
#include <stdint.h>
#include <stddef.h>

/* Driver Header files */
#include <ti/drivers/GPIO.h>
#include <ti/drivers/UART.h>

/* Driver configuration */
#include "ti_drivers_config.h"

#include <ti/devices/cc32xx/inc/hw_memmap.h>
#include <ti/drivers/uart/UARTCC32XXDMA.h>
#include <ti\devices\cc32xx\inc\hw_uart.h>

/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)
{
    char        input;
    const char  echoPrompt[] = "Echoing characters:\r\n";
    UART_Handle uart;
    UART_Params uartParams;

    /* Call driver init functions */
    GPIO_init();
    UART_init();

    /* Configure the LED pin */
    GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /* Create a UART with data processing off. */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_RETURN_FULL;
    uartParams.baudRate = 115200;

    uart = UART_open(CONFIG_UART_0, &uartParams);

    if (uart == NULL) {
        /* UART_open() failed */
        while (1);
    }

    /* Turn on user LED to indicate successful initialization */
    GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);

    UART_write(uart, echoPrompt, sizeof(echoPrompt));

	input = '5';

    /* Loop forever echoing */
    while (1) {
//        UART_read(uart, &input, 1);
		UARTParityModeSet( UARTA0_BASE, UART_PAR_ONE );				//Step1
        UART_write(uart, &input, 1);								//Step2
		UARTParityModeSet( UARTA0_BASE, UART_PAR_ZERO );			//Step3
        UART_write(uart, &input, 1);								//Step4
		usleep(20000);
    }
}

当我单步执行"步骤2"行时、发送了1个字节。 这是 UART 的 TX 线。

接下来、当我单步执行"步骤3"行时、TX 线变为低电平。
我不知道原因。

则"步骤4"行不起作用。
当我步入时、UART 忙时出现错误。

请告诉我如何以多处理器格式进行通信。

谢谢你
Seitaro

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

    您好、Seitaro-San、

    如果您首先将 UART 外设启动到 UART_PAR_ZERO 中、是否能够正确执行步骤1和步骤2?

    导致问题的最可能原因是启用 UART 外设时不应重新配置该外设。 有关 UART 控制和线路控制寄存器的文档、请查看 TRM 的第6.3.6和6.3.7节、了解详情: www.ti.com/lit/swru465

    如果在切换奇偶校验之前禁用 UART 外设、是否能够执行步骤3-4?

    此致、

    Michael

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

    您好、Michael、
    感谢您的回复。


    我使用"UART_open"函数将 parityType 设置为 UART_PAR_ZERO。
    将1个字符的传输添加为"Step0"。

        /* Create a UART with data processing off. */
        UART_Params_init(&uartParams);
        uartParams.writeDataMode = UART_DATA_BINARY;
        uartParams.readDataMode = UART_DATA_BINARY;
        uartParams.readReturnMode = UART_RETURN_FULL;
        uartParams.baudRate = 115200;
        uartParams.parityType = UART_PAR_ZERO;                          //Initialize
    
        uart = UART_open(CONFIG_UART_0, &uartParams);
    
        if (uart == NULL) {
            /* UART_open() failed */
            while (1);
        }
    
        /* Turn on user LED to indicate successful initialization */
        GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
    
        UART_write(uart, echoPrompt, sizeof(echoPrompt));
    
    	input = '5';
    
        /* Loop forever echoing */
        while (1) {
    //        UART_read(uart, &input, 1);
            UART_write(uart, &input, 1);                                //Step0
    		UARTParityModeSet( UARTA0_BASE, UART_PAR_ONE );				//Step1
            UART_write(uart, &input, 1);								//Step2
    		UARTParityModeSet( UARTA0_BASE, UART_PAR_ZERO );			//Step3
            UART_write(uart, &input, 1);								//Step4
    		usleep(20000);
        }
    

    执行此操作后、TX 线如下所示:
    第一个字符发送时奇偶校验= 0、第二个字符发送时奇偶校验= 1。
    之后、TX 线变为低电平。

    (我想粘贴示波器屏幕、但未显示"upload"按钮。

    这一次我将在没有图像的情况下进行解释。)


    然后我尝试了以下操作:

    我在"UARTParityModeSet"函数之前调用了"UARTDisable"函数、之后调用了"UARTEnable"函数。
    结果与以前相同。

        /* Loop forever echoing */
        while (1) {
    //        UART_read(uart, &input, 1);
            UART_write(uart, &input, 1);                                //Step0
            UARTDisable(UARTA0_BASE);
    		UARTParityModeSet( UARTA0_BASE, UART_PAR_ONE );				//Step1
    		UARTEnable(UARTA0_BASE);
            UART_write(uart, &input, 1);								//Step2
            UARTDisable(UARTA0_BASE);
    		UARTParityModeSet( UARTA0_BASE, UART_PAR_ZERO );			//Step3
            UARTEnable(UARTA0_BASE);
            UART_write(uart, &input, 1);								//Step4
    		usleep(20000);
        }
    

    当我单步执行"Step3"旁边的"UARTEnabl"函数时、TX 线变为低电平。

    我单步执行"UART Enable"功能。 当我在"driverlib \ uart.c"的第469行启用 UART 时、TX 线路变为低电平。

    还有什么可以检查的吗?
    此致、

    Seitaro

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

    您好、Seitaro-San、

    查看您的测试、似乎切换到 UART_PAR_ZERO 会导致问题。 如果我正确理解了您的结果、在测试1中、您可以发送1个带奇偶校验0的字节、1个带奇偶校验1的字节、但在您尝试将奇偶校验设置为奇偶校验0后、会导致 TX 线路变为低电平。

    在测试2中、您重复了相同的测试、但这次在执行奇偶校验更改之前禁用 UART、但仍然遇到相同的结果、这是正确的吗?

    多处理器格式 UART 是否是您的项目的严格要求? 如果事实证明这种行为是错误、鉴于问题的低层次性质、可能很难修复、因此最好调查变通办法或其他实现目标的方法。

    此致、

    Michael

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

    您好、Michael、
    感谢您的回复。

    TEST1的结果和 TEST2的结果都符合您的理解。
    针对 TEST1和 TEST2获得的波形是相同的。
    (我今天能够上传。)

    一年前、我向客户交付了使用"多处理器格式 UART"的 RS-485通信系统。

    我需要将 CC3220连接到 RS-485。
    (配备 RS-485的 CC3220原电路板已经开发和制造。)

    您能告诉我此问题的解决方法吗?
    (如果此行为是错误、我将考虑另一种方法、如建议。)  

    此致、

    Seitaro

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

    您好、Seitaro-San、

    您还可以尝试更改正在使用的 UART 驱动程序。 与 CC3220 SDK 一起分发的实际上有三个 UART 驱动程序-常规 UART 驱动程序、启用了 DMA 的 UART 驱动程序以及 UART2驱动程序。 如果您尝试使用"Use DMA"选项启用 DMA 以切换驱动程序、您是否会看到行为发生任何变化。

    最后,您可以使用调试器检查 UART 控制寄存器,以确保 UARTParityModeSet()函数实际按预期工作。 调用该函数时、它将修改 UART_O_LCRH 寄存器。 如果您在调试模式下检查该寄存器、是否在步骤3后正确设置? 此外、UART 寄存器的其余部分看起来是否正确?

    此致、

    Michael

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

    您好、Michael、
    感谢您的回复。

    我尝试了启用了 DMA 的 UART 驱动程序。
    每个字符之间的间距已增加、但波形相同。


    然后、我使用调试器检查 UART 控制寄存器。
    调用"UARTParityModeSet (UARTA0_BASE、UART_PAR_ZERO);"后、"UARTLCRH 寄存器"的值不正确。
    "UART 发送中断"位为1。
    TX 线变为低电平的神秘已经得到解决。

    我在"UARTParityModeSet"函数的参数中犯了错误。

    错误的参数
    UARTParityModeSet (UARTA0_BASE、UART_PAR_1);
    UARTParityModeSet (UARTA0_BASE、UART_PAR_ZERO);

    更正了参数
    UARTParityModeSet (UARTA0_BASE、UART_CONFIG_PAR_1);
    UARTParityModeSet (UARTA0_BASE、UART_CONFIG_PAR_ZERO);

    我必须使用该文件中的定义。
    " C:\ ti \ simplelink_cc32xx_sdk_4_40_00_07 \ source \ ti\ devices \ cc32xx \ driverlib \ uart.h

    现在可以将奇偶校验位从0设置为1、将1设置为0进行传输。

    感谢您的建议。
    谢谢您、我解决了这个问题。

    Seitaro