我正在尝试通过pic18f45k22 eusart外设传输串口。当时钟以16Mhz运行时,消息将按预期完全发送,但如果我将PLL设置为on(使振荡器以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
答案 0 :(得分: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没有锁定。如果它只是有点偏,那么公式可能是错误的。
它并不多,但希望它能让你朝着正确的方向前进。