工具与软件:
我使用 MSP430F5503的 SPI 作为 UCB1接口上的从器件、并进行以下配置。
UCB1IFG &= ~UCRXIFG; UCB1CTL1 = UCSWRST; // Enable SW reset - Starts config mode UCB1CTL0 = UCSYNC + UCCKPH + UCMODE_2; UCB1RXBUF = 0x00; UCB1TXBUF = 0x00; UCB1CTL1 &= ~UCSWRST; // **Initialize USCI state machine** - restart usci with new settings _NOP(); UCB1IE |= UCRXIE ; // UCB1 RX & TX Interrupt enable
程序启动时、SPI 正常工作、发送和接收功能正常。 按预期运行。 勘误表中的 USCI40错误也不会发生、并且作为从器件发送不受影响。
在无限期(有时是2小时、有时是1天)之后、微控制器会停止通过 SPI 正确接收数据。 我已经使用逻辑分析仪检查了这一点、如下所示:
但是、微控制器接收的不是0xBC、而是0x78二进制、而是0b1011 1100、它得到的值是0b0111 1000。 您可以看到字节突然向左移动了一位。 SPI 复位无济于事;只需重启 MSP430即可解决问题。
通过 SPI (即 TX)进行传输仍有效。
在下面、我再次添加了 SPI 中断的代码。 也许我已经在这里犯了一个重大错误。
#pragma vector=USCI_B1_VECTOR __interrupt void USCI_B1_interrupt(void) { switch(__even_in_range(UCB1IV,4)) { case 0: break; // Vector 0 - no interrupt case 2: ////////////////////////// //// SPI RX Interrupt //// ////////////////////////// // LPM0_EXIT; if(knx_txstate != KNX_TXSTATE_IDLE && knx_txstate != KNX_TXSTATE_WAIT) { __delay_cycles(200 cyclesPerUs); ncn51_tx_nextbyte(true); } else { UCB1TXBUF = 0x00; } // Byte received, read and clear flag char rxbyte; rxbyte = UCB1RXBUF; if(rxbyte == 0xBC){ knx_txstate = KNX_TXSTATE_WAIT; } LED2_ON; // store into ringbuffer if(ringbufferIsFull(&spi_rx_buf) || (utilNormalizeOverflowDiffInt(TA0R, lastReceive) < 1000 ticksPerUs) && knx_txstate != KNX_TXSTATE_IDLE){ _NOP() } else{ lastReceive=TA0R; ringbufferPushElement(&spi_rx_buf,(unsigned char *) &rxbyte); } break; case 4: ////////////////////////// //// SPI TX Interrupt //// ////////////////////////// default: break; } }
我的想法已经用完了。 也许有人有想法、或者能给我一些关于我可以尝试的技巧。 如果需要更多信息、我当然会尽快提供。