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.

[参考译文] TMS320F28379D:串行监视器中的半波特率

Guru**** 2487165 points
Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1438279/tms320f28379d-half-baud-rate-in-serial-monitor

器件型号:TMS320F28379D

工具与软件:

尊敬的支持团队:

我使用 TMS320F28379D 微控制器通过 UART 发送通信数据、但我会遇到硬件配置问题。 具体来说、我只能以我设置的波特率的一半接收数据。 我使用 SPI 和 SCI 通信协议。 系统通过 SPI 从传感器读取数据、然后通过 SCI 将数据发送到 CPU。 问题在于、无论我配置的波特率(任何值)如何、我只能在串行监视器上以预期波特率的一半观察数据。

我通过论坛进行了搜索、并尝试了各种解决方案、但无法解决此问题。 我正在使用 HWA 417 UART 模块接收数据、并且正在与运行 Windows 11并安装 FTDI 驱动程序的 x86笔记本电脑建立通信。

由于我只能以配置的波特率的一半接收数据、您能否提供有关如何解决此问题的指导?

如果我在 MCU 中使用配置的波特率、则无法接收任何数据。 如何解决此问题?

## device.h file---------------

#include "driverlib.h"

#if (!defined (CPU1)&&!defined (CPU2))
#error "必须在项目属性中定义 CPU1或 CPU2。 否则、\
您头文件中的偏移将不准确。"
#endif

#if (已定义(CPU1)&&已定义(CPU2))
#error "您已在项目属性中定义了 CPU1和 CPU2。 仅\
应定义单个 CPU。"
#endif

//
//
//定义引脚编号和其他 GPIO 配置
//
//
//
// LED
//
#ifdef _LAUNCHXL_F28379D
#define DEVICE_GPIO_PIN_LED1 31u // LD10的 GPIO 编号
#define DEVICE_GPIO_PIN_LED2 34u // LD9的 GPIO 编号
#define DEVICE_GPIO_CFG_LED1 GPIO_31_GPIO31 //对于 LD10、使用"pinConfig"
#define DEVICE_GPIO_CFG_LED2 GPIO_34_GPIO34 //对于 LD9、"pinConfig"
#else
#define DEVICE_GPIO_PIN_LED1 31u // LD2的 GPIO 编号
#define DEVICE_GPIO_PIN_LED2 34u // LD3的 GPIO 编号
#define DEVICE_GPIO_CFG_LED1 GPIO_31_GPIO31 //对于 LD2、使用"pinConfig"
#define DEVICE_GPIO_CFG_LED2 GPIO_34_GPIO34 //对于 LD3、"pinConfig"
#endif


//
//针对 FTDI 芯片上的 USB 到 UART 适配器的 SCI
//
#ifdef _LAUNCHXL_F28379D
#define DEVICE_GPIO_PIN_SCIRXDA 43U // SCI RX 的 GPIO 编号
#define DEVICE_GPIO_PIN_SCITXDA 42U // SCI TX 的 GPIO 编号
对于 SCI RX、#define DEVICE_GPIO_CFG_SCIRXDA GPIO_43_SCIRXDA //"pinConfig"
对于 SCI TX、#define DEVICE_GPIO_CFG_SCITXDA GPIO_42_SCITXDA //"pinConfig"
#else
#define DEVICE_GPIO_PIN_SCIRXDA 28U // SCI RX 的 GPIO 编号
#define DEVICE_GPIO_PIN_SCITXDA 29u // SCI TX 的 GPIO 编号
#define DEVICE_GPIO_CFG_SCIRXDA GPIO_28_SCIRXDA // SCI RX 的"pinConfig"
对于 SCI TX、#define DEVICE_GPIO_CFG_SCITXDA GPIO_29_SCITXDA //"pinConfig"
#endif

//
// CAN-A 和 CAN-B 的 GPIO 分配
//
#ifdef _LAUNCHXL_F28379D
对于 CANA RX、#define DEVICE_GPIO_CFG_CANRXA GPIO_36_CANRXA //"pinConfig"
对于 CANA TX、#define DEVICE_GPIO_CFG_CANTXA GPIO_37_CANTXA //"pinConfig"
#define DEVICE_GPIO_CFG_CANRXB GPIO_17_CANRXB//"pinConfig"(对于 CANB RX)
#define DEVICE_GPIO_CFG_CANTXB GPIO_12_CANTXB // CANB TX 的"pinConfig"
#else
对于 CANA RX、#define DEVICE_GPIO_CFG_CANRXA GPIO_30_CANRXA //"pinConfig"
对于 CANA TX、#define DEVICE_GPIO_CFG_CANTXA GPIO_31_CANTXA //"pinConfig"
#define DEVICE_GPIO_CFG_CANRXB GPIO_10_CANRXB//"pinConfig"(对于 CANB RX)
#define DEVICE_GPIO_CFG_CANTXB GPIO_8_CANTXB // CANB TX 的"pinConfig"

//I2CA GPIO 引脚
#define DEVICE_GPIO_PIN_SDAA 104.
#define DEVICE_GPIO_PIN_SCLA 105

#define DEVICE_GPIO_CFG_SDAA GPIO_104_SDAA
#define DEVICE_GPIO_CFG_SCLA GPIO_105_SCLA


//I2CB GPIO 引脚
#define DEVICE_GPIO_PIN_SDAB 40.
#define DEVICE_GPIO_PIN_SCLB 41.

#define DEVICE_GPIO_CFG_SDAB GPIO_40_SDAB
#define DEVICE_GPIO_CFG_SCLB GPIO_41_SCLB

#endif

//
//
//与时钟配置相关的定义
//
//
//
// Launchpad 配置
//
#ifdef _LAUNCHXL_F28379D

//
// 10MHz XTAL on LaunchPad。 与 SysCtl_getClock()一起使用。
//
#define DEVICE_OSCSRC_FREQ 10000000U

//
//定义传递到 SysCtl_setClock()。 将按如下方式配置时钟:
// PLLSYSCLK = 10MHz (XTAL_OSC)* 40 (IMULT)* 1 (FMULT)/2 (PLLCLK_BY_2)
//
#define DEVICE_setCLOCK_CFG (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT (40)|\
SYSCTL_FMULT_NONE | SYSCTL_SYSDIV (2)|\
SYSCTL_PLL_ENABLE)

//
//基于上述 device_setclock_CFG 的200MHz SYSCLK 频率。 更新了
//如果使用了不同的时钟配置、请执行以下代码!
//
#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 40 * 1)/2)

//
// controlCARD Configuration (控制卡配置)
//
#else

//
// controlCARD 上的20MHz XTAL。 与 SysCtl_getClock()一起使用。
//
#define DEVICE_OSCSRC_FREQ 20000000U

//
//定义传递到 SysCtl_setClock()。 将按如下方式配置时钟:
// PLLSYSCLK = 20MHz (XTAL_OSC)* 20 (IMULT)* 1 (FMULT)/2 (PLLCLK_BY_2)
//
#define DEVICE_setCLOCK_CFG (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT (20)|\
SYSCTL_FMULT_NONE | SYSCTL_SYSDIV (2)|\
SYSCTL_PLL_ENABLE)

//
//基于上述 device_setclock_CFG 的200MHz SYSCLK 频率。 更新了
//如果使用了不同的时钟配置、请执行以下代码!
//
#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 20 * 1)/2)

#endif

//
//基于上述 DEVICE_SYSCLK_FREQ 和默认值的50MHz LSPCLK 频率
//低速外设时钟分频器4。 如果是、更新以下代码
//使用不同的 LSPCLK 分频器!
//
#define DEVICE_LSPCLK_FREQ (DEVICE_SYSCLK_FREQ/4)

//
//
//调用 sysctl_delay()以实现以微秒为单位的延迟的宏。 宏
//将所需的延迟(以微秒为单位)转换为预期的计数值
//按函数。 \b x 是要延迟的微秒数。
//
//
#define DEVICE_DELAY_US (x) SYSCTL_DELAY (((( long double)(x)/(1000000.0L /\
(long double) DEVICE_SYSCLK_FREQ))- 9.0L)/ 5.0L)

我将在 UART 传输中使用此配置、但仍然无法在全波特率上接收数据  

使用文件的 API -------------------------------------------------------

void initSCIB (void){
GPIO_setMasterCore (SCITX、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_18_SCITXDB);
GPIO_setDirectionMode (SCITX、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (SCITX、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (SCITX、GPIO_QUAL_ASYNC);

GPIO_setMasterCore (SCIRX、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_19_SCIRXDB);
GPIO_setDirectionMode (SCIRX、GPIO_DIR_MODE_IN);
GPIO_setPadConfig (SCIRX、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (SCIRX、GPIO_QUAL_ASYNC);

SCI_setConfig (SCIB_BASE、DEVICE_LSPCLK_FREQ、BAUDRATE_CONFIG、
SCI_CONFIG_WLEN_8 | SCI_CONFIG_STOP_ONE | SCI_CONFIG_PAR_NONE);

SCI_enableModule (SCIB_BASE);
SCI_resetChannels (SCIB_BASE);

SCI_enableFIFO (SCIB_BASE);
SCI_setFIFOInterruptLevel (SCIB_BASE、SCI_FIFO_TX0、SCI_FIFO_RX8);

SCI_enableInterrupt (SCIB_BASE、SCI_INT_RXFF | SCI_INT_TXFF);
SCI_enableInterrupt (SCIB_BASE、SCI_INT_RXERR);

SCI_disableLoopback (SCIB_BASE);

SCI_performSoftwareReset (SCIB_BASE);
}

如何解决半波特率问题? 我已经在 TI 中尝试了示例程序、 但同样的问题仍然存在。