Thread 中讨论的其他器件: controlSUITE
工具/软件:
尊敬的 TI 支持团队:
我在 TMS320F28379S 微控制器上使用 SCI-A 进行 UART 通信时遇到了问题。
尽管初始化正确、但我的应用固件中没有通过引脚 84 (SCITXDA) 和 85 (SCIRXDA) 发送或接收数据。
主要问题:
在我的固件中正确配置 SCI-A、执行到达 UART 发送函数、在调试窗口中观察、该值到达 SCI TX 寄存器(“SciaRegs.SCITXBUF.all")“)。
但是、通过 TTL 至 USB 转换器或示波器进行监控时、TX(引脚 84)上没有可观察到的输出。
但是、当使用 具有相同代码(仅修改引脚)的 GPIO 引脚 28 和 29 时、我可以发送和接收数据。
我还尝试使用 controlSUITE 提供的示例代码、结果是相同的。
同一 USB-TTL 适配器可以与其他电路板一起工作、从而确认其正常工作。
硬件设置:
MCU:TMS320F28379S 位于定制 PCB 上
UART 接口:SCI-A
路由到板载 FT232 TTL 到 USB 转换器(确认为 3.3V 逻辑)的 SCI-A TX(引脚 84)和 RX(引脚 85)。
波特率:115200
PC COM 端口设置:已验证–无奇偶校验、1 个停止位
问题:-
1.在应用程序固件中将引脚 84/85 用于 SCI-A TX/RX 是否存在任何已知问题?
2.这些针脚在复位后是否需要特殊的处理或解锁序列?
是否存在可能阻止 UART 输出的内部冲突(例如时钟配置或引脚多路复用问题)?
4.是否有建议的方法来验证引脚电平上的 SCI-A 输出?
感谢您提供任何文档参考或调试建议。 下面是我的代码供参考
#include "F28x_Project.h"
#define SCI_A_BAUD_RATE 115200UL
#define LSPCLK_FREQ 50000000UL // LSPCLK is 50 MHz
#define GPIO_LED_TOGGLE 88
#define GPIO_HEARTBEAT 99
// Function Prototypes
void system_init(void);
void gpio_init(void);
void sci_init(void);
void scia_tx_char(unsigned int a);
__interrupt void sciaRxFifoIsr(void);
// Main Function
void main(void)
{
system_init();
gpio_init();
sci_init();
EALLOW;
PieVectTable.SCIA_RX_INT = &sciaRxFifoIsr;
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; // Enable SCIRXINTA in PIE group 9
IER |= M_INT9; // Enable CPU INT9
EINT; // Enable global interrupt INTM
ERTM; // Enable real-time DBGM
while (1)
{
GpioDataRegs.GPDTOGGLE.bit.GPIO99 = 1; // Heartbeat toggle
scia_tx_char('A'); // Send 'A' as well
DELAY_US(500000); // 0.5s delay
}
}
// Initializes system control and interrupts
void system_init(void)
{
InitSysCtrl(); // Clock, PLL, watchdog
DINT; // Disable interrupts
InitPieCtrl(); // Default PIE setup
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable(); // Populate vector table
}
// GPIO Initialization for LED and SCI
void gpio_init(void)
{
EALLOW;
// LED Toggle Output GPIO88
GpioCtrlRegs.GPCGMUX2.bit.GPIO88 = 0;
GpioCtrlRegs.GPCMUX2.bit.GPIO88 = 0;
GpioCtrlRegs.GPCDIR.bit.GPIO88 = 1;
// GpioCtrlRegs.GPCGMUX2.bit.GPIO84 = 0;
// GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 0;
// GpioCtrlRegs.GPCDIR.bit.GPIO84 = 1;
// Heartbeat GPIO99
GpioCtrlRegs.GPDGMUX1.bit.GPIO99 = 0;
GpioCtrlRegs.GPDMUX1.bit.GPIO99 = 0;
GpioCtrlRegs.GPDDIR.bit.GPIO99 = 1;
// SCIA_TX = GPIO84, SCIA_RX = GPIO85
GpioCtrlRegs.GPCGMUX2.bit.GPIO84 = 1; // 01: SCITXDA
GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 1; // SCITXDA
GpioCtrlRegs.GPCDIR.bit.GPIO84 = 1;
GpioCtrlRegs.GPCGMUX2.bit.GPIO85 = 1; // 01: SCIRXDA
GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 1; // SCIRXDA
GpioCtrlRegs.GPCDIR.bit.GPIO85 = 0;
GpioCtrlRegs.GPCQSEL2.bit.GPIO85 = 3; // Asynchronous
EDIS;
}
// SCI Initialization
void sci_init(void)
{
uint16_t brr = (LSPCLK_FREQ / (SCI_A_BAUD_RATE * 8UL)) - 1;
// FIFO Init
SciaRegs.SCIFFTX.all = 0xE040; // Enable FIFO, reset TX FIFO
SciaRegs.SCIFFRX.all = 0x2061; // Enable RX FIFO, interrupt after 1 byte
// SciaRegs.SCIFFCT.all = 0x0;
SciaRegs.SCIFFCT.all = 0x00;
// Communication Config
SciaRegs.SCICCR.all = 0x07; // 1 stop bit, no parity, 8-bit char, async
SciaRegs.SCICTL1.all = 0x0003; // Enable TX, RX
SciaRegs.SCICTL2.all = 0x0003; // RX/TX interrupt enable
// Baud rate
SciaRegs.SCIHBAUD.all = (brr >> 8) & 0xFF;
SciaRegs.SCILBAUD.all = brr & 0xFF;
// Release from Reset
SciaRegs.SCICTL1.all = 0x0023;
}
// Send one byte via SCI
void scia_tx_char(unsigned int a)
{
// while (SciaRegs.SCIFFTX.bit.TXFFST == 16); // Wait for space
// while (SciaRegs.SCIFFTX.bit.TXFFST >= 16); // Wait for space
while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {}
SciaRegs.SCITXBUF.all = a;
}
// RX Interrupt Service Routine
__interrupt void sciaRxFifoIsr(void)
{
unsigned int rx_data;
while (SciaRegs.SCIFFRX.bit.RXFFST == 0); // Wait for data
rx_data = SciaRegs.SCIRXBUF.all; // Read received byte
scia_tx_char(rx_data); // Echo back
scia_tx_char('A'); // Send 'A' as well
GpioDataRegs.GPCTOGGLE.bit.GPIO88 = 1; // Toggle GPIO88 on RX
// Clear flags
SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1; // Overflow
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // Interrupt flag
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; // Acknowledge interrupt group
}