SPI 在 MSP430 上似乎出现乱码

电器工程 spi msp430
2022-02-05 14:49:57

我正在尝试从连接到 Launchpad 板上的 Bus Pirate 中获取明智的信息(使用 Sparkfun 电缆:橙色连接到 P1.6,黄色连接到 P1.5。这应该是正确的,除非我对 MOSI 和 MISO 感到困惑...)。我没有连接CS,因为我只是使用公共汽车海盗来监视任何东西。

总线盗版设置为SPI,125KHz,时钟极性Idle low,输出时钟沿Active to idle,输入采样相位中间,/CS,输出正常。

在 Launchpad 上,我有一个没有外部晶体的 MSP430G2231。使用 Code Composer Studio,我有以下内容:

#include  "msp430g2231.h"
volatile unsigned char value=0;

#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
    value+=1;
    USISRL=value;
    USICNT=8;
}
void main(void){
    WDTCTL = WDTPW + WDTHOLD;

    BCSCTL1 = CALBC1_1MHZ;                    // Set range
    DCOCTL = CALDCO_1MHZ;
    BCSCTL2 &= ~(DIVS_3);

    USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE;
    USICTL1 |= USIIE;
    USICKCTL = USIDIV_3 + USISSEL_2;
    USICTL0 &= ~USISWRST;
    USISRL=value;
    USICNT = 8;

    __bis_SR_register(LPM0_bits+ GIE);  
}

其中大部分是由各种样本拼凑而成的。在大量阅读数据表之后,似乎 USI 时钟设置为运行在 125KHz(1MHz 的 SMCLK,除以 8),尽管我没有测量范围。

跑步时,我从巴士海盗身上得到了本质上是垃圾的东西。P 在 USI 中断向量的第一行放了一个断点,让它经过了 3 次,所以我应该从总线盗版中得到 0,1,2

0x00(0x00)0x00(0x00)][0x40(0x00)]

让它自由运行,我得到这样的东西:

[0xFF(0x00)][0x3F(0x00)][0x7F(0x00)][0xBF(0x00)][0xC0(0x00)0x00(0x00)][0x40(0x00)0x80(0x00)]

这看起来仍然不像我所期待的那样。

晚上的大部分时间我都在阅读芯片的用户指南,但我仍然很难过。

在写这篇文章时,我发现我可以将 Bus Pirate 用作逻辑分析器(使用 LogicSniffer),并将其设置为这样做。并将程序修改为将 0x55 写入USISRL,并将 更改为USIDIVUSIDIV_4进一步减慢速度,结果如下: 在此处输入图像描述

时钟信号看起来不错,LogicSniffer 报告说它大约是 285KHz……而 MOSI 是……特别的。我希望有一个很好的交替模式,因为我正在写出 0x55,但这不是。

有人对我可能做错了什么有任何想法吗?芯片坏了?还有什么?

编辑:好的,我的白痴数量很少。我没有更改在中断中写入 SPI 的值。这样做会产生预期的模式:

在此处输入图像描述

然而,回到试图写出一个递增的字节让我很垃圾: 在此处输入图像描述

所以,我仍然有一个问题,只是没有我想象的那么大......

编辑 2:多亏了下面的评论,我将以前未连接的 Bus Pirate 电缆上的地线连接到我的电源(Sparkfun 的面包板电源)上。以前,他们共享的最近的地面是我将所有这些设备挂在上面的 USB 集线器。

这消除了运行计数器程序时 MOSI 上的故障,LogicSniffer 现在可以自行正确解码字节: 在此处输入图像描述

监控模式下的总线盗版仍然报告奇怪的结果:

[0x00(0x00)][0x04(0x00)][0x06(0x00)][0x10(0x00)][0x10(0x00)][0x10(0x00)][0x12(0x00)][0x18(0x00)]

它似乎确实能够更好地检测写入的结束(我假设这是方括号分隔的内容),但是解码的数据仍然关闭。我现在不太担心波形看起来更好,但是知道为什么 Bus Pirate 会感到困惑仍然很高兴。

2个回答

MSP430 是一个反转 CPHA 命名约定的 MCU 示例,因此与标准 SPI 描述不同:TI MSP430 使用名称 UCCKPL 而不是 CPOL,其 UCCKPH 是 CPHA 的倒数将两个芯片连接在一起时,请仔细检查时钟相位初始化值,以确保使用正确的设置。

MSP430 USCI SPI时序图

(图片来源:德州仪器 MSP430x5xx 和 MSP430x6xx 系列用户指南,SLAU208,第 37 章

正如@Dirceu 所说,正常约定规定,如果 CPHA = 0,则必须在脉冲的前沿处理接收操作但是,MSP430 以某种方式定义 CKPH 而不是 CPHA,使得 CKPH 与 CPHA 相反。