大家好
我将 MSP430G2313 USCI 配置为 SPI 从设备(POL=0、PH=0、3线、RX 中断启用)、该设备通过可拆卸连接器连接到 SPI 主设备。 当我连接连接器时、SCK 引脚上可能会出现随机噪声、这会将 SPI 移位寄存器置于部分移位状态。
我通过监视 SPI 忙状态(UCB0STAT 和 UCBUSY)来解决此问题。 如果我看到大于~50ms 的繁忙状态,我将假定移位寄存器中有部分移位数据,并且我将通过 UCB0CTL1中的 UCSWRST 位复位 SPI 通道以清除该状态。
我的问题是、在 SPI 复位后、接收到的 SPI 数据似乎被右移一位(即、我的逻辑分析仪显示主器件发送0xA5、但当我进入 RX ISR 时、UCB0RXBUF 为我提供0x52)。 一旦我进入这种状态(UCB0STAT 和 UCBUSY),我就会说我不忙,所以 SPI 硬件似乎不会认为有任何问题。
有一个错误条目 USCI40描述了一个逐位问题、但它仅在 PH=1和 Xmit 上而不是 Recv 时出现。 也许是相关的?
有什么关于我可能出错的想法吗?
谢谢你
Scott
以下是我的初始化代码:
// SPI 设置 UCB0CTL0 = 0b00100001;// pH = 0、pol = 0、MSB 1、8位、 从器件、3引脚 SPI、SYNC/SPI 模式 UCB0CTL1 = 0b00000000;//无复位 SPI UCB0STAT = 0b00000000;//清除任何错误 IE2 |= UCB0RXIE;//启用 Rx 中断
每~8ms 调用一次该函数、以检查是否存在部分移位的数据:
//如果 SPI 卡在部分 xfer 上~50ms,则假设
// SCK 线路上的一些噪声会缓冲并重置传输
bool spiBusy =(UCB0STAT & UCBUSY)!= 0;
if ( spipidBusy ){
if ( SpipidBusy == spipy )
FailCount++;
if (spiFailCount >= 6)
{
spiFailCount = 0;
UCB0CTL1 = 0x01;//重置 SPI
UCB0CTL1 = 0x00;
IE2 |= UCB0RXIE;//重新启用 Rx 中断
}
否则
spiFailCount = 0;
SpiBusy = spipy;