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