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.

[参考译文] CCS/MSP430FR5739:SPI:主器件重新启动时、MSP430FR5739中没有 MOSI 数据中断

Guru**** 2563620 points
Other Parts Discussed in Thread: MSP430FR5739

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/603317/ccs-msp430fr5739-spi-no-mosi-data-interrupt-in-msp430fr5739-when-master-restart

器件型号:MSP430FR5739

工具/软件:Code Composer Studio

大家好、

MSP430FR5739通过 SPI 与其他模块(在这里我称之为模块)连接。   A-Module 是主模块、它支持 SPI 时钟并控制 CS 引脚、MSP430FR5739是 slaver.最近我遇到了一个奇怪的问题.

A 模块与 MSP430FR5739进行通信正常、但当 MSP430FR5739保持当前的上电状态(关闭电源、然后再次打开电源)、然后 A 模块重新启动(关闭电源、然后再次打开电源)时、SPI 通信将失败。 失败表示未捕获中断。 MSP430FR5739重新启动将再次正常、但如果保持 MSP430FR5739上电状态并仅启动 A 模块、则 SPI 通信将失败。

下面是我的 A 模块 SPI 初始化和 MSP430FR5739 SPI 初始化。 plz 帮助我。

A 调制:

 VL_ssidevcfg.clkFreq = SSI_SYSTEM_DIV_256;//101562HZ
 VL_ssidevcfg.gpioNumber = CUST_GPIO_SSI_SEL0;
 VL_ssidevcfg.lag = SSI_LAG_1;
 VL_ssidevcfg.lead = SSI_LEAD_1;
 VL_ssidevcfg.clkOn = SSI_SSIMCLK_ON;
 VL_ssidevcfg.mode = SSI_BYTETRANSFER;
 vL_ssidevcfg.rxWidth = 8;
 VL_ssidevcfg.txWidth = 8;
 VL_ssidevcfg.format = SSI_MSBFIRST;
 VL_ssidevcfg.cycleDelay = SSI_ONECYCLE;
 vL_ssidevcfg.clkPolarity = SSI_IDLE_LOW;//----- SPI_CLOCKPOLARITY_INACTION_LOW
 VL_ssidevcfg.wrPolarity = SSI_RISE_EDGE;//--- SPI_PHASE_DATA_Captured_ONFIRST_Changed_ON_NEXT
 VL_ssidevcfg.rdPolarity = SSI_FALLING_EDGE;//--- SPI_PHASE_DATA_Captured_ONFIRST_Changed_ON_NEXT
 VL_ssidevcfg.enPolarity = SSI_ACTIVE_LOW;//--- CS
 VL_ssidevcfg.wireTM 模式= SSI_4WIRE; //--- 4线
 VL_ssidevcfg.pIsrCallbackFct =空;
 cust2_0spiinit (&vl_ssidevcfg);

MSP430FR5739:

/*------ 时钟--- *

   //将 DCO 频率设置为8MHz
   CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_3);

   //将 MCLK、SMCLK 和 ACLK 配置为 DCOCLK 的源
   CS_initClockSignal (CS_ACLK、CS_DCOCLK_select、CS_Clock_divider _32);

/*------ SPI 初始化--- *

空 EUSCI_B0_GraceInit (空)

   EUSCI_B_SPI_initSlaveParam param ={0};
   param.msbFirst = EUSCI_B_SPI_MSB_FIRST;
   param.clockPhase = EUSCI_B_SPI_PHASE_DATA_Changed_ONFIRST_capted_on_next;
   param.clockPolarity = EUSCI_B_SPI_CLOCKPOLARITY_INACT_LOW;
   param.spiMode = EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_LOW;

   EUSCI_B_SPI_initSlave (EUSCI_B0_BASE、param);

   /*启用 eUSCI SPI */
   EUSCI_B_SPI_ENABLE (EUSCI_B0_BASE);

   EUSCI_B_SPI_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Receive_interrupt);

   /*启用 eUSCI SPI 接收中断*/
   EUSCI_B_SPI_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Receive_interrupt);

/*
 * ==== eUSCI_B0中断服务例程====
 *
#pragma vector=USCI_B0_vector
_interrupt void USCI_B0_ISR_Hook (void)

   /*用户代码开始(部分:USCI_B0_ISR_Hook)*/
   switch (__evo_in_range (UCB0IV、4))
   {
       //Vector 2 - RXIFG
       案例2:
           //USCI_A0 TX 缓冲器准备好了吗?
           G_ReceiveData = EUSCI_B_SPI_receiveData (EUSCI_B0_BASE);
           Ring_buffer_queue (&g_RingBuffer、g_ReceiveData);
           if (g_ReceiveData = type_SYNC_END)
           {
               Ring_buffer_size_t length = ring_buffer_num_items (&g_RingBuffer);
               Timer_B_STOP (timer_B0_BASE);
               Ring_buffer_dequeue_arr (&g_RingBuffer、(char *) g_SPI_RxBuffer、长度);
               U8 CRC = g_SPI_RxBuffer[length - 2];
               while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_SPI_Transmit 中断));
               {
                   //将 CRC 数据发送到 SIMCOM
                   EUSCI_B_SPI_transmitData (EUSCI_B0_BASE、CRC);
               }
               messageParser (g_SPI_RxBuffer、长度);
           }
           //printf ("recv %c"、g_ReceiveData);
           中断;

       默认值:break;
   }
   /*用户代码结束(部分:USCI_B0_ISR_Hook)*/

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

    我在器件勘误表中没有发现任何类似的问题。 A 模块复位时、SPI 通信线路会发生什么情况? CLK 或 CS 线路的任何波动都可能导致通信问题。 您应该尝试使用3引脚从模式来查看问题是否与复位期间 UCBSTE 引脚变为低电平有关、如果是这种情况、那么您可能需要考虑在这条线上添加一个弱上拉电阻。 否则、您可能需要为 A 模块提供额外的 GPIO 连接、以向 MSP430FR5739指示它需要复位 eUSCI_B 模块。

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

    您好、Ryan、

    感谢您的回复!

    A 模块复位时、SPI 通信线路会发生什么情况?

    [回复]:我认为与第一次运行和复位时间相比是相同的。

    2.您应该尝试使用3引脚从模式

    [回复]:我厌倦了3引脚 Salve 模式、但仍然有问题(正常运行、但如果 A 模块重启、无 MOSI 数据中断)。

    我已经尝试了很多次来解决这个问题、我发现在 A 模块重新启动后、MSP430FR5739 SPI 再次初始化、通信将再次正常。 我不知道为什么? 这是否意味着 Slaver (MCU)应该在主器件(A-module)之后进行 SPI 初始化、否则 SPI 通信将失败?

    我将介绍我的测试、以了解更多详细信息。

    1) 1) A 模块启动、然后初始化 SPI、然后在 A 模块初始化后初始化 MSP430FR5739 ini SPI。 A 模块通过 SPI 向 MSP430FR5739发送数据、通信正常。

       A-module Restart (因为它重新启动、所以 A-module 将初始化 SPI)、但目前、MSP430FR5739不进行初始化、因为它未重新启动、现在 A-module 通过 SPI 向 MSP430FR5739发送数据、通信失败。

    2) A 模块启动、然后初始化 SPI、然后在 A 模块初始化后初始化 MSP430FR5739 ini SPI。 A 模块通过 SPI 向 MSP430FR5739发送数据、通信正常。

      A-module Restart (因为它会重新启动、所以 A-module 会初始化 SPI)、MSP430FR5739会在 A-module 之后执行初始化。 通信仍然正常。

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

    至少我们已确认第四个引脚(SS/CS)不是问题所在。 我仍然怀疑、当 A 模块复位(电平切换或其他)时、SPI CLK 或 MISO 线路会发生什么情况、可以使用一些示波器屏幕截图来研究。 任何意外操作都可能会使 MSP430的 SPI 状态机混淆、使其在复位前无法进一步响应。 您可以检查 UCB0STATW 寄存器以查看是否设置了任何错误标志、或者总线是否比预期的时间长。

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

    您好、Ryan、

    从您的说明中、我能否理解、如果 MSP430 (Slaver)仅首次初始化 SPI、那么即使 A 模块(主器件)在 MSP430初始化后多次初始化 SPI、SPI 通信也应该正常?

    例如、

    A 模块初始化 SPI,然后 MSP430初始化 SPI ------ >通信正常

    2.保持上述状态,然后重新启动 A 模块初始化 SPI (但 MSP430不会初始化,因为1个步骤已经完成了)----- >通信是否正常?

    BR、

    Treacy

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

    只要 A 模块 SPI 初始化不会对 CLK 线路产生不利影响(即切换)或使 MSP430与 UCxSTE 线路保持在非活动状态、SPI 通信就应该保持不变。 发生 A 模块复位时、SPI 线路的一些示波器或逻辑分析仪屏幕截图将更深入地介绍当前的问题。

    此致、
    Ryan