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.

[参考译文] MSP430F1612:SPI 配置

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1358338/msp430f1612-spi-configuration

器件型号:MSP430F1612

早上好、

我在尝试修改其他人的代码时遇到了问题。 在本例中、我使用的电路板为 MSP430分配了一个。 该板仅使用3根导线(MISO、MOSI 和 SCLK)即可接受 SPI 通信作为从器件。 现在我尝试使用一种非常简单的方法来实施"CS"、其中在用于评估 GPIO 值的 SPI ISR 中包含一个 if 句子。 如果 GPIO = 0、则保存命令并退出中断。 然而、如果 GPIO = 0、SPI 端口被配置为输入 GPIO (否则、MISO 总线被下拉、并且不能连接同一总线上的另外一个从器件)。 我们的想法是每次在 ISR 内将 GPIO = 0时重新配置 SPI。

我尝试过这样做、但从未重新配置过。 它仅首次运行。 然后、如果我将端口配置为输入 GPIO、则无法将其配置为 SPI。

这是正确的方法吗? 我缺少其他东西? 是否有其他方法可以实现它?

提前感谢您。

此致、

莱安德罗

SPI ISR 源代码

//USART1RX Interruption Service Routine
#pragma CODE_SECTION(SPI1_rx, ".m_3c00_200")
#pragma RETAIN(SPI1_rx)
#pragma vector = USART1RX_VECTOR
__interrupt void SPI1_rx(void) {

    IE2   &= ~URXIE1;
    _BIC_SR(GIE);                   // Disable non-maskable interrupts.

    if(P5IN & BIT0){ //P5.0 is HIGH
        P5SEL  = 0x0F;                 // Setup P5 for SPI mode
        U1CTL   = CHAR + SYNC +SWRST;   // 8-bit, SPI, Slave
        U1TCTL  = CKPH + CKPL + STC;    // 3-wire
        ME2     = USPIE1;               // Module enable
        U1CTL  &= ~SWRST;               // SPI enable

        *arrayInPtr = U1RXBUF;
    }
    else{
        P5SEL = 0x00;
        P5DIR = 0xF0;   // P5.0 to P5.3 are assigned to SPI1.
        P5OUT = 0;
    }
    commStatus |= INCOMING_BYTE;

    IE2    |= URXIE1;               // Receive interrupt enable
    _BIS_SR(GIE);                   // Enable non-maskable interrupts.
    IFG2 &= ~URXIFG1;               // Clear ISR flag.

	return;
}

用于配置 SPI 的函数

#pragma CODE_SECTION(turnOnSpi1AsSlave, ".m_3e00_200")
#pragma RETAIN(turnOnSpi1AsSlave)
void turnOnSpi1AsSlave(void){
	P5SEL  |= 0x0F;              	// Setup P5 for SPI mode
	U1CTL   = CHAR + SYNC +SWRST;   // 8-bit, SPI, Slave
	U1TCTL  = CKPH + CKPL + STC; 	// 3-wire
	ME2     = USPIE1;               // Module enable
	U1CTL  &= ~SWRST;               // SPI enable
	IE2    |= URXIE1;               // Receive interrupt enable
	_BIS_SR(GIE); 	    			// Enable non-maskable interrupts.
	return;
}

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

    您好, Leandro

    您可以逐断点调试该代码吗? 代码是否可以在您每次需要时输入中断处理(turnOnSpi1AsSlave)?

    谢谢!

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

    您好 Xiaodong:

    感谢您的及时响应。 是的、我们已经对它进行了调试、每次调用该函数时、程序都会进入它内部。 在将其配置为 SPI 后、也许有必要实施延迟? 我会尝试它。

    此致、

    莱安德罗

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

    一旦您断开(PSEL)引脚、您就不会看到另一个 SPI 中断。 在任何情况下、Rx 中断都太晚。

    我认为通过设置 STC=0、使用4引脚(从器件)模式、USART 将实现您想要的大部分/全部功能。 [参考用户指南(SLAU049F)第14.2.3节]

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

    Bruce、您好!

    感谢您的建议。 然而、硬件是定制电路板、只允许 SPI 通信。 每次中断完成并返回到程序的正常流程时,我都会调用函数 turnOnSpi1AsSlave()。

    调用该函数、我收到了0xBF、但我正在等待0xFB。 在这种情况下、问题可能是字节顺序吗?

    此致、

    莱安德罗

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

    我不确定我是否理解电路板的局限性。 主器件的芯片选择是否已连接到从器件的 P5.0 (=STE1)? 如果是、您应该能够使用4引脚模式。

    尝试使用3引脚+软件实现4引脚(3引脚+ CS)的一个特定危险是每次主器件使/CS (STE1=0)生效时、您的软件都需要识别这个并在主器件为其第一个位计时之前启动 SPI 的一侧; 这可能是一个非常紧张的比赛。 如果从器件在事务中间(即延迟)访问、您可能会看到位移动或位模糊。 (0xFB 位反转为0xDF、因此我不认为是这样。)

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

    谢谢你布鲁斯! 我实施了4引脚模式、错误得到了解决。

    此致、

    莱安德罗