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.

[参考译文] MSP430F2618:映射到一个不同的端口后、SPI CLK 不工作

Guru**** 2391415 points
Other Parts Discussed in Thread: MSP430F2618

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1057635/msp430f2618-spi-clk-not-working-after-mapping-to-a-different-port

器件型号:MSP430F2618

您好!

我将以 SPI 主设备的身份运行 MSP430F2618。 该应用程序正在使用 UCB1 (端口5上)、没有问题。 由于要求更改、需要使用第二个 SPI、因此我移植了之前工作的代码;SPI 现在应在端口3 (P3.5 SOMI、P3.4 SIMO、P3.0 CLK)上使用 UCA0。

我更改了所需引脚的定义、更改了 P3SEL 并将每个 UCB1***更改为 UCA0***。 进行这些更改后、SPI 不再工作。 显示正确片选/ STE 模式的 Oszilloscope (使用 P3OUT |=...完成、因此"手动")、但 CLK 线始终处于高电平、不会移动。 MOSI/SIMO 正在输出一些东西、但由于缺少时钟信号、从器件无法响应。

我已经测试了引脚输出、手动切换 CLK 引脚正常工作、因此硬件仍处于运行状态。

我错过了什么吗?

谢谢、此致、

Marius

#define DD_MISO    BIT5 //p3.5                       /**< port for SPI miso */
#define DD_MOSI    BIT4 //P3.4                        /**< port for SPI mosi */
#define DD_SCK     BIT0 //P3.0                         /**< port for SPI clock */
#define DD_SS      BIT3 //P3.3                        /**< port for SPI slave select */


static void spi_init(
    void
) {
    P3SEL |=  DD_MOSI + DD_MISO + DD_SCK;

    UCA0CTL1 |= UCSWRST;      // **Put state machine in reset**

    UCA0BR0 |= 0x00;  
    UCA0BR1 |= 0x00;

    UCA0CTL1 |= UCSSEL_2;
    UCA0CTL0 |= UCCKPH + UCMSB + UCMST ;   
    UCA0CTL1 &= ~UCSWRST;
}



// TX function
static uint8_t spi_txrx_char(
    char cData                                  /**< character to transmit */
) {
    UCA0TXBUF = cData;
    //while (!(IFG2 & UCA0RXIFG)); - this line was removed because no CLK => no answer from the slave
    unsigned char spi_rx = UCA0RXBUF;

    return(spi_rx);
}

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

    您好、Marius、

    我看不到您通过 UCxRXIE 或 UCxTXIE 使能中断的位置。 我将参考 Resource Explorer 上的此标准 SPI 主模式代码示例[链接]以及有关 MSP https://www.ti.com/lit/slaa734上常见串行通信问题解决方案的此应用手册。

    谢谢、

    王国新

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

    您好、Urica、

    我已经尝试使用以下方法、但也没有成功:我不是在代码中使用 IR 例程、而是使用标志(如 while (!(IFG2 & UCA0RXIFG)))

    IE2 |= UCA0RXIE; // => nothing changes
    
    and
    
    IE2 |= UCA0RXIE + UCA0TXIE; // Software is getting stuck in the ISR_trapped

    我还已经检查了上述文档。

    为了进行测试、将所有 UCA0切换回 UCB1并将端口改回3、CLK 立即工作。  

    在我看来、使用端口的辅助功能时出现问题、但我不知道问题可能出在哪里。 已检查数据表中的辅助端口功能选择、并将其与代码示例进行了比较。

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

    > UCA0CTL0 |= UCCKPH + UCMSB + UCMST;

    UCBxCTL0有 UCSYNC=1预置位、但是 UCAxCTL0没有[参考用户指南(SLAU144J)表16-2/3]。 尝试:

    > UCA0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC;

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

    这解决了问题、非常感谢 Bruce!