早上好、
我在尝试修改其他人的代码时遇到了问题。 在本例中、我使用的电路板为 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; }