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.

[参考译文] MSP430F5503:SPI RX 问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1422799/msp430f5503-spi-rx-problem

器件型号:MSP430F5503

工具与软件:

我使用 MSP430F5503的 SPI 作为 UCB1接口上的从器件、并进行以下配置。

 UCB1IFG &= ~UCRXIFG;

    UCB1CTL1 = UCSWRST;                         // Enable SW reset - Starts config mode
    UCB1CTL0 = UCSYNC + UCCKPH + UCMODE_2; 
    UCB1RXBUF = 0x00;
    UCB1TXBUF = 0x00;
    UCB1CTL1 &= ~UCSWRST;               // **Initialize USCI state machine** - restart usci with new settings

    _NOP();
    UCB1IE |= UCRXIE ;        // UCB1 RX & TX Interrupt enable

程序启动时、SPI 正常工作、发送和接收功能正常。 按预期运行。 勘误表中的 USCI40错误也不会发生、并且作为从器件发送不受影响。

在无限期(有时是2小时、有时是1天)之后、微控制器会停止通过 SPI 正确接收数据。 我已经使用逻辑分析仪检查了这一点、如下所示:

但是、微控制器接收的不是0xBC、而是0x78二进制、而是0b1011 1100、它得到的值是0b0111 1000。 您可以看到字节突然向左移动了一位。 SPI 复位无济于事;只需重启 MSP430即可解决问题。

通过 SPI (即 TX)进行传输仍有效。

在下面、我再次添加了 SPI 中断的代码。 也许我已经在这里犯了一个重大错误。

#pragma vector=USCI_B1_VECTOR
__interrupt void USCI_B1_interrupt(void)
{

    switch(__even_in_range(UCB1IV,4))
    {
        case 0: break;                          // Vector 0 - no interrupt
        case 2:

            //////////////////////////
            //// SPI RX Interrupt ////
            //////////////////////////
//            LPM0_EXIT;

            if(knx_txstate != KNX_TXSTATE_IDLE && knx_txstate != KNX_TXSTATE_WAIT)
            {
                __delay_cycles(200 cyclesPerUs);
                ncn51_tx_nextbyte(true);
            }
            else
            {
                UCB1TXBUF = 0x00;
            }

            // Byte received, read and clear flag
            char rxbyte;
            rxbyte = UCB1RXBUF;
            if(rxbyte == 0xBC){
                knx_txstate = KNX_TXSTATE_WAIT;

            }

            LED2_ON;

            // store into ringbuffer
            if(ringbufferIsFull(&spi_rx_buf) || (utilNormalizeOverflowDiffInt(TA0R, lastReceive) < 1000 ticksPerUs) && knx_txstate != KNX_TXSTATE_IDLE){
            _NOP()
            }
            else{
                lastReceive=TA0R;
                ringbufferPushElement(&spi_rx_buf,(unsigned char *) &rxbyte);

            }
            break;


        case 4:
    //////////////////////////
    //// SPI TX Interrupt ////
    //////////////////////////
        default: break;
    }
}

我的想法已经用完了。 也许有人有想法、或者能给我一些关于我可以尝试的技巧。 如果需要更多信息、我当然会尽快提供。

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

    您好!

    我能看到关于错误数据的波形吗?

    我认为这可能是时钟、CS 和数据的时序误差造成的。

    此致、

    Zoey

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

    不幸的是、我目前没有图片。 当问题发生时、我会获取一个并与您分享。

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

     在左侧、是出错期间的图像;在右侧、是 MSP430正确接收所有内容时的图像。

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

    很抱歉、左侧图像仍然是0xBC、所以我想确认是否只有 MCU 会收到错误的数据、逻辑分析会收到正确的数据。

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

    不幸的是、这是我所面临的问题。 根据逻辑分析仪、数据完全正确、但在某个时刻、MCU 决定不正确地解释数据并将0xBC 转换为0x78。

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

    主机发送的频率如何?

    该延迟(200us?) 在读取 RXBUF 之前、有一个位需要考虑。 如果主器件 在此期间发送另一个字节、我很确信您会得到这个字节。

    如果你确实需要在 ISR 内部进行延迟、我建议你在做之前先读取 RXBUF。

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

    主设备会在我按下按钮时发送命令。 两字节电报之间的时间为1.2ms。 我把200微秒移到了一个计时器中、以便 SPI 中断不会被延迟。  

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

    此外、我在端口2.0上将 CS 线路指定为中断、并在引脚变为高电平后复位 SPI 模块。 这导致问题发生得更快。 同样在我看来、当主设备发送某些内容、而从设备也想要发送某些内容时、问题发生的速度会更快。

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

    我现在已经发现、当错误发生时、SPI 中断会在第7个时钟上升沿之后触发。 当它工作时、它按预期运行、并在第8个上升沿后触发。 我无法解释为什么会发生变化。

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

    有一个第8个时钟边沿不是使用逻辑分析仪捕获的、但 SPI 端口是捕获的。 可能就这么早、就解释了位移结果。

    鉴于您对数据的可能依赖性的提示、我怀疑 SPI 端口在 STE 置位后启用其 SOMI 驱动程序的时间左右。

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

    遗憾的是、我在示波器上或逻辑分析仪的模拟值中未看到该附加时钟。 我现在已经发现以下情况始终发生在'SPI'中断触发器(在第8个上升沿之后)和'SPI'中断触发器(在第7个上升沿之后)'之间:

    主器件发送两个字节、暂停24微秒、而从器件忙、因此它不会立即触发 SPI 中断、而是在稍后触发。 在第二个字节之后、它不再触发中断、从那时起、所有后续传输都始终在第七个时钟上触发中断。

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

    您似乎是在使用 STE 信号来帧字节。 在 MSP430上则不执行该操作。 当 STE 被禁用时、它只是暂停 SPI 端口。 当它再次生效时、移位寄存器将从停止的位置拾取。

    这与我通常使用传感器和 SPI 接口看到的完全不同。

    不确定从器件正忙且未产生中断的具体含义。 当字节到达时、它将设置 RXIFG。 如果代码正忙于执行其他操作、而在下一个字节到达之前未读取 RXBUF、则数据将丢失。 并设置溢出标志。