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.

[参考译文] MSP430FR2355:SPI 主器件 TX 和 RX 到第二个 MSP430 SPI 从器件适用于第一次发送接收、并且由于 USCI42勘误表、我认为随后的器件会使用一个错误的字节而失败?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1473584/msp430fr2355-spi-master-tx-and-rx-to-second-msp430-spi-slave-works-for-the-first-transmit-receive-and-fails-subsequent-ones-with-an-erroneous-byte-i-believe-due-to-usci42-errata

器件型号:MSP430FR2355

工具与软件:

尊敬的论坛:

我有两个 LaunchPad 配置为以24MHz 的频率运行、使用半双工传输轮询方法通过 SPIsending 从主器件到从器件的随机32字节数据包、我认为代码正是 USCI42勘误表的受害者、但不确定。  我已经尝试了一堆不同的方法来解决它没有运气。   

主器件按如下方式进行配置

e2e.ti.com/.../spi_5F00_master_5F00_config.c

发送和接收如下所示:

      memset((void *)txbuff, 0, PACKET_BUFFER_MAX_SIZE);
      memset((void *)rxbuff, 0, PACKET_BUFFER_MAX_SIZE);

      randomizeData((void *)txbuff, PACKET_BUFFER_MAX_SIZE);

      spi_master_Transfer((void *)txbuff, PACKET_BUFFER_MAX_SIZE);
      __delay_cycles(120000);
      spi_master_Receive((void *)rxbuff, PACKET_BUFFER_MAX_SIZE);

      printf("\r\nTX Buffer:\r\n");
      printBuffer((void *)txbuff, PACKET_BUFFER_MAX_SIZE);
      printf("\r\nRX Buffer:\r\n");
      printBuffer((void *)rxbuff, PACKET_BUFFER_MAX_SIZE);

      send_receive_slave = false;

另一个板上的 SPI 接收使用如下中断进行设置:

e2e.ti.com/.../spi_5F00_slave_5F00_config.c

第一次传输工作正常、然后所有后续传输错误且第一个字节错误、如下图所示、我用按钮启动传输。

在第一次传输之后、 UCB0TXBUF 中的地址为0xFF、下一次传输将该值作为第一个字节。  我还没有找到清除方法、在下一次传输之前、外设复位没有清除它? 是否有办法解决此问题或在后续传输之前操作不当?  如果有任何帮助、将不胜感激。

——乔治  

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

    如果我在 ISR 中添加 USCI 复位、我已经能够使它正常工作、但看起来方法不好  

            case USCI_SPI_UCTXIFG:
                if (pSpiSend < PACKET_BUFFER_MAX_SIZE) {
                    UCA0TXBUF = spiBuffer[pSpiSend++];
                } else {
                    UCA0IE &= ~UCTXIE;  // Disable TX interrupts.
                    memset((void *)spiBuffer, 0, PACKET_BUFFER_MAX_SIZE);
                    pSpiSend = 0;
                    // Preload TXBUF with a default value for the next transaction.
                    UCA0TXBUF = 0x00;  // Set this to whatever default is appropriate.
                    
                    UCA0CTLW0 |= UCSWRST;
                    UCA0CTLW0 &= ~UCSWRST;
    
                    UCA0IE |= UCRXIE;   // Re-enable RX interrupts for the next packet.
                }
                break;

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

    在您的从机代码中、您设置了 UCSTEM、但该位仅适用于主模式。 对于4线从运行、您似乎希望您使用 UCMODEx 位。

    仅当您使用该中断时、USCI42问题才会逐渐增大、但事实并非如此。

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

    > UCA0IE |= UCRXIE;//为下一个数据包启用 Re 中断。

    目前、主器件发送的最后一个虚拟字节(0xFF)存在过时的 UCRXIFG。 这将立即触发、并且您将捕获该0xFF 作为新事务的第一个 Rx 字节。 我建议您在这样做之前:

    > UCA0IFG &=~UCRXIFG; //清除过时

    这就是您的 UCSWRST 序列所做的、但这种方式不那么繁琐。

    ---

    大卫所说的一切。

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

    谢谢 David、UCSTEM 为我启用了4线从机选择线路、我的错误肯定会完全消除。  感谢您提供的信息。

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

    谢谢 Bruce、我曾尝试过在几个不同点清除中断标志、但很可能是在错误的点执行此操作、我将进行更改并观察结果如何。