Embedded PIC18f45k22带64Mhz时钟的串行帧错误

Embedded PIC18f45k22带64Mhz时钟的串行帧错误,embedded,serial-port,clock,pic18,Embedded,Serial Port,Clock,Pic18,我正试图通过pic18f45k22 eusart外围设备传输串行数据。当时钟以16Mhz的频率运行时,消息完全按照预期发送,但如果我将PLL设置为on(以便振荡器以64Mhz的频率运行),则会出现帧错误 我已经更改了SPBRG寄存器,以考虑新的时钟频率Y,并尝试将波特率生成器更改为16位和8位模式,但毫无乐趣 当前代码: OSCCONbits.IRCF = 0b111; //change Fosc to 16Mhz OSCTUNEbits.PLLEN = 1; //enable PLL to m

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

我已经更改了SPBRG寄存器,以考虑新的时钟频率Y,并尝试将波特率生成器更改为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

我不熟悉那个特定的芯片,但总的来说,这就是我在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没有锁定。如果只是有点偏离,那么公式可能是错误的


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

我不熟悉那个特定的芯片,但总的来说,这就是我在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没有锁定。如果只是有点偏离,那么公式可能是错误的

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