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.

[参考译文] MSP430G2553:SPI (轮询)问题

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/576668/msp430g2553-spi-polling-question

部件号:MSP430G2553

我最近在SPI模式(轮询)下使用G2553时遇到问题
并连接到74HC595移位寄存器。 问题是我不是
正在加载595上的位QA。 我解决了问题
通过更改:while ((IFG2 & UCA0TXIFG)== 0);to:while (IFG2 & UCA0TXIFG == 0);
有人能解释一下两者之间的区别吗?
另外,我注意到:while ((IFG2 & UCA0TXIFG)== 0);似乎在IIC模式下工作
但不在SPI中。

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    命令while ((IFG2 & UCA0TXIFG)== 0);计算UCA0TXIFG的IFG2位是否等于零,while (IFG2 & UCA0TXIFG == 0);计算UCA0TXIFG是否等于零以及与IFG2一起值的操作数,以查看结果是否正确。 前者是评估UCA0TXIFG是否为空并准备使用另一个字符填充的正确方法,但更常被写入为while (!(IFG2和UCA0TXIFG));以提高效率。 UCA0没有I2C模式。 如果使用中断,解决方案是否有效?

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上,我正在使用计时器中断(以及端口中断)来跟踪的位置
    正交编码器(每5毫秒),并使用SPI将位置数据发送至74hc595。 UCA0TXBUF包含在中
    此中断。 我最初使用示波器在SPI上发现的是数据和时钟工作正常
    正确,但负闩锁脉冲(软件生成的)移动了一个时钟脉冲(第7个位置)。
    这将解释为什么我丢失了595的第0位的数据。 将轮询方法更改为
    同时(IFG2 & UCA0TXIFG == 0);将闩锁脉冲移至第8时钟脉冲,程序现在可以工作。
    我确实尝试使用了:while (!(IFG2和UCA0TXIFG));,很抱歉,这也不起作用。
    我使用TI启动板仅几个月,但现在仍在学习如何使用它
    Freescale / NXP用户。

    您对UCA0和I2C的看法是正确的。 我想说UCB0,而while ((IFG2和UCB0TXIFG)==0);
    在我的I2C应用中工作。

    感谢您的解释。
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在锁存脉冲移位行为中,SPI时钟相位和极性设置可能与MSP430 USCI CTL0寄存器上的设置反转。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以使用以下工具使我的程序正常运行 :while (!(IFG2 & UCA0TXIFG));
    我改变了(在软件中)生成74HC595负锁扣脉冲的方式。
    以正确的方式执行此操作还允许发送多个字节。
    我使用示波器验证了脉冲位置是否正确。
    也许我的解决方案可以帮助其他人。
    再次感谢。
    John

    //检查编码器值并每5毫秒更新SPI值
    #pragma vector = Timer1_A0_vector
    中断无效时间1_A0_IRQ (void)


    encoder_2 =(P2IN和0x06);
    //将595输出锁扣拉低
    P1OUT &=~BIT5;
    //将数据发送到移位寄存器
    UCA0TXBUF = SPI_DATA[编码器值];
    //将595输出锁存设置为高
    P1OUT || BIT5;
    //数据缓冲区为空时设置的标志
    while (!(IFG2和UCA0TXIFG));
    }