1

我在使用 PIC 18F87J50 的项目中遇到问题,特别是在我与它的 2 个 USART 通道协调时。

有2个主要问题。

1.) 无法设置目标波特率:

我正在使用 Open1USART() 和 Open2USART() 函数来初始化我正在使用的两个 USART 通道。我希望它们都配置为 14,400 波特。这些函数有 2 个参数。第一个是配置 USART 的位字段(异步与同步模式、8 位与 9 位等)。第二个是配置 USART 波特率的 SPBRG 值(取决于系统时钟速率)。

我打电话给两个像:Open1USART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_LOW & USART_RX_INT_ON & USART_TX_INT_OFF, 346);

在我的设置中,SPBRG 的 346 似乎给了我 14,400 波特(在 O 型示波器上证实,一位的宽度约为 70us)。

问题是这只适用于 USART 2。在 USART 1 上,相同的 SPBRG 值给了我 57,600 的波特率。此外,在使用 SPBRG 值(并查看示波器时序以了解实际波特率影响)时,我看到了一些有趣的事情。

波特率随着我将 SPBRG 值从 0 增加而降低。SPBRG 为 87 给我 57,600 波特,173 -> 28,800 ......但它在大约 255 处重置。在 255 时,我的波特率约为 19,000。但是在 256 时,我的波特率非常高(~1,000,000)。然后,当我将 SPBRG 数字进一步向上移动时,波特率会越来越慢,但永远不会低于 19,000 波特标记,也永远不会一直下​​降到我需要的 14,400。

好的,所以我溢出了 SPBRG 字节,对吧?但是 USART 1 和 2 的配置方式完全相同,我可以在 USART 2 上使用 > 255 的 SPBRG 值。它们都具有相同的 BRGH 设置(低)和 BRG16 设置(高)。此外,根据这篇文章(PIC18F2680 上的 UART 接收中没有触发中断),似乎 TRISC6-7 是正确设置的重要位。我按照帖子的建议设置了这些(6 低,7 高)。

如果有帮助,我可以分享一些代码片段。

2.) ISR 不为每个传入字节触发:

我为 USART1 和 2 打开了 UART RX 中断。我没有以正确的波特率在 USART1 上说话,所以没有收到我的外围设备的回复。但是,在 USART2 上,我正在以 14,400 波特率说话,并且我的外围设备正在适当地回复(通过范围验证)。通过示波器,我可以看到我希望收到的所有 16 个字节,并且在线上的时序看起来很棒。但是,我的这个端口的 RX 中断只触发前 2 或 3 个字节。我需要连续接收 8 个字节才能知道外围设备正在回复什么......但我从来没有超过 2 或 3。

所以中断正在触发,但不是针对所有字节。

我知道我需要保持我的 ISR 非常短,以免错过下一个传入字节的中断,但即使我将 ISR 剥离到它的核心功能(删除调试打印输出等),我仍然只看到前 3 个字节。在示波器上,我可以看到前 3 个字节和其余字节之间没有区别(至少在位时序上没有)。前三个字节的值始终为 0xFF(这是预期的)。其余字节是不同的值,但这是我能看到的唯一区别,它并不能真正解释为什么没有 ISR 触发器。上面提到的另一个问题的链接当然似乎也与这个问题有关。但 ISR 正在触发,但并非一直如此。

您可以提供的任何帮助或见解将不胜感激,我将与我的客户再次核对,以确保我可以添加更多代码片段。

4

0 回答 0