【发布时间】:2021-03-07 08:58:48
【问题描述】:
我正在尝试使用 MPLAB X 将一个简单的 UART 测试程序上传到 PIC24F Curiosity Board,并使用 TeraTerm 验证数据传输。该评估板使用 PIC24FJ128GA204 微控制器。我已确保按照程序中的定义在 TeraTerm 上设置串行端口配置。
对于数据传输,我使用 USB 转 RS-232 UART 电缆连接到我的桌面。我已经仔细检查了我的电缆连接,它们是在程序中定义的。我没有使用电缆上的 +5 Vcc,我已将电缆接地,但我尝试过连接和断开接地。
目前不会传输任何数据,虽然我注意到当我对开发板进行编程时,有时 TeraTerm 会显示一些随机值,我不确定这是否意味着存在能够传输数据的连接或者它只是随机的噪音。
目前,我的UART初始化如下:
#include <xc.h>
#define U_ENABLE 0x8008 // enable UART, BREGH=1, 1 stop, 8 data bits, no parity, RTS/CTS flow control
#define U_TX 0x0400 // enable transmission, clear all flags
#define _XTAL_FREQ 8000000 //set to internal oscillator frequency
//** UART2 RS232 asynchronous communication demonstration
void initialize_UART(void) {
U1BRG = 104; // initialize the baud rate generator to 104, an equivalent value of 9524
U1MODE = U_ENABLE; // initialize the UART module
U1STA = U_TX; // enable the receiver
//****CONFIGURING FOR UART****
//MICROCONTROLLER PIN || UART WIRE
//RP0/RB0 = U1RX
//RP1/RB1 = U1CTS (Clear to send)
//RP2/RB2 = U1TX
//RP3/RB3 = UR1RTS ()
// Unlock Registers (per MCU data sheet)
asm volatile ("MOV #OSCCON, w1 \n"
"MOV #0x46, w2 \n"
"MOV #0x57, w3 \n"
"MOV.b w2, [w1] \n"
"MOV.b w3, [w1] \n"
"BCLR OSCCON, #6") ;
// Configure Input Functions (Table 11-3 in Datasheet)
// Assign U1RX To Pin RP0
//RPINR
RPINR18bits.U1RXR = 0;
// Assign U1CTS To Pin RP1
RPINR18bits.U1CTSR = 1;
// Configure Output Functions (Table 11-4 in Datasheet)
// Assign U1TX To Pin RP2
RPOR1bits.RP2R = 3;
// Assign U1RTS To Pin RP3
RPOR1bits.RP3R = 4;
// Lock Registers
asm volatile ("MOV #OSCCON, w1 \n"
"MOV #0x46, w2 \n"
"MOV #0x57, w3 \n"
"MOV.b w2, [w1] \n"
"MOV.b w3, [w1] \n"
"BSET OSCCON, #6") ;
}
我通过UART发送数据的功能:
char UART_send_char(char a)
{
while (PORTBbits.RB1 == 1); //wait for clear to send
while (U1STAbits.UTXBF); //wait while Tx buffer is full
U1TXREG = a;
return a;
}
我如何在 main() 中测试函数:
int main(void)
{
TRISA = 0;
// init the UART1 serial port
initialize_UART();
// main loop
while (1)
{
PORTAbits.RA10 = 1; //for debugging purposes
UART_send_char('>');
}
}
此程序应不断将字符“>”发送到 TeraTerm 控制台,但我什么也没收到。 RA10 连接到一个 LED,它确实会亮起,所以我知道程序已进入主循环,但没有发送数据。我将配置位设置为以 8 MHz 运行的内部振荡器并禁用了 PLL。 BREGH 设置为 1,因此我使用了第 247 页 datasheet 中给出的波特率发生器的相应公式,其 Fcy 值为 8 MHz/2。
我是 MCU 编程新手,花了几个小时试图解决这个问题,但无济于事,因此非常感谢任何帮助。
【问题讨论】:
-
有史以来最常见的 UART 问题是混淆了 Rx 和 Tx(一个总是将这些混淆了,无论怎么努力,墨菲定律),所以我开始通过使用范围检查两行以查看是否有数据。
-
您的程序可能停留在以下行之一:while (PORTBbits.RB1 == 1); //等待清除发送 while (U1STAbits.UTXBF); //等待 Tx 缓冲区已满 您应该检查 RB1 是否提供所需的逻辑值,以便 UART_send_char 继续进行。
-
感谢您的回复。我认为@Kozmotronik 是正确的,我刚刚检查了 RB1,它是 0,这是 !CTS 行上的逻辑 1,所以它不会继续。但是,其余端口也是 0 V,我不确定这是为什么。
-
请注意,某些端口引脚与不同的片上硬件复用。您必须确保将 RB1 引脚配置为数字输入。例如,大多数与 ADC 复用的引脚默认配置为模拟引脚。所以必须将对应的TRISB位设置为1,ANSBbits.ANSB设置为0,才能使用RB1作为数字输入
-
好消息@Kozmotronik。我确保将 ANSB 位设置为 0 并手动设置 UART 的所有输入和输出(不确定这是否由其他初始化分配处理)。我一直在调试,不知什么原因赋值语句U1TXREG = a;不更新 U1TXREG,它的值保持为 0。U1TXREG 具有位 0-7 的数据位,所以我不确定是否需要写入这些特定位或如何完成。
标签: c microcontroller uart pic mplab