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.
工具与软件:
我使用 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; } }
我的想法已经用完了。 也许有人有想法、或者能给我一些关于我可以尝试的技巧。 如果需要更多信息、我当然会尽快提供。
我现在已经发现、当错误发生时、SPI 中断会在第7个时钟上升沿之后触发。 当它工作时、它按预期运行、并在第8个上升沿后触发。 我无法解释为什么会发生变化。
有一个第8个时钟边沿不是使用逻辑分析仪捕获的、但 SPI 端口是捕获的。 可能就这么早、就解释了位移结果。
鉴于您对数据的可能依赖性的提示、我怀疑 SPI 端口在 STE 置位后启用其 SOMI 驱动程序的时间左右。
遗憾的是、我在示波器上或逻辑分析仪的模拟值中未看到该附加时钟。 我现在已经发现以下情况始终发生在'SPI'中断触发器(在第8个上升沿之后)和'SPI'中断触发器(在第7个上升沿之后)'之间:
主器件发送两个字节、暂停24微秒、而从器件忙、因此它不会立即触发 SPI 中断、而是在稍后触发。 在第二个字节之后、它不再触发中断、从那时起、所有后续传输都始终在第七个时钟上触发中断。
您似乎是在使用 STE 信号来帧字节。 在 MSP430上则不执行该操作。 当 STE 被禁用时、它只是暂停 SPI 端口。 当它再次生效时、移位寄存器将从停止的位置拾取。
这与我通常使用传感器和 SPI 接口看到的完全不同。
不确定从器件正忙且未产生中断的具体含义。 当字节到达时、它将设置 RXIFG。 如果代码正忙于执行其他操作、而在下一个字节到达之前未读取 RXBUF、则数据将丢失。 并设置溢出标志。