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/MSP430G2553:USCI (SPI)中断和计时器中断

Guru**** 2504265 points
Other Parts Discussed in Thread: MSP430G2553, CC430F6137

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/609321/ccs-msp430g2553-usci-spi-interrupt-and-timer-interrupt

器件型号:MSP430G2553
主题中讨论的其他器件: CC430F6137

工具/软件:Code Composer Studio

您好!

这可能也是初学者、我自己的一个有趣主题。

我正在尝试在 CC430f6137 (主器件)和 MSP430g2553 (从器件)之间构建 SPI 通信。

下、我获得了两个 MSP430g2553之间的"SPI 状态机"、经过一些修改、我简化了 CC430f6137和 MSP430g2553之间的状态机、

它适用于某些指定的默认字符串。

MSP430g2553用于从传感器获取数据、并通过 SPI 将数据发送到 CC430f6137。

我的问题是、

在 MSP430g2553中、我使用另一个计时器中断来处理我的传感器、而不是根据 SPI 发送数据的默认字符串、

在开始部分、CC430f6137会得到合适的字符串、如

价格:004.3000
值:000.1554
比率:0004.300
值:0000.154
比率:0004.400
值:0000.143

但几秒钟后、我得到一些类似的字符串

速率:€7Ÿÿïþ μ A
值:çy·õ~ùÓ μ V
速率:Ííø¿¿°½ μ s
值:Ñ·ûøþýëZ μ V
速率:˜ù¿½Þ¶ù μ A
值:ý×þôÎæ、

我正在搜索一种方法来解决 USCI 中断和计时器中断之间的冲突。

我们将感谢您提出任何想法和建议。

提前感谢您。

--齐宾

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

    它听起来像是您在发送数据后通过 PC 上的命令终端显示数据。 如果是这种情况、则需要在显示数据之前将数据转换为 ASCII 字符。 要执行此操作的程序可以在任一器件上执行、只需在将其发送到 PC 之前完成即可。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jace:
    感谢您的回复。 是的、我已经将浮点值转换为字符串、而诸如 RATE:004.3000 Value:000.1554的值正是我需要的数据、但后来结果就像灾难。 我想知道如何正确地使用每个单个字符进行通信、我不知道延迟时间应该是多长、两个单字节传输之间的延迟时间。
    如果有人以前遇到过这样的问题、请您与我分享一下。

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

    此外、我还尝试了 MSP430g2553和 CC430f6137 (主器件)之间的 SPI 通信、两侧 I 都使用了 USCI ISR、没有时间中断

    通信运行良好、具有良好的串式信息传输。

    下面是从器件 MSP430g2553的一些代码、在 main()中、USCI (SPI) ISR 执行了部分跨任务 FSM、我认为 USCI ISR 和计时器 ISR 之间的冲突是问题的关键、我对此没有太多经验、 我仍在搜索解决方案。

    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    init_SMS50 ();// init clk、比较器、coresponding 引脚
    init_clk();
    initspi();
    
    _bis_SR_register (GIE);
    
    while (1)
    {
    _NO_OPERATION ();
    }
    }//
    
    周期计数器
    #pragma vector=TIMER0_A0_vector
    __interrupt void Timer0_A0_Compare (void)
    {TA0CCTL0 &=~CCIFG;//清除中断标志
    
    COMP_OUT = BIT0 & CACTL2;//获取比较器输出
    P2OUT = BIT0+~~
    COMP ++(NOCC0+++);
    // NOCC+ INC 2.0 = BIT_OUT = BINOCC++(INC ++++++= NOCC+++= NOCC+= NOCC+++= NOCC+= NOCC+//incrment No1 if Q:high
    
    if (NOC == measure_cycles)
    {
    Ratio =(float) 100*No1/NOC;//在缓冲区中保存比率[%]
    NOC = 0;
    No1 = 0;
    }
    
    
    
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icr_ void)
    #pragma ICRx_
    n_0_ interrupt
    
    
    
    (void 0ICRx_ vector (n_ICRx_ vector)(void 0ICRx_ n_isr)(void 0_isr)#prager_isr)(void 0_isr)#pragma (n_in_in_in_isr)_isr = n_inu_inu_inu_in_
    #endif
    {
    uca0_Rx_val = UCA0RXBUF;
    switch (SlaveMode)
    {
    case RX_REG_ADDRESS_MODE://prapare for tranmission
    TransmitIndex = 0;
    if (uca0_Rx_val = MOUSE_RATE)
    {
    TXByteCtr = RATE_LENGTH;
    CopyArray (rate、TransmitTransmitBuffer =
    
    0)= TransmitTransmitTransmitTransmitTranslength
    
    
    
    ;TX+
    
    
    
    
    = TransmitTransmitTransdate_TransmitTransmitTransdate_Translength;TX+= TransmitTransmitTransmitTransmitTransmitTransmitTransdate_Transdate_TransmitTransdate_Transdate_Transdate_Transdate_Transdate_Transdate_Transdate_Transdure+;TransmitTransmitTransmitTransmitTransdate_Transdate_Transdate_Transdate_Transdate_Transdate_Transdate_Transd
    if (TXByteCtr > 0)
    {
    SendUCA0Data (TransmitBuffer[TransmitIndex++]);
    TXByteCtr -;
    }
    if (TXByteCtr = 0)
    {
    SlaveMode = IDLE_MODE;
    }
    break;
    case IDLE_MODE:
    SlaveMode = RX_REG_ADDRESS_MODE;
    break;
    default:break;default:break
    ;}
    
    

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

    在 RX_REG_ADDRESS_MODE 中、如果您接收到除 MOISE_RATE 或 MOISY_VALUE 以外的任何内容、TxByteCtr 将变为"负"(0xFFFF)、您将保持在 TX_DATA_MODE 中并发送出存储器中接下来的65535个字节、这将与症状匹配。 我建议您在 if()/elseif()中添加一个"else break;"。

    这怎么可能发生? 一种可能是计时器 ISR 中的浮点除法会导致 SPI 溢出、因此会干扰 Rx 字节序列。

    未经请求:"P2OUT = BIT0 &(~COMP_OUT);"看起来可疑、因为它将除 BIT0之外的 P2OUT 中的所有位清零。 也许这是有意的、但它看起来不是这样。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruce、
    我听从了你的建议,在 if()/elseif()之后添加了“else break”,现在奇怪的字符串从未出现。
    正如您提到的" P2OUT = BIT0&(~COMP_OUT);"、我需要寄存器 CACTL2的第一个字节、这是比较器的输出、我需要转换比较器输出的 PIN2.0并使用它作为电路的反馈。
    感谢您的建议、非常有帮助。