主题中讨论的其他器件: MSP430F5510
工具与软件:
大家好、
我正在尝试通过 UART 在我的 MSP430F5358芯片和另一个微控制器(Atmel AtxMega32e5)之间实现串行通信。 我在 Uart0上设置了接收中断、以便接收来自其他微控制器的消息。 消息的测量单位是字节、即当一个字节到达 Uart_Rx 引脚时触发中断。 其串行工作的波特率为115.2KHz (与 Atmel 串行设置的波特率相同)->每个位的持续时间约为8.6us。
我遇到的问题是、当我收到"long"消息时、串行似乎溢出、无法跟上到达的字节(这些字节逐渐保存在循环缓冲区中)。 消息的最后一部分始终是脏的、这意味着整个实现的消息解析协议不能正常工作、从而在接收到的消息的帧上返回错误。
示例(短消息):
实际收到的消息(用示波器查看):
0x55、0x02、0x7F (消息标签)、0x03
在 UART0的 dubug 中读取的消息:
0x55、0x02、0x7F (消息标签)、0x03 (确定!!)
示例(长消息):
实际收到的消息(用示波器查看):
0x55、0x02、0xB0 (消息标签)、0x00、0x00、 0x00、0x00、0x03
在 UART0的 dubug 中读取的消息:
0x55、0x02、0xB0 (消息标签)、0x00、0x00 (缺少3个字节!!)
目前、我已验证了以下内容:
-两个串行端口的波特率是精确的且相同的(等于115.2KHz);
-接收中的中断函数响应并正常工作,从而得到每个传入字节的正确时序(通过在每次执行中断时插入一个 GPIO 引脚切换来验证);
-不存在可能导致接收时序出现问题的虚假中断;
这是 UART 设置的函数:
空洞 InitUartMan (无效)
{
UCA0CTL1 |= UCSWRST;//禁用 USCI 模块、启用设置更改
UCA0CTL0并且=~μ s UC7BIT; // 8位数据
UCA0CTL1 |= UCSSEL__ACLK; // UCLK = ACLK
UCA0BRW_L = BAUDIB115; // 115200bps 波特率@ ACLK = 4096000Hz。
UCA0BRW_H = BAUDI0;
UCA0MCTL = 0x00;
UCA0CTL1 &=~(UCSWRST); //启用 USCI 模块、禁用设置更改
UCA0IE |= UCRXIE; //接收中断使能、发送中断禁用
AckCmdMan = 0; //初始化命令状态
}
以下为为 UART0接收而编写的中断函数:
#pragma VECTOR=USCI_A0_VECTOR
_interrupt void UartRx0 (无效)
{
char rxchar;
rxchar = UCA0RXBUF; //保存接收到的字节。
*InpkcqMan.wr++= rxchar; //输入数据的循环缓冲。
if (InpkcqMan.wr>InpkcqMan.top)
InpkcqMan.wr = InpkcqMan.bot;
}
如果任何人有任何建议,给我解决这个问题,我会感激!
非常感谢!!
Matteo