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; } }
我的想法已经用完了。 也许有人有想法、或者能给我一些关于我可以尝试的技巧。 如果需要更多信息、我当然会尽快提供。
您好!
我能看到关于错误数据的波形吗?
我认为这可能是时钟、CS 和数据的时序误差造成的。
此致、
Zoey
不幸的是、我目前没有图片。 当问题发生时、我会获取一个并与您分享。
在左侧、是出错期间的图像;在右侧、是 MSP430正确接收所有内容时的图像。
很抱歉、左侧图像仍然是0xBC、所以我想确认是否只有 MCU 会收到错误的数据、逻辑分析会收到正确的数据。
不幸的是、这是我所面临的问题。 根据逻辑分析仪、数据完全正确、但在某个时刻、MCU 决定不正确地解释数据并将0xBC 转换为0x78。
主机发送的频率如何?
该延迟(200us?) 在读取 RXBUF 之前、有一个位需要考虑。 如果主器件 在此期间发送另一个字节、我很确信您会得到这个字节。
如果你确实需要在 ISR 内部进行延迟、我建议你在做之前先读取 RXBUF。
主设备会在我按下按钮时发送命令。 两字节电报之间的时间为1.2ms。 我把200微秒移到了一个计时器中、以便 SPI 中断不会被延迟。
此外、我在端口2.0上将 CS 线路指定为中断、并在引脚变为高电平后复位 SPI 模块。 这导致问题发生得更快。 同样在我看来、当主设备发送某些内容、而从设备也想要发送某些内容时、问题发生的速度会更快。
我现在已经发现、当错误发生时、SPI 中断会在第7个时钟上升沿之后触发。 当它工作时、它按预期运行、并在第8个上升沿后触发。 我无法解释为什么会发生变化。
有一个第8个时钟边沿不是使用逻辑分析仪捕获的、但 SPI 端口是捕获的。 可能就这么早、就解释了位移结果。
鉴于您对数据的可能依赖性的提示、我怀疑 SPI 端口在 STE 置位后启用其 SOMI 驱动程序的时间左右。
遗憾的是、我在示波器上或逻辑分析仪的模拟值中未看到该附加时钟。 我现在已经发现以下情况始终发生在'SPI'中断触发器(在第8个上升沿之后)和'SPI'中断触发器(在第7个上升沿之后)'之间:
主器件发送两个字节、暂停24微秒、而从器件忙、因此它不会立即触发 SPI 中断、而是在稍后触发。 在第二个字节之后、它不再触发中断、从那时起、所有后续传输都始终在第七个时钟上触发中断。
您似乎是在使用 STE 信号来帧字节。 在 MSP430上则不执行该操作。 当 STE 被禁用时、它只是暂停 SPI 端口。 当它再次生效时、移位寄存器将从停止的位置拾取。
这与我通常使用传感器和 SPI 接口看到的完全不同。
不确定从器件正忙且未产生中断的具体含义。 当字节到达时、它将设置 RXIFG。 如果代码正忙于执行其他操作、而在下一个字节到达之前未读取 RXBUF、则数据将丢失。 并设置溢出标志。