0

我正在尝试通过 pic18f45k22 eusart 外围设备传输串行。当时钟以 16Mhz 运行时,消息完全按预期发送,但如果我将 PLL 设置为打开(以便振荡器以 64Mhz 运行),则会出现帧错误。

我已经更改了 SPBRG 寄存器以考虑新的时钟频率,并尝试将波特率发生器更改为 16 位和 8 位模式,但没有任何乐趣。

当前代码:

OSCCONbits.IRCF = 0b111; //change Fosc to 16Mhz
OSCTUNEbits.PLLEN = 1; //enable PLL to multiply Fosc by 4


/*Set baud rates and related registers*/
/*For BRG16 = 1 and BRGH = 1, Baud rate = Fosc/(4([SPBRG:SPBRGH]+1)) */
SPBRGH1 = 0; //Set Baud rate control regs to 34 to give baudrate of 115.2k
SPBRG1 = 138;
BAUDCON1bits.BRG16 = 1; //16 bit mode (baudrate generator)
TXSTAbits.BRGH = 1; //Set high speed baud rate 

提前致谢, Huggzorx

4

1 回答 1

4

我不熟悉那个特定的芯片,但总的来说,这是我的 UART 不工作时所看到的。

1)您的时钟能否以足够小的误差分频至波特率。假设您在评论中的波特率公式是正确的,我认为您还可以:

Baud rate = 16 MHz / (4*(34 + 1)) = 114286  (0.8% error)
Baud rate = 64 MHz / (4*(138 + 1)) = 115107 (0.08% error)

2) 确保您的芯片正在产生您认为它应该产生的波特率。有些 PLL 对如何打开它们非常挑剔。错误配置外设也很容易。我发现示波器是诊断此类问题的最佳选择。如果您可以访问一个,请检查 PIC 的发送引脚并检查您的位宽是否为 8.68us (1/115200)。

如果它是那个大小的 4 倍(34.72us),那么你的 PLL 没有锁定。如果它只是有点偏离,那么公式可能是错误的。

这并不多,但希望它能让你朝着正确的方向前进。

于 2011-02-22T20:23:15.220 回答