This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F2418:当 UART 锁定时、是否有一个寄存器我应该查看/清除?

Guru**** 2516810 points
Other Parts Discussed in Thread: MSP430F2418

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/818817/msp430f2418-is-there-a-register-i-should-see-clear-when-the-uart-locks-up

器件型号:MSP430F2418

团队、  

您能否就我的客户看到的问题提供一些指导:

我看到一些锁定情况,在这些情况下,我必须重新启动设备以重新获得 RS485通信。 当我将 MSP430F2418置于睡眠模式、然后在访问我们的继电器时将其唤醒并将 RS485总线唤醒时、就会发生这种情况。 它似乎会在恶意尖峰上锁定 UART、如果我发出软件复位、它会将 UART 清除回正常工作状态。

我在勘误 表 http://www.ti.com/lit/er/slaz178p/slaz178p.pdf (请查看 USCI16)中看到、这似乎与相关。

当 UART 锁定时、我应该看到/清除一个寄存器吗?  (我真的不想通过重置主板来弹出 UART)。

谢谢

Viktorija

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Viktorija、

    USCI16勘误表中显示的权变措施是否适用于您的客户?  当 UART 被锁定时、他们是否看到 UCBUSY 标志被置位?

    解决方法:在软件中定期检查 UCBUSY 标志状态。 如果标志被置位并且在预期的时间内没有接收到字符、在软件中复位 USCI 模块。 要复位 USCI 模块、切换 UCSWRST 并重新启用 USCI 中断。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Eddie、  

    客户尝试了这种方法、并得到多个实例、在这些实例中、他切换了 UCSWRST 并重新启用了 USCI;但 UART 仍然被锁定。

    目前、他在主处理器上执行软件复位、似乎可以解决问题。 这不是一个理想的解决方案、所以如果您有任何其他想法-请告诉我。  

    谢谢

    Viktorija

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Viktorija,

    他们重现此问题的频率如何?   

    如果他们仅使用 UART 并删除任何其他代码、是否可以重现此问题?

    它们是如何设置 USCI 寄存器位的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Eddie、  

    它们在20ku 的700u 上看到它

    很难重现这种情况、因为它只发生在现场。他们在实验室中重现它的唯一方法是对 CPU 进行毛刺脉冲(手动使 CPU 弹跳)。  

    下面是它们设置 USCI 的方法:

    •初始化 UART
    •
    •void initUART1_115200( void ){
    •
    •UCA1CTL1 |= UCSSEL_2; //在此示例中,时钟与时钟相同//使其 SMCLK //之前为 UCA1CTL1 |= UCSSEL_1;// CLK = ACLK
    •//常规模式115200波特
    •UCA1BR0 = 0x8A;
    •UCA1BR1 = 0x00;
    •UCA1MCTL = UCBRS_7;
    •
    •//如果要尝试另一种 UART 采样方法,请取消注释
    •//过采样模式115200波特
    •//UCA1BR0 = 0x08;
    •//UCA1BR1 = 0x00;
    •//UCA1MCTL = UCOS16 | UCBRF3 | UCBRF1 | UCBRF0;
    •
    •
    •P3SEL |= 0xC0; // P3.6,7特殊功能
    •P3DIR |= 0x40; // P3.6 TX 输出
    •P3DIR &=~0x80; // P3.7 RX 输入
    •UCA1CTL1 &=~UCSWRST; //**初始化 USCI 状态机**
    •UC1IFG &=~UCA1RXIFG;
    •UC1IE |= UCA1RXIE; //启用 USCI_A1 RX 中断
    •}
    •
    •
    •接收中断
    •
    •#if defined (__MSP430F2418__)
    •#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    •#pragma vector=USCIAB1RX_vector
    •__interrupt void USCI1RX_ISR (#USCISPROC_
    •
    •)(void)#USCI_B1RX_ERROR (void)(UNIFIE_ERROR)(USCIANCE_ERROR)(NOT_INCE_ERROR)#USCIANCE_ERROR (NOT_INCE_INCE_NOT_VERIFIE_NOT_VER_IN_NOT_VERSION
    •
    •)#USC
    •#endif
    •{
    •//从示例代码
    •// while (!(UC1IFG&UCA1TXIFG)); // USCI_A1 TX 缓冲器就绪?
    •//UCA1TXBUF = UCA1RXBUF; // TX -> RXed 字符
    •
    •//接受看门狗计时器。 我们在这里这样做是为了保持一个与
    •使用原始代码的//非 FIFO 相似的运行方式。 理想情况下、我们不想让狗进入 ISR、因为尽管
    •主线程以及整个系统
    •//可能会关闭、但这可能会//使狗保持快乐。
    •//Recall 3 Issue
    •//PET_Watchdog();
    •
    •//检查是否收到错误字符。 如果是、请设置错误标志、并
    •立即返回//。 如果没有、则将字符传输到接收缓冲区并指示
    •//新数据的可用性。
    •if (UCA1STAT & UCRXERR)
    •{
    •//从 Rx 缓冲区中删除接收到的字符并简单地清除所有错误位
    •//虚拟读取接收缓冲寄存器。
    •UCA1RXBUF;
    •}
    •否则
    •{
    •//在指针中创建一个本地"whe-if"版本的接收 FIFO,该版本在中打包 if
    •//需要优化计算开销。
    •U8 rxFifoInPointerTmp = rxFifoInPointer + 1;
    •if (rxFifoInPointerTmp >= RX_FIFO_SIZE)
    •{
    •rxFifoInPointerTmp = 0;
    •}
    •
    •//检查我们是否会覆盖尚未从 FIFO 中读出的数据。 如果
    •//因此忽略传入的数据字节。 如果我们在正常接收的接收 FIFO 中有空间
    •//数据字节。
    •if (rxFifoInPointerTmp == rxFifoOutPointer)
    •{
    •//从 Rx 缓冲区中删除接收到的字符。 很糟糕、我们只是忽略了传入
    •//数据。
    •UCA1RXBUF;
    •}
    •其他
    •{
    •//从 USART 接收缓冲器中获取数据并将其存储在接收 FIFO 中。 为此、请使用
    •//指针中的当前全局变量。
    •rxFifo[rxFifoInPointer]= UCA1RXBUF;
    •
    •//将先前计算的临时 FIFO 存储在指针中,并将其存储到相应的
    •//全局变量。
    •rxFifoInPointer = rxFifoInPointerTmp
    •;}
    •}
    •
    •
    •}发送中断
    •
    •#pragma vector=USCIAB1TX_vector
    •__interrupt void USCIAB1TX (void)
    •{
    •if ((TX_DATA_PTR - DATA_PTR)< DATA_SZ)
    •{
    •UCA1TXBUF =* TX_DATA_PTR++;
    •}
    •其他
    •{
    •transmit _complete = true;
    •
    •UC1IE &=~UCA1TXIE; //关闭 TX 中断,因为没有更多要发送
    •}
    •}
    •
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该主题将脱机查看并更新。