1

我正在使用 explorer16/32 evb 并尝试将数据发送到 UART。我尝试了带中断和不带中断的 UART1、UART2 并且一直遇到同样的问题。
看来,为了发送 1 个字节,我需要用移位将它拆分为两个 4 位

代码:

#define FCY 16000000 
#define BAUDRATE 9600
#define BRGVAL ((FCY/BAUDRATE)/16)-1
U2MODE = 0;
U2STA = 0;
U2MODEbits.STSEL = 0;   // 1-Stop bit
U2MODEbits.PDSEL = 0    ;   // No Parity 8 bit data
U2MODEbits.ABAUD = 0;   // Auto-Baud Disabled
U2MODEbits.BRGH  = 1;   // High Speed Mode
U2MODEbits.URXINV = 0;    
U2STAbits.UTXINV = 0;    
U2BRG = BRGVAL;         // Baud Rate Setting for 9600

U2MODEbits.UARTEN = 1;   //Enable UART module
U2STAbits.UTXEN = 1;    //Enable UART TX 


unsigned char putU2(unsigned char c) 
{       

   while (U2STAbits.TRMT == 0)
   {

   }    
   while ( CTS);                
   while ( U2STAbits.UTXBF);    
   U2TXREG = c & 0xF;
   U2TXREG = (c >> 4) & 0xF;
   return c;
}

如果我将数据拆分为 4 位,我可以在 PC 上看到正确的数据(c# 串行端口应用程序),但不应将其拆分为对 U2TXREG 的两次写入。

我不是 100% 确定 FCY 是 16000000,但这是给我合理结果的唯一值。

可能是什么问题呢?

4

1 回答 1

1

对于 PIC24H,在 UART 高速模式 (BRGH = 1) 下,要获得正确的 BRGVAL 值,您需要除以 4,而不是 16。更改第 3 行的公式。此外,100% 确定时钟速率是有帮助的;如果您没有更改配置位,它可能是 8 MHz,而不是 16。

于 2017-12-23T18:28:33.210 回答