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.

[参考译文] TDA2Sx:为什么 TDA2Sx 上可以使用特定的 UART 波特率?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/963254/tda2sx-why-can-t-i-use-a-specific-uart-baud-rate-on-tda2sx

器件型号:TDA2Sx

SDK: processor_sdk_vision_03_05_00_00  

配置: tda2xx_evm_BIOS_all

SoC:TDA2SX

操作系统:Windows7.

您好!  

在我的测试中 、我需要为 UART RX 的应用添加一些特定的波特率、然后我成功地添加了非预设的波特率、如下所示。

我总共修改了以下6个文件。

TI_components \drivers\pdk_01_10_01_06\packages/ti\drv\bsp_lld\uart\bsp_uart.h

TI_components \drivers\pdk_01_10_01_06\packages/ti\drv\bsp_lld\uart\src\bspdrv_uart.c

TI_components \drivers\pdk_01_10_01_06\packages/ti\drv\bsp_lld\uart\unit_test\uartut\testInput\st_uartConfig.h

TI_components \drivers\pdk_01_10_01_06\packages/ti\drv\bsp_lld\uart\unit_test\uartUt\testLib\st_uart.h

TI_components \drivers\pdk_01_10_01_06\packages/ti\drv\bsp_lld\uart\unit_test\uartUt\testLib\st_uartCommon.c

TI_components \drivers\pdk_01_10_01_06\packages/ti\drv\bsp_lld\uart\unit_test\uartUt\testLib\st_uartParser.c

让我们不要谈论这些变化。 无论如何 ,我非常确信,在我更改之后,可以使用230400 bps。

但我不能使用921600 bps 和3000000 bps, 我非常确信 PC 上的 TX 端支持3000000 bps。

然后、我看到了 TRM 上的表格。

16X 13X 代表什么?  

我如何知道我属于哪一类?  

这是否意味着如果我要使用921600bps、我必须切换到13X?  

如何切换?

如果我可以使用230400 bps、这是否意味着我是16倍? 那么为什么我不能使用3000000 bps?

很抱歉、我一次问了很多问题、但我真的需要这些答案。

请帮助我解决这些问题、谢谢。

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

    您好!  

    此外、我的 UART 初始化函数来自 vision_sdk\links_fw\src\rtos\utils_common\src\utils_uart.c 中的 System_uartInit()

    略有修改、如下所示。

    静态空 PSVT_MMWRadarUART_Init (空)
    {
    UART_ChanParams vChanParams;
    ERROR_Block VEB;
    Gio_Params VIO_Params;
    静态 char vUART_Name[16];//器件名称必须是全局变量或静态变量
    静态 DEV_StructvUART_DevObj;
    静态 GIO_StructvUART_TX_Obj;
    静态 GIO_StructvUART_RX_Obj;
    静态 SyncSem_StructvUART_TX_SyncSemObj;
    静态 SyncSem_StructvUART_RX_SyncSemObj;
    静态信号量结构 vUART_TX_SemObj;
    静态信号量结构 vUART_RX_SemObj;
    静态 IOM 数据包 vUART_TX_IOM_Obj[UART_ASYNC_IOM_PACKET_MAX];
    静态 IOM 数据包 vUART_RX_IOM_Obj[UART_ASYNC_IOM_PACKET_MAX];
    DEV_Params vDevParams;
    UART_Params vUART_Params;
    SyncSem_Params vSyncSemParams;
    Semaphore_Params vSemParams;
    
    uint32 vCookie = 0;
    
    //启用 UART 模块
    PMHALModuleModeSet (MMWRADAR _UART_MODULE、PMHAL_PRCM_MODULE_MODE_ENABLED、
    PM_TIMEOUT_INALEVINLETON_)
    
    //禁用中断
    vCookie = BspOsal_dableInterrupt ();
    
    //Connect IRQ 和 UART 中断
    BspOsal_irqXbarConnect (MMWRADAR_UART_USE_XBAR_IPU、MMWRADAR_UART_USE_XBAR_INT);
    //恢复内部
    BspOsal_restoreInterrupt (vCookie);
    
    //Structit 初始化
    ERROR_INIT (&VEB);
    
    //初始化通道属性。
    Gio_Params_init (&VIO_Params);
    
    //不要再执行它,因为 System_uartInit()已经执行了 UART_init()
    //uart_init();
    
    //设置标识名
    strcpy (vUART_Name、MMWRADAR_UART_NAME);
    
    雷达 TX 引脚的//SET 引脚 MUX
    HW_WR_REG32 (MMWRADAR_TX_PIN_physical 地址、UART_output_setting);
    
    雷达 RX 引脚的//SET 引脚 MUX
    HW_WR_REG32 (MMWRADAR_RX_PIN_physical 地址、UART_INPUT_Setting);
    
    vps_printf ("~~~ PSVT_MMWRadarUART_Init() DevID =%d ~~~\n"、MMWRADAR _UART_ID);
    vUART_Params = UART_Params;
    vUART_Params.opMode = UART_OPMODE_INTERRUPT;
    vUART_Params.hwiNumber = 8;
    vUART_Params.rxThreshold = UART_RXTRIGLVL_8;
    vUART_Params.txThreshold = UART_TXTRIGLVL_56;
    vUART_PARAMS.波特 率= MMWRADAR_UART_USE_BAUDRAATE;
    vUART_Params.prcmDevId = 0;
    
    if (vUART_Params.opMode = UART_OPMODE_polled)
    {
    VPS_printf ("~~~ PSVT_MMWRadarUART_Init()选择轮询模式~~~\n");
    }
    如果(vUART_Params.opMode = UART_OPMODE_INTERRUPT)、则为其他位
    {
    VPS_printf ("~~~ PSVT_MMWRadarUART_Init()选择了中断模式~~~\n");
    }
    
    vUART_Params.enableCache =(bool) false;
    
    //初始化 EDMA 库并获取 EDMA 句柄
    vChanParams.hEdma =空;
    
    //如果使用交叉条事件,则使 isCrossBarIntEn = true 并选择
    //要映射的适当中断号(将其分配给 intNumToBeMapped)
    vChanParams.crossBarEvtParam.isCrossBarIntEn =(bool) false;
    
    vChanParams.crossBarEvtParam.intNumToBeMapped = 0xFFU;
    
    vIO_Params.chanParams =(PTR) vChanParams;
    
    DEV_PARAMS_INIT (_vDevParams);
    vDevParams.deviceParams =&vUART_Params;
    vDevParams.initFxn =空;
    vDevParams.devid = MMWRADAR_UART_ID;
    
    DEV_construct(&vUART_DevObj、vUART_Name、(PTR)&UART_IOMFXNS、&vDevParams、&VEB);
    
    //雷达 TX 初始化
    SyncSem_Params_init (_vSyncSemParams);
    
    Semaphore_Params_init (&vSemParams);
    
    vSemParams.mode = Semaphore_Mode_binary;
    
    Semaphore_construction (&vUART_TX_SemObj、0、&vSemParams);
    
    vSyncSemParams.sem = Semaphore_handle (_vUART_TX_SemObj);
    
    SyncSem_con构(_vUART_TX_SyncSemObj、_vSyncSemParams、&VEB);
    
    VIO_Params.sync = SyncSem_handle_upCast (SyncSem_handle (_vUART_TX_SyncSemObj));
    
    IF (VIO_Params.numPackets > UART_ASYNC_IOM_PACKET_MAX)
    {
    utils_assert (VIO_Params.numPackets <= UART_ASYNC_IOM_PACKET_MAX);
    }
    
    memset (&vUART_TX_IOM_Obj[0]、0、VIO_Params.numPacets * sizeof (IOM_Packet));
    VIO_Params.packets =&vUART_TX_IOM_Obj[0];
    
    //为雷达创建所需的通道 TX
    Gio_construction (&vUART_TX_Obj、vUART_Name、(uint32) GIO_output、&VIO_Params、&VEB);
    
    //雷达 RX 初始化
    SyncSem_Params_init (_vSyncSemParams);
    
    Semaphore_Params_init (&vSemParams);
    vSemParams.mode = Semaphore_Mode_binary;
    
    Semaphore_construction (&vUART_RX_SemObj、0、&vSemParams);
    
    vSyncSemParams.sem = Semaphore_handle (&vUART_RX_SemObj);
    
    SyncSem_con构(_vUART_RX_SyncSemObj、_vSyncSemParams、&VEB);
    
    VIO_Params.sync = SyncSem_handle_upCast (SyncSem_handle (_vUART_RX_SyncSemObj));
    
    memset (&vUART_RX_IOM_Obj[0]、0、VIO_Params.numPacets * sizeof (IOM_Packet));
    VIO_Params.packets =&vUART_RX_IOM_Obj[0];
    
    //为雷达创建所需的通道 RX
    Gio_construction (&vUART_RX_Obj、vUART_Name、(uint32) GIO_input、&VIO_Params、&VEB);
    
    vUART_TX_Handle = GIO_Handle (_vUART_TX_Obj);
    vUART_RX_Handle = GIO_Handle (_vUART_RX_Obj);
    
    if ((vUART_RX_Handle == NULL)||(vUART_TX_Handle == NULL)
    {
    VPS_printf ("~~~ PSVT_MMWRadarUART_Init() GIO_create (%s)失败~~~\n"、
    vUART_Name);
    }
    其他
    {
    vInitDone =(bool) true;
    }
    
    VPS_printf ("~~~ PSVT_MMWRadarUART_Init()完成。 ~~~\n");
    } 

    通常、我只需要修改 vUART_PARAMS.波特 率来更改 UART 波特率、我测试了4800bps、9600bps、115200bps 和230400bps 可以更改和使用。


    如果我只需要修改 vUART_Params.baudrate、系统将自动为 我计算适当的波特倍数和 DLH、DLL、

    我不需要手动设置它吗?

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

    您好!

    我将尝试实施相同的操作、然后我将共享所有必需的更改。

    谢谢

    加维拉尤

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

    您好!

    您能否检查以下示例中较高波特率是否起作用?

    TI_components /驱动程序/pdk_01_10_04_05/packages/ti/CSL/example/uart/uart_test

    谢谢

    加维拉尤

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

    您好!  

    我们的硬件团队正在确认硬件的响应时间、可能是硬件导致接收错误。

    但是、我仍然想知道 x16 X13模式和相关设置、正如我之前所问的。

    谢谢。

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

    您好!  

    在我们检查之后、硬件的响应时间会影响更高的波特率 UART 信号、  

    因此、我们删除了部分 NPN、用于保护 SOC。

    然后我使用 CSL 进行测试、测试结果如下。

    我认为这是因为 NPN 的稳定性功能丧失、可接收的460800bps 变得不稳定、并且忽略硬件响应时间921600bps 仍然无法接收。

    无论如何,我的问题仍然是如何为我的应用程序接收更高的波特率,如 PSVT_MMWRadarUART_Init(),如果使用当前硬件,CSL 可以接收460800bps,为什么使用我的应用程序无法接收460800bps?

    这与 x16还是 X13有关?

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

    您好!

    您希望我给您打电话是什么?

    关于您的问题、表中显示的16x 13x 是分频值。  TDA2SX TRM 修订版 G 图24-60显示了波特率生成图(第6041页)、其中对此进行了更详细的描述。  这个除数选择可通过 UART_MDR1[2:0]寄存器进行更改。

    是的、您必须使用13x 来实现921.6 kbps (实际为923.08 kbps)以及460.8 kbps。

    此致、

    石尾

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

    您好!  

    如果我需要 更改应用程序 PSVT_MDR1[2:0]中的 VIA UART_MDR1[2:0]寄存器、我应该何时进行更改?

    还是应尽早设置?

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

    您好!

    我已将您的问题转发给软件团队。

    此致、

    石尾

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

    请查看~μ C/ti_components/drivers/pdk_xx_xx_xx_xx/packages/ti/drv/bsp_LLD/uart/src/bspdrv_uart.c 中的 uartConfigure()

    uartHwSetup()是波特率的配置位置。

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

    您好!  

    我应该直接修改 uartConfigure()和 uartHwSetup()的相关部分,或者从修改宏

    TI_components \drivers\pdk_01_10_01_06\packages/ti\drv\bsp_lld\uart\bsp_uart.h

    我能否直接修改 bsp_uart_pabd_multiplier 和 uart_Oper_mode 的宏?

    还是应该修改 platform_zebu?

    如果我需要修改 platform_zebu、应该在哪个 makefile 中修改它? 此宏看起来是由编译自动生成的。

    此外、当我将模式更改为 X13时、这是否意味着我将无法在 x16模式下使用波特率? 例如用于调试的115200、以及用于其他函数的4800和9600。

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

    不应启用 platform_zebu。

    您可以直接更改 BSP_UART_BAUD_MULTIPPER 和 UART_OPER_MODE。

    我们的 UART 驱动程序不同时支持 X13和 x16。 它是编译时间选项。